From 5e47bbae2cc6f1dab8cda7bbb07544e749b0da15 Mon Sep 17 00:00:00 2001 From: Luke Schoen Date: Wed, 22 May 2019 09:18:18 +0200 Subject: [PATCH 001/140] docs: Rephrase EnumerableStorageMap comment in Rustdocs (#2647) --- srml/support/src/storage/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs index 426e480f0c..a2747da78b 100644 --- a/srml/support/src/storage/mod.rs +++ b/srml/support/src/storage/mod.rs @@ -332,8 +332,8 @@ impl StorageMap for U where U: hashed::generator::S /// 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; -- GitLab From 5cb4ac17840b5c8178039e446f14d47dd8babe0b Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 22 May 2019 08:45:28 +0100 Subject: [PATCH 002/140] Revert "Allow warnings (#2627)" (#2648) This reverts commit c52d16441b5d9f0afbd44cedab0525b4e6566bbb. --- core/consensus/babe/src/lib.rs | 5 +++-- core/finality-grandpa/src/lib.rs | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 3c720db627..c3d73b6e49 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -533,6 +533,7 @@ impl SlotWorker for BabeWorker whe /// 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, @@ -584,7 +585,7 @@ fn check_header( format!("VRF verification failed") })? }; - + if check(&inout, threshold) { match check_equivocation(&client, slot_now, slot_num, header.clone(), signer.clone()) { Ok(Some(equivocation_proof)) => { @@ -1018,7 +1019,7 @@ mod tests { 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(); diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index f9f2016cc9..9d808bf4d5 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}; -- GitLab From 47ff2c6e02b25c049d924d4068eac05de00a2139 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 22 May 2019 18:01:36 +0200 Subject: [PATCH 003/140] propagate round messages after verification (#2660) --- core/finality-grandpa/src/communication/gossip.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index fd9d30e951..79f98e5bdb 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -690,6 +690,7 @@ impl network_gossip::Validator for GossipValidator match action { Action::Keep(topic, cb) => { self.report(who.clone(), cb); + context.broadcast_message(topic, data.to_vec(), false); network_gossip::ValidationResult::ProcessAndKeep(topic) } Action::ProcessAndDiscard(topic, cb) => { -- GitLab From 1e3fd718a22d2e538fdf58a9a244c37e68ae8453 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 22 May 2019 23:11:38 +0100 Subject: [PATCH 004/140] Remove `As` (#2602) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Start to remove the `As` bound on `SimpleArtithmetic` This just introduces standard numeric bounds, assuming a minimum of `u32`. Also included is a saturating from/into trait allowing ergonomic infallible conversion when you don't care if it saturates. * Remove As from Balances trait * Remove As from Aura module * Remove As from Babe module * Expunge `As` from contract * Council module * Democracy * Finality tracker * Grandpa * First bit of indices * indices * Line lengths * session * system * Staking * Square up all other uses of As. * RHD update * Fix build/test * Remove As trait * line widths * Remove final As ref * Update srml/staking/src/lib.rs Co-Authored-By: Bastian Köcher * Update core/client/src/cht.rs Co-Authored-By: Bastian Köcher * Update core/client/db/src/light.rs Co-Authored-By: Bastian Köcher * Apply suggestions from code review Co-Authored-By: Bastian Köcher * whitespace * Apply suggestions from code review Co-Authored-By: Bastian Köcher Co-Authored-By: André Silva * Bring back u32 check for number on CLI --- Cargo.lock | 1 + core/cli/src/informant.rs | 6 +- core/cli/src/lib.rs | 5 +- core/cli/src/params.rs | 6 +- core/client/db/src/cache/list_cache.rs | 12 +- core/client/db/src/cache/mod.rs | 6 +- core/client/db/src/lib.rs | 37 ++-- core/client/db/src/light.rs | 14 +- core/client/db/src/utils.rs | 36 ++-- core/client/src/cht.rs | 34 ++-- core/client/src/client.rs | 96 ++++++---- core/client/src/in_mem.rs | 14 +- core/client/src/light/call_executor.rs | 4 +- core/client/src/light/fetcher.rs | 26 +-- core/consensus/common/Cargo.toml | 1 + core/consensus/common/src/evaluation.rs | 15 +- core/consensus/rhd/src/lib.rs | 7 +- core/finality-grandpa/src/environment.rs | 4 +- core/finality-grandpa/src/lib.rs | 2 +- core/network/src/blocks.rs | 12 +- core/network/src/protocol.rs | 15 +- core/network/src/sync.rs | 61 ++++--- core/rpc/src/chain/number.rs | 21 ++- core/rpc/src/state/mod.rs | 11 +- core/service/src/chain_ops.rs | 14 +- core/service/src/lib.rs | 7 +- core/service/test/src/lib.rs | 11 +- .../unchecked_mortal_compact_extrinsic.rs | 7 +- .../src/generic/unchecked_mortal_extrinsic.rs | 9 +- core/sr-primitives/src/lib.rs | 58 +++--- core/sr-primitives/src/traits.rs | 170 +++++++++++++----- core/state-machine/src/changes_trie/prune.rs | 3 +- core/test-runtime/wasm/Cargo.lock | 1 + core/transaction-pool/graph/src/pool.rs | 8 +- node-template/runtime/wasm/Cargo.lock | 1 + node/runtime/src/lib.rs | 4 +- node/runtime/wasm/Cargo.lock | 1 + srml/aura/src/lib.rs | 28 ++- srml/babe/src/lib.rs | 10 +- srml/balances/src/lib.rs | 27 +-- srml/contract/src/account_db.rs | 4 +- srml/contract/src/gas.rs | 9 +- srml/contract/src/lib.rs | 52 +++--- srml/contract/src/rent.rs | 9 +- srml/contract/src/tests.rs | 18 +- srml/contract/src/wasm/code_cache.rs | 9 +- srml/contract/src/wasm/env_def/macros.rs | 6 +- srml/contract/src/wasm/prepare.rs | 8 +- srml/contract/src/wasm/runtime.rs | 21 ++- srml/council/src/seats.rs | 14 +- srml/council/src/voting.rs | 8 +- srml/democracy/src/lib.rs | 18 +- srml/finality-tracker/src/lib.rs | 16 +- srml/grandpa/src/lib.rs | 4 +- srml/indices/src/address.rs | 54 +++--- srml/indices/src/lib.rs | 69 ++++--- srml/session/src/lib.rs | 6 +- srml/staking/src/lib.rs | 23 ++- srml/system/src/lib.rs | 9 +- srml/timestamp/src/lib.rs | 22 +-- 60 files changed, 694 insertions(+), 490 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e0c683f24c..9944db924b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4119,6 +4119,7 @@ dependencies = [ "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", diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index 0d100c1963..dd0237b7f8 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -29,7 +29,7 @@ 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 pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExecutor) where @@ -47,7 +47,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 +59,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!( diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 3fd3454e0e..3aa567de66 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, @@ -627,7 +626,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) } @@ -663,7 +662,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( diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 503d8fca32..ab473a304b 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -533,11 +533,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")] @@ -573,7 +573,7 @@ impl_get_log_filter!(ImportBlocksCmd); 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/db/src/cache/list_cache.rs b/core/client/db/src/cache/list_cache.rs index 4d7b4e2e51..3c74ac2d1f 100644 --- a/core/client/db/src/cache/list_cache.rs +++ b/core/client/db/src/cache/list_cache.rs @@ -44,7 +44,9 @@ use std::collections::BTreeSet; use log::warn; use client::error::{Error as ClientError, Result as ClientResult}; -use runtime_primitives::traits::{Block as BlockT, NumberFor, As, Zero}; +use runtime_primitives::traits::{ + Block as BlockT, NumberFor, Zero, Bounded, SaturatedConversion, CheckedSub +}; use crate::cache::{CacheItemT, ComplexBlockId, EntryType}; use crate::cache::list_entry::{Entry, StorageEntry}; @@ -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); } @@ -349,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(()), diff --git a/core/client/db/src/cache/mod.rs b/core/client/db/src/cache/mod.rs index e4e23a5ca1..d8ffaea723 100644 --- a/core/client/db/src/cache/mod.rs +++ b/core/client/db/src/cache/mod.rs @@ -25,7 +25,7 @@ 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, Zero}; +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, db_err}; @@ -36,7 +36,7 @@ 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)] @@ -166,7 +166,7 @@ fn get_cache_helper<'a, Block: BlockT>( cache, }, ), - As::sa(PRUNE_DEPTH), + PRUNE_DEPTH.into(), best_finalized_block.clone(), ) }) diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index a7d7935278..0e65e17f8d 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, UniqueSaturatedFrom, UniqueSaturatedInto +}; use runtime_primitives::BuildStorage; use state_machine::backend::Backend as StateBackend; use executor::RuntimeInfo; @@ -446,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())); } @@ -477,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 @@ -770,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; @@ -781,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") }; @@ -865,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); @@ -978,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()); @@ -1126,9 +1129,9 @@ impl client::backend::Backend for Backend whe 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() { @@ -1138,7 +1141,7 @@ impl client::backend::Backend for Backend whe || 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::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; @@ -1150,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) @@ -1182,7 +1185,7 @@ 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))) @@ -1196,7 +1199,7 @@ impl client::backend::Backend for Backend whe } 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> { diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index 39817140c6..02525455ba 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}; @@ -32,7 +33,8 @@ 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, EntryType as CacheEntryType}; use crate::utils::{self, meta_keys, Meta, db_err, open_database, @@ -271,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, @@ -283,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, @@ -530,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 diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index b51faae6de..eec476f40e 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, SaturatedConversion, 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::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( diff --git a/core/client/src/cht.rs b/core/client/src/cht.rs index 8002f52b6f..42b4654d34 100644 --- a/core/client/src/cht.rs +++ b/core/client/src/cht.rs @@ -29,7 +29,12 @@ use hash_db; 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}; @@ -183,7 +188,7 @@ 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(ClientError::Backend(format!( "Cannot compute CHT root for the block #{}", block)).into() @@ -198,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()), )?; } @@ -210,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()), )?; } @@ -233,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( - ClientError::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(), @@ -245,7 +253,10 @@ fn build_pairs( if pairs.len() as u64 == cht_size { Ok(pairs) } else { - Err(ClientError::MissingHashRequiredForCHT(cht_num.as_(), hash_number.as_())) + Err(ClientError::MissingHashRequiredForCHT( + cht_num.saturated_into::(), + hash_number.saturated_into::() + )) } } @@ -256,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. @@ -270,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 257f120d72..5b849e1352 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -35,8 +35,9 @@ use consensus::{ 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::{ @@ -82,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. @@ -146,13 +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>; + 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,11 +251,15 @@ 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) } @@ -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![]), @@ -380,7 +396,8 @@ impl Client where /// 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. @@ -419,7 +436,11 @@ impl Client where /// 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) @@ -431,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>)> { + 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)) } @@ -460,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::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))) } @@ -480,20 +506,20 @@ 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::>()) + .and_then(|r| r.map(|r| r.map(|(block, tx)| (block.saturated_into(), tx))).collect::>()) .map_err(|err| error::Error::ChangesTrieAccessFailed(err)) } @@ -543,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() ); } @@ -563,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()), }; @@ -573,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, @@ -583,7 +613,7 @@ 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::Error::ChangesTrieAccessFailed(err)))?; @@ -628,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) @@ -777,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); @@ -1201,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; @@ -1224,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)?, diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index 0050cb9110..558643e887 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -21,8 +21,10 @@ 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}; use state_machine::{self, InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId}; @@ -619,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 + ); } } @@ -668,7 +674,7 @@ where } fn revert(&self, _n: NumberFor) -> error::Result> { - Ok(As::sa(0)) + Ok(Zero::zero()) } } diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 8f90aaf54e..a45a166674 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -26,7 +26,7 @@ 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 runtime_primitives::traits::{One, Block as BlockT, Header as HeaderT}; use state_machine::{ self, Backend as StateBackend, CodeExecutor, OverlayedChanges, ExecutionStrategy, create_proof_check_backend, @@ -444,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 ff6d3c5c45..29fd6f4c39 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -24,7 +24,10 @@ use futures::IntoFuture; use hash_db::{HashDB, Hasher}; use parity_codec::Encode; use primitives::{ChangesTrieConfiguration, convert_hash}; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, Hash, HashFor, 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, read_child_proof_check}; @@ -288,14 +291,16 @@ 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(|pairs| pairs.into_iter().map(|(b, x)| + (b.saturated_into::>(), x) + ).collect()) .map_err(|err| ClientError::ChangesTrieAccessFailed(err)) } @@ -438,7 +443,7 @@ impl FetchChecker for LightDataChecker 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, } @@ -446,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() }; diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index 58ea5a1b0a..4031830108 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -13,6 +13,7 @@ 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-timer = "0.2" diff --git a/core/consensus/common/src/evaluation.rs b/core/consensus/common/src/evaluation.rs index 48016b1e94..7f1f527042 100644 --- a/core/consensus/common/src/evaluation.rs +++ b/core/consensus/common/src/evaluation.rs @@ -19,11 +19,13 @@ use super::MAX_BLOCK_SIZE; use parity_codec::Encode; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, One, CheckedConversion}; use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, impl_extract_backtrace, impl_error_chain_kind, bail}; -type BlockNumber = u64; +// 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; error_chain! { errors { @@ -37,7 +39,7 @@ error_chain! { } WrongNumber(expected: BlockNumber, got: BlockNumber) { description("Proposal had wrong number."), - display("Proposal had wrong number. Expected {}, got {}", expected, got), + display("Proposal had wrong number. Expected {:?}, got {:?}", expected, got), } ProposalTooLarge(size: usize) { description("Proposal exceeded the maximum size."), @@ -72,8 +74,11 @@ pub fn evaluate_initial( )); } - 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() { + bail!(ErrorKind::WrongNumber( + parent_number.checked_into::().map(|x| x + 1), + (*proposal.header().number()).checked_into::() + )); } Ok(()) diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index 0afe10ffce..ca4b9120eb 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; @@ -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/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index cec64b254c..564b7630c4 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, BlockNumberToHash, + Block as BlockT, Header as HeaderT, NumberFor, One, Zero, BlockNumberToHash, }; use substrate_primitives::{Blake2Hasher, ed25519, H256, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; @@ -669,7 +669,7 @@ where &*self.inner, &self.authority_set, &self.consensus_changes, - Some(As::sa(self.config.justification_period)), + Some(self.config.justification_period.into()), hash, number, (round, commit).into(), diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 9d808bf4d5..53dd9d2a57 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -157,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. diff --git a/core/network/src/blocks.rs b/core/network/src/blocks.rs index 60c6886f09..d693afba17 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/protocol.rs b/core/network/src/protocol.rs index 62c5f508db..cd7a14bdbb 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -19,7 +19,10 @@ use network_libp2p::PeerId; use primitives::storage::StorageKey; use consensus::{import_queue::IncomingBlock, import_queue::Origin, BlockOrigin}; use runtime_primitives::{generic::BlockId, ConsensusEngineId, Justification}; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, NumberFor, Zero}; +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, @@ -572,9 +575,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) @@ -716,9 +719,9 @@ 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 { 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); diff --git a/core/network/src/sync.rs b/core/network/src/sync.rs index 7358672231..fdd36a024d 100644 --- a/core/network/src/sync.rs +++ b/core/network/src/sync.rs @@ -40,7 +40,10 @@ use consensus::{BlockOrigin, import_queue::{IncomingBlock, SharedFinalityProofRe use client::error::Error as ClientError; use crate::blocks::BlockCollection; use crate::sync::extra_requests::ExtraRequestsAggregator; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor, Zero, CheckedSub}; +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; @@ -204,7 +207,7 @@ 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, } } @@ -251,7 +254,7 @@ impl ChainSync { protocol.report_peer(who.clone(), i32::min_value()); protocol.disconnect_peer(who); }, - (Ok(BlockStatus::Unknown), b) if b == As::sa(0) => { + (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); @@ -269,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), _) => { @@ -312,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)) } }, @@ -339,7 +348,7 @@ 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)) }, } @@ -372,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 { @@ -418,7 +427,7 @@ impl ChainSync { 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.clone(), GENESIS_MISMATCH_REPUTATION_CHANGE); protocol.disconnect_peer(who); @@ -675,7 +684,7 @@ impl ChainSync { pub(crate) fn on_block_announce(&mut self, protocol: &mut Context, who: PeerId, hash: B::Hash, header: &B::Header) { let number = *header.number(); debug!(target: "sync", "Received block announcement with number {:?}", number); - if number <= As::sa(0) { + if number.is_zero() { warn!(target: "sync", "Ignored invalid block announcement from {}: {}", who, hash); return; } @@ -699,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 } @@ -769,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(); @@ -839,7 +848,7 @@ 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_block_request(who, request); diff --git a/core/rpc/src/chain/number.rs b/core/rpc/src/chain/number.rs index 2e5af190ea..7983ac6c78 100644 --- a/core/rpc/src/chain/number.rs +++ b/core/rpc/src/chain/number.rs @@ -15,6 +15,7 @@ // along with Substrate. If not, see . use serde::Deserialize; +use std::{convert::TryFrom, fmt::Debug}; use primitives::U256; use runtime_primitives::traits; @@ -34,30 +35,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 { - let num: u64 = match self { - NumberOrHex::Number(n) => n.as_(), + 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 { - return 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 { - 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 > u32::max_value() as u64 { - Err(format!("`{}` > u32::max_value(), the max block number is u32.", num)) - } else { - Ok(traits::As::sa(num)) + 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/state/mod.rs b/core/rpc/src/state/mod.rs index 4cb7a3fbd8..0f87faa7a7 100644 --- a/core/rpc/src/state/mod.rs +++ b/core/rpc/src/state/mod.rs @@ -33,7 +33,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}; @@ -229,7 +232,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, @@ -281,7 +284,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(()), @@ -293,7 +296,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) diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index 9f39e8088e..4df3b06cdf 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(()) } @@ -202,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/lib.rs b/core/service/src/lib.rs index 2ed9348e52..98a77b68b4 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -40,7 +40,7 @@ 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}; @@ -162,7 +162,10 @@ impl Service { let version = config.full_version(); info!("Highest known block at #{}", chain_info.best_number); - telemetry!(SUBSTRATE_INFO; "node.start"; "height" => chain_info.best_number.as_(), "best" => ?chain_info.best_hash); + 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( diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index b0ed0c0fc1..a0f37709bd 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -36,7 +36,6 @@ use service::{ }; 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}; @@ -229,7 +228,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"); @@ -249,7 +248,7 @@ where 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(); @@ -265,7 +264,7 @@ 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"); @@ -277,7 +276,7 @@ pub fn consensus(spec: FactoryChainSpec, authorities: Vec) 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![]); @@ -285,6 +284,6 @@ pub fn consensus(spec: FactoryChainSpec, authorities: Vec) 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-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs index ea9dad2a50..36e17fc277 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); diff --git a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs index a91f4461ff..7f92b20edd 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); diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index bdecfe8981..05938a6a82 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -29,8 +29,7 @@ pub use serde; #[cfg(feature = "std")] pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; -use rstd::prelude::*; -use rstd::ops; +use rstd::{prelude::*, ops}; use substrate_primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; use codec::{Encode, Decode}; @@ -38,6 +37,8 @@ use codec::{Encode, Decode}; pub mod testing; pub mod traits; +use traits::{SaturatedConversion, UniqueSaturatedInto}; + pub mod generic; pub mod transaction_validity; @@ -159,27 +160,30 @@ impl Permill { impl ops::Mul for Permill where - N: Clone + traits::As + ops::Rem + ops::Div - + ops::Mul + ops::Add, + N: Clone + From + UniqueSaturatedInto + ops::Rem + + ops::Div + ops::Mul + ops::Add, { type Output = N; fn mul(self, b: N) -> Self::Output { - let million = >::sa(1_000_000); - let part = >::sa(self.0 as u64); + 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 u64 - let rem_u64: u64 = rem.as_(); + // `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 fits into u64 - let rem_multiplied_u64 = rem_u64 * self.0 as u64; + // `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; - let rem_multiplied_divided_u64 = rem_multiplied_u64 / 1_000_000; + // `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 - traits::As::sa(rem_multiplied_divided_u64) + rem_multiplied_divided_u32.into() }; (b / million) * part + rem_multiplied_divided @@ -248,27 +252,30 @@ impl Perbill { impl ops::Mul for Perbill where - N: Clone + traits::As + ops::Rem + ops::Div - + ops::Mul + ops::Add + N: Clone + From + UniqueSaturatedInto + ops::Rem + + ops::Div + ops::Mul + ops::Add, { type Output = N; fn mul(self, b: N) -> Self::Output { - let billion = >::sa(1_000_000_000); - let part = >::sa(self.0 as u64); + 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 u64 - let rem_u64: u64 = rem.as_(); + // `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 fits into u64 - let rem_multiplied_u64 = rem_u64 * self.0 as u64; + // `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; - let rem_multiplied_divided_u64 = rem_multiplied_u64 / 1_000_000_000; + // `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 - traits::As::sa(rem_multiplied_divided_u64) + rem_multiplied_divided_u32.into() }; (b / billion) * part + rem_multiplied_divided @@ -918,13 +925,8 @@ mod tests { } #[test] - #[should_panic] fn per_things_operate_in_output_type() { - use super::Perbill; - - assert_eq!(Perbill::one() * 255_u64, 255); - // panics - assert_ne!(Perbill::one() * 255_u8, 255); + assert_eq!(super::Perbill::one() * 255_u64, 255); } #[test] diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 92c8026340..8906bbf074 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -17,7 +17,7 @@ //! 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, Deserialize, de::DeserializeOwned}; @@ -27,7 +27,7 @@ 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, @@ -157,71 +157,143 @@ 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 { diff --git a/core/state-machine/src/changes_trie/prune.rs b/core/state-machine/src/changes_trie/prune.rs index bbe5bb573b..09e53315a5 100644 --- a/core/state-machine/src/changes_trie/prune.rs +++ b/core/state-machine/src/changes_trie/prune.rs @@ -51,8 +51,7 @@ pub fn prune, H: Hasher, F: FnMut(H::Out)>( min_blocks_to_keep: u64, current_block: &AnchorBlockId, mut remove_trie_node: F, -) -{ +) { // select range for pruning let (first, last) = match pruning_range(config, min_blocks_to_keep, current_block.number) { Some((first, last)) => (first, last), diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index 2a8f1942a3..df89cba455 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -2453,6 +2453,7 @@ dependencies = [ "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", diff --git a/core/transaction-pool/graph/src/pool.rs b/core/transaction-pool/graph/src/pool.rs index 121e3ddf00..78d06eabb5 100644 --- a/core/transaction-pool/graph/src/pool.rs +++ b/core/transaction-pool/graph/src/pool.rs @@ -34,7 +34,7 @@ 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}, }; @@ -138,7 +138,9 @@ 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) => { @@ -337,7 +339,7 @@ impl Pool { 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_(); + .saturated_into::(); let now = time::Instant::now(); let to_remove = { self.ready() diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index cfbf85fbf2..e458c165c0 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -2596,6 +2596,7 @@ dependencies = [ "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", diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index e74db4629d..a285a246cc 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,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: 80, - impl_version: 82, + spec_version: 81, + impl_version: 81, apis: RUNTIME_API_VERSIONS, }; diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index cee874bf50..50037f709e 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -2731,6 +2731,7 @@ dependencies = [ "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", diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index e5eb3674cd..646ad972d0 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -53,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; @@ -154,7 +154,7 @@ 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; + LastTimestamp get(last) build(|_| 0.into()): T::Moment; } } @@ -192,43 +192,41 @@ impl AuraReport { impl Module { /// Determine the Aura slot-duration based on the Timestamp module configuration. - pub fn slot_duration() -> u64 { + pub fn slot_duration() -> T::Moment { // we double the minimum block-period so each author can always propose within // the majority of its slot. - >::minimum_period().as_().saturating_mul(2) + >::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()) } } @@ -265,9 +263,9 @@ impl ProvideInherent for Module { _ => 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/src/lib.rs b/srml/babe/src/lib.rs index e9b5426221..3e36481151 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -22,8 +22,8 @@ pub use timestamp; use rstd::{result, prelude::*}; use srml_support::{decl_storage, decl_module}; -use primitives::traits::As; use timestamp::{OnTimestampSet, Trait}; +use primitives::traits::{SaturatedConversion, Saturating}; #[cfg(feature = "std")] use timestamp::TimestampInherentData; use parity_codec::Decode; @@ -116,10 +116,10 @@ decl_module! { impl Module { /// Determine the BABE slot duration based on the Timestamp module configuration. - pub fn slot_duration() -> u64 { + 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) + >::minimum_period().saturating_mul(2.into()) } } @@ -142,10 +142,8 @@ impl ProvideInherent for Module { _ => return Ok(()), }; - let timestamp_based_slot = timestamp.as_() / Self::slot_duration(); - + 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 { diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 90f774dbf3..9fe93a9d4a 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -155,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}; @@ -167,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 + 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. @@ -181,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 + 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. @@ -236,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() @@ -276,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) @@ -380,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() } @@ -1013,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, diff --git a/srml/contract/src/account_db.rs b/srml/contract/src/account_db.rs index df63ccc479..21f2972893 100644 --- a/srml/contract/src/account_db.rs +++ b/srml/contract/src/account_db.rs @@ -140,10 +140,10 @@ impl AccountDb for DirectAccountDb { for (k, v) in changed.storage.into_iter() { if let Some(value) = child::get_raw(&new_info.trie_id[..], &blake2_256(&k)) { - new_info.storage_size -= value.len() as u64; + new_info.storage_size -= value.len() as u32; } if let Some(value) = v { - new_info.storage_size += value.len() as u64; + new_info.storage_size += value.len() as u32; child::put_raw(&new_info.trie_id[..], &blake2_256(&k), &value[..]); } else { child::kill(&new_info.trie_id[..], &blake2_256(&k)); diff --git a/srml/contract/src/gas.rs b/srml/contract/src/gas.rs index f42b0919f3..1ea5196344 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")?; @@ -248,7 +248,7 @@ pub fn refund_unused_gas( >::mutate(|block_gas_spent| *block_gas_spent += gas_spent); // Refund gas left by the price it was bought at. - let refund = >>::as_(gas_left) * gas_meter.gas_price; + 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); @@ -258,8 +258,7 @@ pub fn refund_unused_gas( /// 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 diff --git a/srml/contract/src/lib.rs b/srml/contract/src/lib.rs index 0cd3b0a325..b9412b3619 100644 --- a/srml/contract/src/lib.rs +++ b/srml/contract/src/lib.rs @@ -94,10 +94,9 @@ use crate::account_db::{AccountDb, DirectAccountDb}; #[cfg(feature = "std")] 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, Zero}; +use runtime_primitives::traits::{Hash, SimpleArithmetic, Bounded, StaticLookup, Zero}; use srml_support::dispatch::{Result, Dispatchable}; use srml_support::{Parameter, StorageMap, StorageValue, decl_module, decl_event, decl_storage, storage::child}; use srml_support::traits::{OnFreeBalanceZero, OnUnbalanced, Currency}; @@ -188,7 +187,7 @@ 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, + pub storage_size: u32, /// The code associated with a given account. pub code_hash: CodeHash, pub rent_allowance: Balance, @@ -199,7 +198,7 @@ pub struct RawAliveContractInfo { pub struct TombstoneContractInfo(T::Hash); impl TombstoneContractInfo { - fn new(storage_root: Vec, storage_size: u64, code_hash: CodeHash) -> Self { + fn new(storage_root: Vec, storage_size: u32, code_hash: CodeHash) -> Self { let mut buf = Vec::new(); storage_root.using_encoded(|encoded| buf.extend_from_slice(encoded)); storage_size.using_encoded(|encoded| buf.extend_from_slice(encoded)); @@ -252,7 +251,8 @@ where } 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; @@ -263,8 +263,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>; @@ -310,10 +310,10 @@ where 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() } } @@ -553,7 +553,7 @@ decl_storage! { 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(): u64; + 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 @@ -576,17 +576,17 @@ 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(10_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. @@ -692,19 +692,19 @@ pub struct Schedule { pub enable_println: bool, } -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_per_topic_cost: Gas::sa(1), - event_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, diff --git a/srml/contract/src/rent.rs b/srml/contract/src/rent.rs index 5466e2553d..aacbb4ab7f 100644 --- a/srml/contract/src/rent.rs +++ b/srml/contract/src/rent.rs @@ -15,7 +15,8 @@ // along with Substrate. If not, see . use crate::{BalanceOf, ContractInfo, ContractInfoOf, Module, TombstoneContractInfo, Trait}; -use runtime_primitives::traits::{As, Bounded, CheckedDiv, CheckedMul, Saturating, Zero}; +use runtime_primitives::traits::{Bounded, CheckedDiv, CheckedMul, Saturating, Zero, + SaturatedConversion}; use srml_support::traits::{Currency, ExistenceRequirement, Imbalance, WithdrawReason}; use srml_support::StorageMap; @@ -75,10 +76,10 @@ fn try_evict_or_and_pay_rent( let fee_per_block = { let free_storage = balance .checked_div(&>::rent_deposit_offset()) - .unwrap_or(>::sa(0)); + .unwrap_or_else(Zero::zero); let effective_storage_size = - >::sa(contract.storage_size).saturating_sub(free_storage); + >::from(contract.storage_size).saturating_sub(free_storage); effective_storage_size .checked_mul(&>::rent_byte_price()) @@ -95,7 +96,7 @@ fn try_evict_or_and_pay_rent( let subsistence_threshold = T::Currency::minimum_balance() + >::tombstone_deposit(); let dues = fee_per_block - .checked_mul(&>::sa(blocks_passed.as_())) + .checked_mul(&blocks_passed.saturated_into::().into()) .unwrap_or(>::max_value()); let dues_limited = dues.min(contract.rent_allowance); diff --git a/srml/contract/src/tests.rs b/srml/contract/src/tests.rs index 4eed6777b4..a14819850e 100644 --- a/srml/contract/src/tests.rs +++ b/srml/contract/src/tests.rs @@ -21,8 +21,8 @@ use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb}; use crate::{ - BalanceOf, ComputeDispatchFee, ContractAddressFor, ContractInfo, ContractInfoOf, GenesisConfig, Module, - RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, TrieIdGenerator, + BalanceOf, ComputeDispatchFee, ContractAddressFor, ContractInfo, ContractInfoOf, GenesisConfig, + Module, RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, TrieIdGenerator, }; use assert_matches::assert_matches; use hex_literal::*; @@ -30,7 +30,7 @@ use parity_codec::{Decode, Encode, KeyedVec}; use runtime_io; use runtime_io::with_externalities; use runtime_primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, H256}; -use runtime_primitives::traits::{As, BlakeTwo256, IdentityLookup}; +use runtime_primitives::traits::{BlakeTwo256, IdentityLookup}; use runtime_primitives::BuildStorage; use srml_support::{ assert_ok, impl_outer_dispatch, impl_outer_event, impl_outer_origin, storage::child, @@ -689,7 +689,7 @@ fn storage_size() { Origin::signed(ALICE), 30_000, 100_000, HASH_SET_RENT.into(), - ::Balance::sa(1_000u64).encode() // rent allowance + ::Balance::from(1_000u32).encode() // rent allowance )); let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4); @@ -719,7 +719,7 @@ fn deduct_blocks() { Origin::signed(ALICE), 30_000, 100_000, HASH_SET_RENT.into(), - ::Balance::sa(1_000u64).encode() // rent allowance + ::Balance::from(1_000u32).encode() // rent allowance )); // Check creation @@ -812,7 +812,7 @@ fn claim_surcharge(blocks: u64, trigger_call: impl Fn() -> bool, removes: bool) Origin::signed(ALICE), 100, 100_000, HASH_SET_RENT.into(), - ::Balance::sa(1_000u64).encode() // rent allowance + ::Balance::from(1_000u32).encode() // rent allowance )); // Advance blocks @@ -848,7 +848,7 @@ fn removals(trigger_call: impl Fn() -> bool) { Origin::signed(ALICE), 100, 100_000, HASH_SET_RENT.into(), - ::Balance::sa(1_000u64).encode() // rent allowance + ::Balance::from(1_000u32).encode() // rent allowance )); // Trigger rent must have no effect @@ -882,7 +882,7 @@ fn removals(trigger_call: impl Fn() -> bool) { Origin::signed(ALICE), 1_000, 100_000, HASH_SET_RENT.into(), - ::Balance::sa(100u64).encode() // rent allowance + ::Balance::from(100u32).encode() // rent allowance )); // Trigger rent must have no effect @@ -916,7 +916,7 @@ fn removals(trigger_call: impl Fn() -> bool) { Origin::signed(ALICE), 50+Balances::minimum_balance(), 100_000, HASH_SET_RENT.into(), - ::Balance::sa(1_000u64).encode() // rent allowance + ::Balance::from(1_000u32).encode() // rent allowance )); // Trigger rent must have no effect diff --git a/srml/contract/src/wasm/code_cache.rs b/srml/contract/src/wasm/code_cache.rs index 0c71fe8cb5..da92272c38 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"); diff --git a/srml/contract/src/wasm/env_def/macros.rs b/srml/contract/src/wasm/env_def/macros.rs index bfb42d19d0..32d02f5abe 100644 --- a/srml/contract/src/wasm/env_def/macros.rs +++ b/srml/contract/src/wasm/env_def/macros.rs @@ -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/prepare.rs b/srml/contract/src/wasm/prepare.rs index 94a38ef588..d780cc1a28 100644 --- a/srml/contract/src/wasm/prepare.rs +++ b/srml/contract/src/wasm/prepare.rs @@ -26,7 +26,7 @@ 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> { /// A deserialized module. The module is valid (this is Guaranteed by `new` method). @@ -38,7 +38,7 @@ struct ContractModule<'a, Gas: 'a> { 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 @@ -85,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 diff --git a/srml/contract/src/wasm/runtime.rs b/srml/contract/src/wasm/runtime.rs index 6327d8f2ce..b6f857269e 100644 --- a/srml/contract/src/wasm/runtime.rs +++ b/srml/contract/src/wasm/runtime.rs @@ -27,7 +27,7 @@ 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. /// @@ -122,24 +122,24 @@ 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)), + .checked_mul(&byte_count.into()), DepositEvent(topic_count, data_byte_count) => { let data_cost = metadata .event_data_per_byte_cost - .checked_mul(&>::sa(data_byte_count)); + .checked_mul(&data_byte_count.into()); let topics_cost = metadata .event_per_topic_cost - .checked_mul(&>::sa(topic_count)); + .checked_mul(&topic_count.into()); data_cost .and_then(|data_cost| { @@ -340,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| { @@ -413,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| { @@ -535,8 +535,7 @@ define_env!(Env, , // 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(()) }, diff --git a/srml/council/src/seats.rs b/srml/council/src/seats.rs index 9ace6227da..fb93157981 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 22b4b9639c..0137cd6d2f 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; diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index b72a3add2e..c2a9b849f6 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,7 +243,7 @@ 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 referenda started so far. pub ReferendumCount get(referendum_count) 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. @@ -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()); } diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index 91beefa66b..2276ad3155 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -26,7 +26,7 @@ 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_none, Trait as SystemTrait}; @@ -34,8 +34,8 @@ 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; @@ -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(); diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs index e9886eddb1..5425ace8bb 100644 --- a/srml/grandpa/src/lib.rs +++ b/srml/grandpa/src/lib.rs @@ -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/indices/src/address.rs b/srml/indices/src/address.rs index c7709e3bec..123b8bca89 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 4a6010f800..509e5c1133 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,15 +94,18 @@ 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) build(|config: &GenesisConfig| { - (0..(config.ids.len() + ENUM_SET_SIZE - 1) / ENUM_SET_SIZE) + (0..((config.ids.len() as u32) + ENUM_SET_SIZE - 1) / ENUM_SET_SIZE) .map(|i| ( - T::AccountIndex::sa(i), - config.ids[i * ENUM_SET_SIZE..config.ids.len().min((i + 1) * ENUM_SET_SIZE)].to_owned(), + 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; @@ -117,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() } @@ -125,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), @@ -140,7 +151,7 @@ impl Module { // PUBLIC MUTABLES (DANGEROUS) fn enum_set_size() -> T::AccountIndex { - T::AccountIndex::sa(ENUM_SET_SIZE) + ENUM_SET_SIZE.into() } } @@ -153,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/session/src/lib.rs b/srml/session/src/lib.rs index 255bb4f647..d13795e4bb 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -116,7 +116,7 @@ #![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; @@ -200,9 +200,9 @@ 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; diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 93bd941092..1901752666 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -247,7 +247,10 @@ use srml_support::traits::{ }; use session::OnSessionChange; use primitives::Perbill; -use primitives::traits::{Convert, Zero, One, As, StaticLookup, CheckedSub, CheckedShl, 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; @@ -396,7 +399,7 @@ type NegativeImbalanceOf = <::Currency as Currency< = (::AccountId, ExtendedBalance); type Assignment = (::AccountId, ExtendedBalance, BalanceOf); -type ExpoMap = BTreeMap::<::AccountId, Exposure<::AccountId, BalanceOf>>; +type ExpoMap = BTreeMap<::AccountId, Exposure<::AccountId, BalanceOf>>; pub trait Trait: system::Trait + session::Trait { /// The staking balance. @@ -432,7 +435,7 @@ 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_parts(60); /// Slash, per validator that is taken for the first time they are found to be offline. @@ -440,7 +443,7 @@ decl_storage! { /// 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 eras. - pub BondingDuration get(bonding_duration) config(): T::BlockNumber = T::BlockNumber::sa(12); + 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. @@ -867,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 @@ -901,8 +908,8 @@ impl Module { Self::reward_validator(v, reward); } Self::deposit_event(RawEvent::Reward(reward)); - let len = validators.len() as u64; // validators length can never overflow u64 - let len = BalanceOf::::sa(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); diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index b009785011..9018b109e8 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -77,8 +77,8 @@ use rstd::prelude::*; #[cfg(any(feature = "std", test))] use rstd::map; use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, One, Bounded, Lookup, - Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, As, CurrentHeight, BlockNumberToHash, - MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup + Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, CurrentHeight, BlockNumberToHash, + MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, SaturatedConversion }; #[cfg(any(feature = "std", test))] use primitives::traits::Zero; @@ -311,7 +311,7 @@ decl_storage! { /// 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. @@ -493,7 +493,8 @@ 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. diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index bc998a8539..24750215d1 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -87,6 +87,7 @@ #![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; @@ -94,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 runtime_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion}; use system::ensure_none; -use rstd::{result, ops::{Mul, Div}, cmp}; use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData}; /// The identifier for the `timestamp` inherent. @@ -252,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 @@ -262,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; @@ -297,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 { -- GitLab From fec0e46bbf16f6f140d9221c43957114db7c094a Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 23 May 2019 10:44:36 +0200 Subject: [PATCH 005/140] Remove TaskExecutor from the API of the informant (#2642) * Remove TaskExecutor from the API of the informant * Fix node-template --- core/cli/src/informant.rs | 11 +++++++++-- node-template/src/cli.rs | 4 ++-- node/cli/src/lib.rs | 4 ++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index dd0237b7f8..5c60229fab 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -32,9 +32,16 @@ use runtime_primitives::generic::BlockId; 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(); @@ -156,8 +163,8 @@ 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 { diff --git a/node-template/src/cli.rs b/node-template/src/cli.rs index f41674631e..cd148f3462 100644 --- a/node-template/src/cli.rs +++ b/node-template/src/cli.rs @@ -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/cli/src/lib.rs b/node/cli/src/lib.rs index cbb0628a91..886c6eef77 100644 --- a/node/cli/src/lib.rs +++ b/node/cli/src/lib.rs @@ -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(); -- GitLab From 25558a732fe59c9c71c9b91ecfdf54691fa9e0e7 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 23 May 2019 11:06:38 +0200 Subject: [PATCH 006/140] Make info! string less ambiguous (#2661) --- core/network-libp2p/src/behaviour.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/network-libp2p/src/behaviour.rs b/core/network-libp2p/src/behaviour.rs index b0eb1a66eb..a180a34064 100644 --- a/core/network-libp2p/src/behaviour.rs +++ b/core/network-libp2p/src/behaviour.rs @@ -355,7 +355,7 @@ where 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 external node address: {}", new_addr); + info!(target: "sub-libp2p", "Discovered new external address for our node: {}", new_addr); } fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { -- GitLab From da947ac95def499c2d731b3a3dfe3f8662477d10 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Thu, 23 May 2019 11:08:20 +0200 Subject: [PATCH 007/140] get rid of refcell, use &mut storage (#2659) --- srml/support/procedural/src/storage/impls.rs | 32 +++++------ .../procedural/src/storage/transformation.rs | 11 ++-- srml/support/src/storage/hashed/generator.rs | 44 +++++++-------- srml/support/src/storage/mod.rs | 54 +++++++++---------- srml/support/src/storage/storage_items.rs | 42 +++++++-------- .../support/src/storage/unhashed/generator.rs | 50 ++++++++--------- 6 files changed, 114 insertions(+), 119 deletions(-) diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs index 39d16edd91..720ed21c24 100644 --- a/srml/support/procedural/src/storage/impls.rs +++ b/srml/support/procedural/src/storage/impls.rs @@ -116,13 +116,13 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Take a value from storage, removing it afterwards. - fn take>(storage: &S) -> Self::Query { + 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::HashedStorage<#scrate::Twox128>>(f: F, storage: &S) -> R { + fn mutate R, S: #scrate::HashedStorage<#scrate::Twox128>>(f: F, storage: &mut S) -> R { let mut val = >::get(storage); let ret = f(&mut val); @@ -212,13 +212,13 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Take the value, reading and removing it. - fn take>(key: &#kty, storage: &S) -> Self::Query { + 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::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &S) -> R { + 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); @@ -349,7 +349,7 @@ 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>)>; @@ -358,7 +358,7 @@ impl<'a, I: Iterator> Impls<'a, I> { /// /// Takes care of updating head and previous head's pointer. fn new_head_linkage>( - storage: &S, + storage: &mut S, key: &#kty, ) -> Linkage<#kty>; @@ -368,7 +368,7 @@ impl<'a, I: Iterator> Impls<'a, I> { /// 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>); } } }; @@ -380,7 +380,7 @@ impl<'a, I: Iterator> Impls<'a, I> { impl<#traitinstance: #traittype, #instance #bound_instantiable> self::#inner_module::Utils<#traitinstance, #instance> for #name<#traitinstance, #instance> { fn remove_linkage>( linkage: self::#inner_module::Linkage<#kty>, - storage: &S, + storage: &mut S, ) { use self::#inner_module::Utils; @@ -415,7 +415,7 @@ impl<'a, I: Iterator> Impls<'a, I> { } fn new_head_linkage>( - storage: &S, + storage: &mut S, key: &#kty, ) -> self::#inner_module::Linkage<#kty> { use self::#inner_module::Utils; @@ -450,7 +450,7 @@ impl<'a, I: Iterator> Impls<'a, I> { 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), @@ -489,7 +489,7 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// 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)); @@ -503,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); @@ -522,7 +522,7 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Mutate the value under a key - fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(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); @@ -643,12 +643,12 @@ impl<'a, I: Iterator> Impls<'a, I> { 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::UnhashedStorage>(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/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index 146210eb0c..933faa6ff9 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -295,7 +295,7 @@ fn decl_store_extra_genesis( use #scrate::codec::{Encode, Decode}; let v = (#builder)(&self); - <#name<#traitinstance, #instance> as #scrate::storage::hashed::generator::StorageValue<#typ>>::put(&v, &storage); + <#name<#traitinstance, #instance> as #scrate::storage::hashed::generator::StorageValue<#typ>>::put(&v, storage); }} }, DeclStorageTypeInfosKind::Map { key_type, .. } => { @@ -305,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::hashed::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); } }} }, @@ -316,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); } }} }, @@ -451,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; - let storage = RefCell::new(r); + let storage = r; #builders - let r = storage.into_inner(); + let r = storage; #scall(r, c, &self); diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs index 12600a9eaf..fb876a2adb 100644 --- a/srml/support/src/storage/hashed/generator.rs +++ b/srml/support/src/storage/hashed/generator.rs @@ -103,25 +103,25 @@ pub trait HashedStorage { } /// 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]); /// 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 { + 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 { + fn take_or_default(&mut self, key: &[u8]) -> T { self.take(key).unwrap_or_default() } @@ -129,12 +129,12 @@ pub trait HashedStorage { fn get_raw(&self, key: &[u8]) -> Option>; /// Put a raw byte slice into storage. - fn put_raw(&self, key: &[u8], value: &[u8]); + 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 std::cell::RefCell<&mut sr_primitives::StorageOverlay> { +impl HashedStorage for sr_primitives::StorageOverlay { fn exists(&self, key: &[u8]) -> bool { UnhashedStorage::exists(self, &H::hash(key).as_ref()) } @@ -143,11 +143,11 @@ impl HashedStorage for std::cell::RefCell<&mut sr_primitive UnhashedStorage::get(self, &H::hash(key).as_ref()) } - fn put(&self, key: &[u8], val: &T) { + fn put(&mut self, key: &[u8], val: &T) { UnhashedStorage::put(self, &H::hash(key).as_ref(), val) } - fn kill(&self, key: &[u8]) { + fn kill(&mut self, key: &[u8]) { UnhashedStorage::kill(self, &H::hash(key).as_ref()) } @@ -155,7 +155,7 @@ impl HashedStorage for std::cell::RefCell<&mut sr_primitive UnhashedStorage::get_raw(self, &H::hash(key).as_ref()) } - fn put_raw(&self, key: &[u8], value: &[u8]) { + fn put_raw(&mut self, key: &[u8], value: &[u8]) { UnhashedStorage::put_raw(self, &H::hash(key).as_ref(), value) } } @@ -177,18 +177,18 @@ pub trait StorageValue { fn get>(storage: &S) -> Self::Query; /// Take a value from storage, removing it afterwards. - fn take>(storage: &S) -> Self::Query; + fn take>(storage: &mut S) -> Self::Query; /// Store a value under this key into the provided storage instance. - fn put>(val: &T, storage: &S) { + fn put>(val: &T, storage: &mut S) { storage.put(Self::key(), val) } /// Mutate this value - fn mutate R, S: HashedStorage>(f: F, storage: &S) -> R; + fn mutate R, S: HashedStorage>(f: F, storage: &mut S) -> R; /// Clear the storage value. - fn kill>(storage: &S) { + fn kill>(storage: &mut S) { storage.kill(Self::key()) } @@ -196,7 +196,7 @@ pub trait StorageValue { /// /// `T` is required to implement `codec::EncodeAppend`. fn append, I: codec::Encode>( - items: &[I], storage: &S + items: &[I], storage: &mut S ) -> Result<(), &'static str> where T: codec::EncodeAppend { let new_val = ::append( storage.get_raw(Self::key()).unwrap_or_default(), @@ -222,10 +222,10 @@ pub trait StorageList { fn items>(storage: &S) -> Vec; /// Set the current set of items. - fn set_items>(items: &[T], storage: &S); + fn set_items>(items: &[T], storage: &mut S); /// Set the item at the given index. - fn set_item>(index: u32, item: &T, storage: &S); + 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; @@ -234,7 +234,7 @@ pub trait StorageList { fn len>(storage: &S) -> u32; /// Clear the list. - fn clear>(storage: &S); + fn clear>(storage: &mut S); } /// A strongly-typed map in storage. @@ -259,20 +259,20 @@ pub trait StorageMap { fn get>(key: &K, storage: &S) -> Self::Query; /// Take the value under a key. - fn take>(key: &K, storage: &S) -> Self::Query; + 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: &S) { + 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: &S) { + 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: &S) -> R; + fn mutate R, S: HashedStorage>(key: &K, f: F, storage: &mut S) -> R; } /// A `StorageMap` with enumerable entries. diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs index a2747da78b..635572c991 100644 --- a/srml/support/src/storage/mod.rs +++ b/srml/support/src/storage/mod.rs @@ -70,17 +70,17 @@ impl HashedStorage for RuntimeStorage { } /// Put a value in under a key. - fn put(&self, key: &[u8], val: &T) { + 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]) { + 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 { + fn take(&mut self, key: &[u8]) -> Option { hashed::take(&H::hash, key) } @@ -88,7 +88,7 @@ impl HashedStorage for RuntimeStorage { hashed::get_raw(&H::hash, key) } - fn put_raw(&self, key: &[u8], value: &[u8]) { + fn put_raw(&mut self, key: &[u8], value: &[u8]) { hashed::put_raw(&H::hash, key, value) } } @@ -104,22 +104,22 @@ impl UnhashedStorage 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) } @@ -127,7 +127,7 @@ impl UnhashedStorage for RuntimeStorage { unhashed::get_raw(key) } - fn put_raw(&self, key: &[u8], value: &[u8]) { + fn put_raw(&mut self, key: &[u8], value: &[u8]) { unhashed::put_raw(key, value) } } @@ -178,21 +178,21 @@ impl StorageValue for U where U: hashed::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, &RuntimeStorage) + U::append(items, &mut RuntimeStorage) } } @@ -244,11 +244,11 @@ impl StorageList for U where U: hashed::generator::StorageList>(index: u32, val: Arg) { - U::set_item(index, val.borrow(), &RuntimeStorage) + U::set_item(index, val.borrow(), &mut RuntimeStorage) } fn get(index: u32) -> Option { @@ -260,7 +260,7 @@ impl StorageList for U where U: hashed::generator::StorageList StorageMap for U where U: hashed::generator::S } 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) } } @@ -444,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 @@ -465,7 +465,7 @@ where KArg2: Borrow, F: FnOnce(&mut Self::Query) -> R { - U::mutate(k1.borrow(), k2.borrow(), f, &RuntimeStorage) + U::mutate(k1.borrow(), k2.borrow(), f, &mut RuntimeStorage) } fn append( @@ -479,7 +479,7 @@ where I: codec::Encode, V: EncodeAppend, { - U::append(k1.borrow(), k2.borrow(), items, &RuntimeStorage) + U::append(k1.borrow(), k2.borrow(), items, &mut RuntimeStorage) } } diff --git a/srml/support/src/storage/storage_items.rs b/srml/support/src/storage/storage_items.rs index 720cac64c5..802965fc27 100644 --- a/srml/support/src/storage/storage_items.rs +++ b/srml/support/src/storage/storage_items.rs @@ -197,12 +197,12 @@ macro_rules! __storage_items_internal { } /// 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::HashedStorage<$crate::Twox128>>(f: F, storage: &S) -> R { + fn mutate R, S: $crate::HashedStorage<$crate::Twox128>>(f: F, storage: &mut S) -> R { let mut val = >::get(storage); let ret = f(&mut val); @@ -256,13 +256,13 @@ macro_rules! __storage_items_internal { } /// Take the value, reading and removing it. - fn take>(key: &$kty, storage: &S) -> Self::Query { + 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::HashedStorage>(key: &$kty, f: F, storage: &S) -> R { + 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); @@ -287,13 +287,13 @@ macro_rules! __storage_items_internal { $($vis)* struct $name; impl $name { - fn clear_item>(index: u32, storage: &S) { + 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) { + 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); } @@ -327,14 +327,14 @@ macro_rules! __storage_items_internal { } /// 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::hashed::generator::StorageList<$ty>>::set_item(i as u32, item, storage)); } - fn set_item>(index: u32, item: &$ty, storage: &S) { + 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); } @@ -351,7 +351,7 @@ macro_rules! __storage_items_internal { } /// Clear the list. - fn clear>(storage: &S) { + fn clear>(storage: &mut S) { for i in 0..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) { $name::clear_item(i, storage); } @@ -383,7 +383,6 @@ macro_rules! __handle_wrap_internal { #[allow(dead_code)] mod tests { use std::collections::HashMap; - use std::cell::RefCell; use super::*; use crate::metadata::*; use crate::metadata::StorageHasher; @@ -398,43 +397,40 @@ mod tests { #[test] fn value() { - let mut overlay = HashMap::new(); - let storage = RefCell::new(&mut overlay); + 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 mut overlay = HashMap::new(); - let storage = RefCell::new(&mut overlay); + 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 mut overlay = HashMap::new(); - let storage = RefCell::new(&mut overlay); + 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()); } diff --git a/srml/support/src/storage/unhashed/generator.rs b/srml/support/src/storage/unhashed/generator.rs index 7e9e5a2199..e6bbb5905f 100644 --- a/srml/support/src/storage/unhashed/generator.rs +++ b/srml/support/src/storage/unhashed/generator.rs @@ -34,66 +34,66 @@ 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(&self, key: &[u8], value: &[u8]); + 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 std::cell::RefCell<&mut sr_primitives::StorageOverlay> { +impl UnhashedStorage for sr_primitives::StorageOverlay { fn exists(&self, key: &[u8]) -> bool { - self.borrow().contains_key(key) + self.contains_key(key) } fn get(&self, key: &[u8]) -> Option { - self.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.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.borrow_mut().remove(key); + fn kill(&mut self, key: &[u8]) { + self.remove(key); } - fn kill_prefix(&self, prefix: &[u8]) { - self.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.borrow().get(key).cloned() + self.get(key).cloned() } - fn put_raw(&self, key: &[u8], value: &[u8]) { - self.borrow_mut().insert(key.to_vec(), value.to_vec()); + fn put_raw(&mut self, key: &[u8], value: &[u8]) { + self.insert(key.to_vec(), value.to_vec()); } } @@ -131,32 +131,32 @@ 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: &S, + storage: &mut S, ) -> Result<(), &'static str> where I: codec::Encode, -- GitLab From eb6d30af2a86606b2bcaa3d86c7651f67752199f Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 23 May 2019 11:28:35 +0200 Subject: [PATCH 008/140] Remove dependency on parity-crypto (#2655) --- .gitlab-ci.yml | 2 + Cargo.lock | 147 ++------------------------------------- core/keystore/Cargo.toml | 1 - core/keystore/src/lib.rs | 2 - 4 files changed, 8 insertions(+), 144 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ff4172aa5e..abab05f74e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -104,6 +104,8 @@ check-web-wasm: - 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 diff --git a/Cargo.lock b/Cargo.lock index 9944db924b..f8f8588edf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,16 +8,6 @@ dependencies = [ "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "aes" -version = "0.3.2" -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)", - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "aes-ctr" version = "0.3.0" @@ -257,15 +247,6 @@ dependencies = [ "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "block-buffer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "block-buffer" version = "0.7.3" @@ -285,15 +266,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "block-modes" -version = "0.3.3" -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)", - "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "block-padding" version = "0.1.4" @@ -629,15 +601,6 @@ dependencies = [ "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "crypto-mac" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "crypto-mac" version = "0.7.0" @@ -711,7 +674,7 @@ dependencies = [ "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_core 0.3.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]] @@ -743,14 +706,6 @@ dependencies = [ "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "digest" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "digest" version = "0.8.0" @@ -983,14 +938,6 @@ dependencies = [ "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "generic-array" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "generic-array" version = "0.12.0" @@ -1150,15 +1097,6 @@ dependencies = [ "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "hmac" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crypto-mac 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "hmac" version = "0.7.0" @@ -2383,23 +2321,6 @@ dependencies = [ "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parity-crypto" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "block-modes 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "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)", - "ripemd160 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "scrypt 0.1.2 (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)", -] - [[package]] name = "parity-multiaddr" version = "0.4.0" @@ -2535,16 +2456,6 @@ dependencies = [ "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "pbkdf2" -version = "0.2.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)", - "crypto-mac 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "pbkdf2" version = "0.3.0" @@ -2911,16 +2822,6 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ripemd160" -version = "0.8.0" -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)", - "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rocksdb" version = "0.11.0" @@ -3017,7 +2918,7 @@ dependencies = [ "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]] @@ -3025,18 +2926,6 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "scrypt" -version = "0.1.2" -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)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "pbkdf2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "security-framework" version = "0.2.2" @@ -3132,17 +3021,6 @@ dependencies = [ "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "sha2" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", - "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "sha2" version = "0.8.0" @@ -3249,7 +3127,7 @@ dependencies = [ "rustc_version 0.2.3 (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.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]] @@ -4260,11 +4138,10 @@ version = "2.0.0" dependencies = [ "error-chain 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)", - "parity-crypto 0.3.1 (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)", "substrate-primitives 2.0.0", - "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)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4663,7 +4540,7 @@ 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]] @@ -5579,7 +5456,6 @@ dependencies = [ [metadata] "checksum MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaf9f0d0b1cc33a4d2aee14fb4b2eac03462ef4db29c8ac4057327d8a71ad86f" -"checksum aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54eb1d8fe354e5fc611daf4f2ea97dd45a765f4f1e4512306ec183ae2e8f20c9" "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" @@ -5607,10 +5483,8 @@ dependencies = [ "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.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a076c298b9ecdb530ed9d967e74a6027d6a7478924520acddcddc24c1c8ab3ab" "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-modes 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "31aa8410095e39fdb732909fb5730a48d5bd7c2e3cd76bd1b07b3dbea130c529" "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" @@ -5649,7 +5523,6 @@ dependencies = [ "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.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7afa06d05a046c7a47c3a849907ec303504608c927f4e85f7bfff22b7180d971" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" "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" @@ -5662,7 +5535,6 @@ dependencies = [ "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.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90" "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" @@ -5692,7 +5564,6 @@ dependencies = [ "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 generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d" "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" @@ -5711,7 +5582,6 @@ dependencies = [ "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.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "733e1b3ac906631ca01ebb577e9bb0f5e37a454032b9036b5eaea4013ed6f99a" "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.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" @@ -5808,7 +5678,6 @@ dependencies = [ "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "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" @@ -5821,7 +5690,6 @@ dependencies = [ "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" "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" @@ -5864,7 +5732,6 @@ dependencies = [ "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 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 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" @@ -5878,7 +5745,6 @@ dependencies = [ "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 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" @@ -5890,7 +5756,6 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" @@ -5920,7 +5785,7 @@ dependencies = [ "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 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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a0cb7899e248ed0baa6ef6f8406352523c2f99bc7c4b1800f4cd6d5dde99eb" diff --git a/core/keystore/Cargo.toml b/core/keystore/Cargo.toml index 4c4a89157b..99f0ebedd2 100644 --- a/core/keystore/Cargo.toml +++ b/core/keystore/Cargo.toml @@ -6,7 +6,6 @@ edition = "2018" [dependencies] substrate-primitives = { path = "../primitives" } -crypto = { package = "parity-crypto", version = "0.3", default-features = false } error-chain = "0.12" hex = "0.3" rand = "0.6" diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index ff737535f9..9e6d4ec83c 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -30,8 +30,6 @@ use error_chain::{bail, error_chain, error_chain_processing, impl_error_chain_pr use substrate_primitives::{ed25519::{Pair, Public}, Pair as PairT}; -pub use crypto::KEY_ITERATIONS; - error_chain! { foreign_links { Io(io::Error); -- GitLab From c5c65b000c40548a6fd288a98322c3ba199e4a34 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 23 May 2019 11:28:49 +0200 Subject: [PATCH 009/140] fix(bump protobuf): fix vulnerability (#2654) --- Cargo.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f8f8588edf..1ebeaad998 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1474,7 +1474,7 @@ dependencies = [ "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.5.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)", @@ -1522,7 +1522,7 @@ 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)", "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.5.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.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1542,7 +1542,7 @@ dependencies = [ "log 0.4.6 (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.5.0 (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.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1568,7 +1568,7 @@ dependencies = [ "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.5.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.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1626,7 +1626,7 @@ dependencies = [ "lazy_static 1.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)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.5.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)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1693,7 +1693,7 @@ dependencies = [ "lazy_static 1.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)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.5.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)", @@ -2553,7 +2553,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -5702,7 +5702,7 @@ dependencies = [ "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.4.28 (registry+https://github.com/rust-lang/crates.io-index)" = "ba92c84f814b3f9a44c5cfca7d2ad77fa10710867d2bbb1b3d175ab5f47daa12" -"checksum protobuf 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc7badf647ae2fa27ba51c218e347386c88cc604fcfe71f2aba0ad017f3f2b75" +"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" -- GitLab From 445e0f65e9173491431d7d0c4a77cd4575a72192 Mon Sep 17 00:00:00 2001 From: Luke Schoen Date: Thu, 23 May 2019 11:34:00 +0200 Subject: [PATCH 010/140] docs: Update Support SRML to link to StorageDoubleMap in Rustdocs (#2646) * docs: Update Support SRML to link to StorageDoubleMap in Rustdocs * review-fix: Add missing backticks. Add trait text for consistency. Fix typo * review-fix: Move trait text out of link --- srml/support/procedural/src/lib.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/srml/support/procedural/src/lib.rs b/srml/support/procedural/src/lib.rs index f98baa7ed5..abd7e90951 100644 --- a/srml/support/procedural/src/lib.rs +++ b/srml/support/procedural/src/lib.rs @@ -47,10 +47,11 @@ use proc_macro::TokenStream; /// /// Basic storage consists of a name and a type; supported types are: /// -/// * Value: `Foo: type`: Implements [StorageValue](../srml_support/storage/trait.StorageValue.html). -/// * Map: `Foo: map hasher($hash) type => type`: Implements [StorageMap](../srml_support/storage/trait.StorageMap.html) +/// * 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` trait](../srml_support/trait.Hashable.html). +/// [`Hashable`](../srml_support/trait.Hashable.html) trait. /// /// `hasher($hash)` is optional and its default is `blake2_256`. /// @@ -59,11 +60,12 @@ use proc_macro::TokenStream; /// `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 -/// [EnumarableStorageMap](../srml_support/storage/trait.EnumerableStorageMap.html). +/// the [`EnumerableStorageMap`](../srml_support/storage/trait.EnumerableStorageMap.html) trait. /// -/// * Double map: `Foo: double_map hasher($hash) u32, $hash2(u32) => u32`: Implements `StorageDoubleMap` with +/// * 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` trait](../srml_support/trait.Hashable.html). +/// [`Hashable`](../srml_support/trait.Hashable.html) trait. /// /// `hasher($hash)` is optional and its default is `blake2_256`. /// -- GitLab From 69dd3b1b1646497360777880d3dfbcdd91a15fc4 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Thu, 23 May 2019 11:34:17 +0200 Subject: [PATCH 011/140] srml-contract: update ext_random(_seed) (#2635) * Initial implementation. * Rename random_seed to random * Update rustdocs * Update COMPLEXITY.md * Fix comment. * Limit the size of subject. * Bump the runtime version. * Fix doc * Update node/runtime/src/lib.rs Co-Authored-By: thiolliere --- srml/contract/COMPLEXITY.md | 8 +++-- srml/contract/src/exec.rs | 11 +++--- srml/contract/src/lib.rs | 4 +++ srml/contract/src/wasm/mod.rs | 57 +++++++++++++++++++------------ srml/contract/src/wasm/runtime.rs | 16 +++++++-- 5 files changed, 61 insertions(+), 35 deletions(-) diff --git a/srml/contract/COMPLEXITY.md b/srml/contract/COMPLEXITY.md index 3cd7fee448..c2d75efaba 100644 --- a/srml/contract/COMPLEXITY.md +++ b/srml/contract/COMPLEXITY.md @@ -298,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 diff --git a/srml/contract/src/exec.rs b/srml/contract/src/exec.rs index 9d63c037c0..1ab59fa0c2 100644 --- a/srml/contract/src/exec.rs +++ b/srml/contract/src/exec.rs @@ -106,8 +106,8 @@ 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. /// @@ -353,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, @@ -423,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(), @@ -576,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> @@ -642,8 +639,8 @@ 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 { diff --git a/srml/contract/src/lib.rs b/srml/contract/src/lib.rs index b9412b3619..a255663bfb 100644 --- a/srml/contract/src/lib.rs +++ b/srml/contract/src/lib.rs @@ -690,6 +690,9 @@ pub struct Schedule { /// 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 { @@ -709,6 +712,7 @@ impl> Default for Schedule { max_stack_height: 64 * 1024, max_memory_pages: 16, enable_println: false, + max_subject_len: 32, } } } diff --git a/srml/contract/src/wasm/mod.rs b/srml/contract/src/wasm/mod.rs index 2776f4041b..d86678d383 100644 --- a/srml/contract/src/wasm/mod.rs +++ b/srml/contract/src/wasm/mod.rs @@ -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); @@ -207,7 +208,6 @@ mod tests { // (topics, data) events: Vec<(Vec, Vec)>, next_account_id: u64, - random_seed: H256, } impl Ext for MockExt { type T = Test; @@ -276,8 +276,8 @@ 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) { @@ -1115,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) @@ -1133,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 @@ -1150,35 +1154,44 @@ 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#" diff --git a/srml/contract/src/wasm/runtime.rs b/srml/contract/src/wasm/runtime.rs index b6f857269e..873464c5be 100644 --- a/srml/contract/src/wasm/runtime.rs +++ b/srml/contract/src/wasm/runtime.rs @@ -527,9 +527,19 @@ 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(()) }, -- GitLab From 02832dc8b7df35d4ccbaf62415d95e340bc0c76d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Thu, 23 May 2019 10:50:36 +0100 Subject: [PATCH 012/140] core: allow setting max ws rpc connections (#2632) * core: allow setting max ws rpc connections * style: break long lines * core: fix service tests --- core/cli/src/lib.rs | 1 + core/cli/src/params.rs | 4 ++++ core/rpc-servers/src/lib.rs | 7 ++++++- core/service/src/components.rs | 21 +++++++++++++++++---- core/service/src/config.rs | 3 +++ core/service/src/lib.rs | 12 ++++++++++-- core/service/test/src/lib.rs | 1 + 7 files changed, 42 insertions(+), 7 deletions(-) diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 3aa567de66..82ebf8ec05 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -487,6 +487,7 @@ where config.rpc_ws = Some( parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)? ); + 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 diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index ab473a304b..e7d466a863 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -333,6 +333,10 @@ 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. diff --git a/core/rpc-servers/src/lib.rs b/core/rpc-servers/src/lib.rs index b37895c503..2c0672ac9c 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/service/src/components.rs b/core/service/src/components.rs index 48ea9777bd..2536d7c8f2 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -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), )) } } @@ -330,7 +343,7 @@ pub trait ServiceFactory: 'static + Sized { /// Build the Fork Choice algorithm for full client fn build_select_chain( config: &mut FactoryFullConfiguration, - client: Arc>, + client: Arc>, ) -> Result; /// Build full service. @@ -497,7 +510,7 @@ impl Components for FullComponents { } fn build_transaction_pool( - config: TransactionPoolOptions, + config: TransactionPoolOptions, client: Arc> ) -> Result, error::Error> { Factory::build_full_transaction_pool(config, client) diff --git a/core/service/src/config.rs b/core/service/src/config.rs index c9e8e4662d..5996ec837d 100644 --- a/core/service/src/config.rs +++ b/core/service/src/config.rs @@ -66,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. @@ -104,6 +106,7 @@ impl Configuration 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(); diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index a0f37709bd..7b73c370ee 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -120,6 +120,7 @@ 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, -- GitLab From 2fcf061bc003789c25aad2d84c5f26f58fa0f431 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 23 May 2019 12:07:51 +0200 Subject: [PATCH 013/140] More extractions from the Protocol struct (#2641) * Pass the TransactionPool explicitly * Extract finality_proof_provider * Remove Protocol::connected_peers * Add note and rename function * Fix tests * More test fixing * Revert the WASM locks, I guess * Add space * Remove space --- core/network/src/config.rs | 2 +- core/network/src/protocol.rs | 66 +++++++++++++++++------------------ core/network/src/service.rs | 53 ++++++++++++++++++++++------ core/network/src/test/mod.rs | 40 ++++++++++----------- core/network/src/test/sync.rs | 6 ++-- core/rpc/src/system/mod.rs | 4 +-- core/rpc/src/system/tests.rs | 2 +- core/service/test/src/lib.rs | 4 +-- 8 files changed, 103 insertions(+), 74 deletions(-) diff --git a/core/network/src/config.rs b/core/network/src/config.rs index 965aeba8c9..05cf27ca75 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -39,7 +39,7 @@ pub struct Params { /// On-demand service reference. pub on_demand: Option>>, /// Transaction pool. - pub transaction_pool: Arc>, + pub transaction_pool: Arc>, /// Protocol specialization. pub specialization: S, } diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index cd7a14bdbb..c9e56362d1 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -35,7 +35,6 @@ use crate::specialization::NetworkSpecialization; 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; @@ -92,10 +91,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. @@ -261,18 +256,14 @@ struct ContextData { // All connected peers peers: HashMap>, pub chain: Arc>, - pub finality_proof_provider: Option>>, } impl, H: ExHashT> Protocol { /// Create a new instance. pub fn new( - connected_peers: Arc>>>, config: ProtocolConfig, chain: Arc>, - finality_proof_provider: Option>>, on_demand: Option>>, - transaction_pool: Arc>, specialization: S, ) -> error::Result> { let info = chain.info()?; @@ -284,7 +275,6 @@ impl, H: ExHashT> Protocol { context_data: ContextData { peers: HashMap::new(), chain, - finality_proof_provider, }, on_demand, genesis_hash: info.chain.genesis_hash, @@ -292,8 +282,6 @@ impl, H: ExHashT> Protocol { specialization: specialization, consensus_gossip: ConsensusGossip::new(), handshaking_peers: HashMap::new(), - connected_peers, - transaction_pool: transaction_pool, }) } @@ -319,13 +307,17 @@ impl, H: ExHashT> Protocol { self.sync.status().is_offline() } - pub fn poll(&mut self, network_out: &mut dyn NetworkOut) -> Poll { + 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); + self.propagate_extrinsics(network_out, transaction_pool); } Ok(Async::NotReady) @@ -364,19 +356,21 @@ 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; - } } } + /// 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)) + } + pub fn on_custom_message( &mut self, network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized), who: PeerId, - message: Message + message: Message, + finality_proof_provider: Option<&FinalityProofProvider> ) -> CustomMessageOutcome { match message { GenericMessage::Status(s) => self.on_status_message(network_out, who, s), @@ -397,7 +391,8 @@ impl, H: ExHashT> Protocol { self.on_block_announce(network_out, who.clone(), announce); self.update_peer_info(&who); }, - GenericMessage::Transactions(m) => self.on_extrinsics(network_out, who, m), + 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(who, response), GenericMessage::RemoteReadRequest(request) => self.on_remote_read_request(network_out, who, request), @@ -406,7 +401,8 @@ impl, H: ExHashT> Protocol { GenericMessage::RemoteHeaderResponse(response) => self.on_remote_header_response(who, response), GenericMessage::RemoteChangesRequest(request) => self.on_remote_changes_request(network_out, who, request), GenericMessage::RemoteChangesResponse(response) => self.on_remote_changes_response(who, response), - GenericMessage::FinalityProofRequest(request) => self.on_finality_proof_request(network_out, who, request), + 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) => { @@ -489,7 +485,6 @@ impl, H: ExHashT> Protocol { // 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) }; if let Some(peer_data) = removed { @@ -734,16 +729,12 @@ 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 => { error!(target: "sync", "Received status from previously unconnected node {}", who); @@ -780,6 +771,7 @@ impl, H: ExHashT> Protocol { fn on_extrinsics( &mut self, network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized), who: PeerId, extrinsics: message::Transactions ) { @@ -791,7 +783,7 @@ 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 { @@ -802,7 +794,11 @@ impl, H: ExHashT> Protocol { } /// Call when we must propagate ready extrinsics to peers. - pub fn propagate_extrinsics(&mut self, network_out: &mut dyn NetworkOut) { + 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 @@ -810,7 +806,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 @@ -830,7 +826,8 @@ impl, H: ExHashT> Protocol { 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. @@ -1203,9 +1200,10 @@ impl, H: ExHashT> Protocol { 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 = self.context_data.finality_proof_provider.as_ref() + 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()) diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 1a966fc933..4516609c5e 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -29,6 +29,7 @@ use peerset::PeersetHandle; use consensus::import_queue::{ImportQueue, Link, SharedFinalityProofRequestBuilder}; use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; +use crate::chain::FinalityProofProvider; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; use crate::message::Message; use crate::protocol::{self, Context, CustomMessageOutcome, Protocol, ConnectedPeer}; @@ -41,6 +42,8 @@ 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; @@ -53,8 +56,13 @@ pub trait SyncProvider: Send + Sync { 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; } @@ -206,12 +214,9 @@ impl> Service { let is_major_syncing = Arc::new(AtomicBool::new(false)); let peers: Arc>>> = Arc::new(Default::default()); let protocol = Protocol::new( - peers.clone(), params.config, params.chain, - params.finality_proof_provider, params.on_demand, - params.transaction_pool, params.specialization, )?; let versions: Vec<_> = ((protocol::MIN_VERSION as u8)..=(protocol::CURRENT_VERSION as u8)).collect(); @@ -220,7 +225,10 @@ impl> Service { 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(), @@ -392,7 +400,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() } @@ -514,7 +522,10 @@ 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>>>>, @@ -540,7 +551,10 @@ fn start_thread, H: ExHashT>( is_major_syncing, protocol, service_clone, + peers, import_queue, + transaction_pool, + finality_proof_provider, network_port, protocol_rx, status_sinks, @@ -567,7 +581,10 @@ fn run_thread, H: ExHashT>( is_major_syncing: Arc, mut protocol: Protocol, network_service: Arc>>>, + 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>>>>, @@ -589,6 +606,8 @@ fn run_thread, H: ExHashT>( // 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); futures::future::poll_fn(move || { while let Ok(Async::Ready(_)) = status_interval.poll() { @@ -596,7 +615,14 @@ fn run_thread, H: ExHashT>( status_sinks.lock().retain(|sink| sink.unbounded_send(status.clone()).is_ok()); } - match protocol.poll(&mut Ctxt(&mut network_service.lock(), &peerset)) { + 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; + } + + 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), @@ -646,7 +672,7 @@ fn run_thread, H: ExHashT>( 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 => + ProtocolMsg::RestartSync => protocol.restart(&mut network_out), ProtocolMsg::AnnounceBlock(hash) => protocol.announce_block(&mut network_out, hash), @@ -664,7 +690,8 @@ fn run_thread, H: ExHashT>( 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), + 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"))] @@ -692,7 +719,13 @@ fn run_thread, H: ExHashT>( CustomMessageOutcome::None }, Ok(Async::Ready(Some(NetworkServiceEvent::CustomMessage { peer_id, message, .. }))) => - protocol.on_custom_message(&mut network_out, 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) { diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 82d54d40b0..7cbbbf1370 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -44,7 +44,7 @@ use crate::message::Message; use network_libp2p::PeerId; use parking_lot::{Mutex, RwLock}; use primitives::{H256, sr25519::Public as AuthorityId, Blake2Hasher}; -use crate::protocol::{ConnectedPeer, Context, Protocol, ProtocolStatus, CustomMessageOutcome, NetworkOut}; +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}; @@ -274,7 +274,6 @@ impl> Link for TestLink { } pub struct Peer> { - peers: Arc>>>, peer_id: PeerId, client: PeersClient, net_proto_channel: ProtocolChannel, @@ -411,7 +410,7 @@ impl> ProtocolChannel { Ok(Async::Ready(None)) => None, })) }); - + if self.use_tokio { fut.wait() } else { @@ -423,7 +422,6 @@ impl> ProtocolChannel { impl> Peer { fn new( protocol_status: Arc>>, - peers: Arc>>>, client: PeersClient, import_queue: Box>, use_tokio: bool, @@ -447,7 +445,6 @@ impl> Peer { import_queue.start(Box::new(network_link)).expect("Test ImportQueue always starts"); Peer { protocol_status, - peers, peer_id: PeerId::random(), client, import_queue, @@ -792,6 +789,8 @@ pub trait TestNetFactory: Sized { &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>, @@ -825,7 +824,13 @@ pub trait TestNetFactory: Sized { CustomMessageOutcome::None }, Some(FromNetworkMsg::CustomMessage(peer_id, message)) => - protocol.on_custom_message(&mut Ctxt(&network_sender), 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 @@ -876,7 +881,7 @@ pub trait TestNetFactory: Sized { ), ProtocolMsg::BlocksProcessed(hashes, has_error) => protocol.blocks_processed(&mut Ctxt(&network_sender), hashes, has_error), - ProtocolMsg::RestartSync => + ProtocolMsg::RestartSync => protocol.restart(&mut Ctxt(&network_sender)), ProtocolMsg::AnnounceBlock(hash) => protocol.announce_block(&mut Ctxt(&network_sender), hash), @@ -894,7 +899,8 @@ pub trait TestNetFactory: Sized { 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)), + 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"))] @@ -905,7 +911,7 @@ pub trait TestNetFactory: Sized { } } - if let Async::Ready(_) = protocol.poll(&mut Ctxt(&network_sender)).unwrap() { + if let Async::Ready(_) = protocol.poll(&mut Ctxt(&network_sender), &tx_pool).unwrap() { return Ok(Async::Ready(())) } @@ -930,7 +936,6 @@ pub trait TestNetFactory: Sized { /// 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(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())); @@ -944,18 +949,14 @@ pub trait TestNetFactory: Sized { finality_proof_request_builder, )); let specialization = self::SpecializationFactory::create(); - let peers: Arc>>> = Arc::new(Default::default()); let (network_to_protocol_sender, network_to_protocol_rx) = mpsc::unbounded(); let (protocol_sender, protocol_rx) = mpsc::unbounded(); let protocol = Protocol::new( - peers.clone(), config.clone(), client.clone(), - self.make_finality_proof_provider(PeersClient::Full(client.clone())), None, - tx_pool, specialization, ).unwrap(); @@ -963,13 +964,14 @@ pub trait TestNetFactory: Sized { 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, - peers, PeersClient::Full(client), import_queue, self.uses_tokio(), @@ -988,7 +990,6 @@ pub trait TestNetFactory: Sized { config.roles = Roles::LIGHT; let client = Arc::new(test_client::new_light()); - let tx_pool = Arc::new(EmptyTransactionPool); 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())); @@ -1002,18 +1003,14 @@ pub trait TestNetFactory: Sized { finality_proof_request_builder, )); let specialization = self::SpecializationFactory::create(); - let peers: Arc>>> = Arc::new(Default::default()); let (network_to_protocol_sender, network_to_protocol_rx) = mpsc::unbounded(); let (protocol_sender, protocol_rx) = mpsc::unbounded(); let protocol = Protocol::new( - peers.clone(), config, client.clone(), - self.make_finality_proof_provider(PeersClient::Light(client.clone())), None, - tx_pool, specialization, ).unwrap(); @@ -1021,13 +1018,14 @@ pub trait TestNetFactory: Sized { 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, - peers, PeersClient::Light(client), import_queue, self.uses_tokio(), diff --git a/core/network/src/test/sync.rs b/core/network/src/test/sync.rs index da42ae4758..8462304e42 100644 --- a/core/network/src/test/sync.rs +++ b/core/network/src/test/sync.rs @@ -45,7 +45,7 @@ fn sync_peers_works() { net.sync(); for peer in 0..3 { // Assert peers is up to date. - assert_eq!(net.peer(peer).peers.read().len(), 2); + assert_eq!(net.peer(peer).protocol_status.read().num_peers, 2); // And then disconnect. for other in 0..3 { if other != peer { @@ -56,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); } } diff --git a/core/rpc/src/system/mod.rs b/core/rpc/src/system/mod.rs index 331d9cd85b..46cbc99fab 100644 --- a/core/rpc/src/system/mod.rs +++ b/core/rpc/src/system/mod.rs @@ -110,14 +110,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 b4b71a7937..14cd421fd1 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/service/test/src/lib.rs b/core/service/test/src/lib.rs index 7b73c370ee..dc4676dc0a 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -195,7 +195,7 @@ pub fn connectivity(spec: FactoryChainSpec) { 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 }; @@ -215,7 +215,7 @@ pub fn connectivity(spec: FactoryChainSpec) { 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"); -- GitLab From 6d38263434aba843585c7dc8744fc89703be90b5 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Thu, 23 May 2019 15:09:16 +0200 Subject: [PATCH 014/140] Contract restoration (#2502) * partial impl * more checks * improve TestExternalities + tests * make tombstone raw to derive Eq * remove before merge * add test * fmt * update test * doc * bump version * fix testing * update runtime * Fix TrieIdGenerator * fix dummy trie id generator * update test * bump version * format * Update core/state-machine/src/testing.rs Co-Authored-By: cheme * document test * Apply suggestions from code review Co-Authored-By: DemiMarie-temp <50585338+DemiMarie-temp@users.noreply.github.com> * refactor * fix * fmt * address review * impl last_write * Fix storage size, test, remove size in tombstone * fix * Update srml/contract/src/lib.rs Co-Authored-By: Sergei Pepyakin * comment * child_storage_root as &[u8] --- Cargo.lock | 1 + core/state-machine/src/ext.rs | 2 +- core/state-machine/src/testing.rs | 154 ++++++++++++------ node/runtime/src/lib.rs | 2 +- srml/contract/Cargo.toml | 1 + srml/contract/src/account_db.rs | 5 + srml/contract/src/lib.rs | 121 ++++++++++++-- srml/contract/src/rent.rs | 5 +- srml/contract/src/tests.rs | 261 ++++++++++++++++++++++++++---- srml/executive/src/lib.rs | 2 +- 10 files changed, 453 insertions(+), 101 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1ebeaad998..5550265cf4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3318,6 +3318,7 @@ name = "srml-contract" version = "2.0.0" dependencies = [ "assert_matches 1.3.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)", diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index 0f5a4e2ed5..b9c035a778 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -302,7 +302,7 @@ where .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())))); + .flat_map(|map| map.1.clone().into_iter())); let root = self.backend.child_storage_root(storage_key, delta).0; diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index a4f650bcf2..03909f384c 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -16,22 +16,27 @@ //! 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 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::{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 { - inner: HashMap, Vec>, + overlay: OverlayedChanges, + backend: InMemory, changes_trie_storage: ChangesTrieInMemoryStorage, - changes: OverlayedChanges, - code: Option>, + _hasher: PhantomData, } impl TestExternalities { @@ -43,6 +48,7 @@ impl TestExternalities { /// 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(), @@ -50,37 +56,51 @@ impl TestExternalities { ).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 { 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 { + /// 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 { 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 } } @@ -91,81 +111,109 @@ impl Default for TestExternalities { 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 { 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 { 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: ChildStorageKey, key: &[u8]) -> Option> { - self.changes.child_storage(storage_key.as_ref(), key)?.map(Vec::from) + 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: ChildStorageKey, key: Vec, value: Option>) { - self.changes.set_child_storage(storage_key.into_owned(), key, value); + 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: ChildStorageKey) { - self.changes.clear_child_storage(storage_key.as_ref()); + 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: ChildStorageKey) -> Vec { - vec![] + 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()) } @@ -187,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/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index a285a246cc..e2bd336916 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 81, - impl_version: 81, + impl_version: 82, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/contract/Cargo.toml b/srml/contract/Cargo.toml index be34da3cac..7c04758171 100644 --- a/srml/contract/Cargo.toml +++ b/srml/contract/Cargo.toml @@ -25,6 +25,7 @@ assert_matches = "1.1" hex-literal = "0.2.0" consensus = { package = "srml-consensus", path = "../consensus" } balances = { package = "srml-balances", path = "../balances" } +hex = "0.3" [features] default = ["std"] diff --git a/srml/contract/src/account_db.rs b/srml/contract/src/account_db.rs index 21f2972893..5cae9f05dc 100644 --- a/srml/contract/src/account_db.rs +++ b/srml/contract/src/account_db.rs @@ -124,6 +124,7 @@ impl AccountDb for DirectAccountDb { trie_id: ::TrieIdGenerator::trie_id(&address), deduct_block: >::block_number(), rent_allowance: >::max_value(), + last_write: None, } } else { // No contract exist and no code_hash provided @@ -138,6 +139,10 @@ impl AccountDb for DirectAccountDb { new_info.code_hash = code_hash; } + if !changed.storage.is_empty() { + new_info.last_write = Some(>::block_number()); + } + for (k, v) in changed.storage.into_iter() { if let Some(value) = child::get_raw(&new_info.trie_id[..], &blake2_256(&k)) { new_info.storage_size -= value.len() as u32; diff --git a/srml/contract/src/lib.rs b/srml/contract/src/lib.rs index a255663bfb..3f05bb8a8f 100644 --- a/srml/contract/src/lib.rs +++ b/srml/contract/src/lib.rs @@ -96,9 +96,14 @@ use serde::{Serialize, Deserialize}; use substrate_primitives::crypto::UncheckedFrom; use rstd::{prelude::*, marker::PhantomData, convert::TryFrom}; use parity_codec::{Codec, Encode, Decode}; -use runtime_primitives::traits::{Hash, SimpleArithmetic, Bounded, StaticLookup, Zero}; +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; @@ -120,6 +125,7 @@ pub trait ComputeDispatchFee { /// Information for managing an acocunt and its sub trie abstraction. /// This is the required info to cache for an account #[derive(Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] pub enum ContractInfo { Alive(AliveContractInfo), Tombstone(TombstoneContractInfo), @@ -177,12 +183,14 @@ impl ContractInfo { } } -pub type AliveContractInfo = RawAliveContractInfo, BalanceOf, ::BlockNumber>; +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, @@ -190,20 +198,32 @@ pub struct RawAliveContractInfo { 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, } -#[derive(Encode, Decode)] -pub struct TombstoneContractInfo(T::Hash); +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 TombstoneContractInfo { - fn new(storage_root: Vec, storage_size: u32, code_hash: CodeHash) -> Self { +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)); - storage_size.using_encoded(|encoded| buf.extend_from_slice(encoded)); buf.extend_from_slice(code_hash.as_ref()); - TombstoneContractInfo(T::Hashing::hash(&buf[..])) + RawTombstoneContractInfo(Hasher::hash(&buf[..]), PhantomData) } } @@ -235,7 +255,10 @@ where 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)); + let new_seed = >::mutate(|v| { + *v = v.wrapping_add(1); + *v + }); let mut buf = Vec::new(); buf.extend_from_slice(account_id.as_ref()); @@ -508,6 +531,84 @@ decl_module! { } } + /// 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(); } diff --git a/srml/contract/src/rent.rs b/srml/contract/src/rent.rs index aacbb4ab7f..3baf043b90 100644 --- a/srml/contract/src/rent.rs +++ b/srml/contract/src/rent.rs @@ -163,9 +163,8 @@ fn try_evict_or_and_pay_rent( // Note: this operation is heavy. let child_storage_root = runtime_io::child_storage_root(&contract.trie_id); - let tombstone = TombstoneContractInfo::new( - child_storage_root, - contract.storage_size, + let tombstone = >::new( + &child_storage_root[..], contract.code_hash, ); >::insert(account, ContractInfo::Tombstone(tombstone)); diff --git a/srml/contract/src/tests.rs b/srml/contract/src/tests.rs index a14819850e..aeadc99353 100644 --- a/srml/contract/src/tests.rs +++ b/srml/contract/src/tests.rs @@ -34,7 +34,7 @@ use runtime_primitives::traits::{BlakeTwo256, IdentityLookup}; use runtime_primitives::BuildStorage; use srml_support::{ assert_ok, impl_outer_dispatch, impl_outer_event, impl_outer_origin, storage::child, - traits::Currency, StorageMap, + traits::Currency, StorageMap, StorageValue }; use std::sync::atomic::{AtomicUsize, Ordering}; use substrate_primitives::storage::well_known_keys; @@ -119,18 +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 { 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(&KEY_COUNTER.fetch_add(1, Ordering::Relaxed).to_le_bytes()); + res.extend_from_slice(&new_seed.to_le_bytes()); res.extend_from_slice(&account_id.to_le_bytes()); res } @@ -146,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, @@ -263,6 +267,7 @@ fn account_removal_removes_storage() { deduct_block: System::block_number(), code_hash: H256::repeat_byte(1), rent_allowance: 40, + last_write: None, })); let mut overlay = OverlayAccountDb::::new(&DirectAccountDb); @@ -277,6 +282,7 @@ fn account_removal_removes_storage() { deduct_block: System::block_number(), code_hash: H256::repeat_byte(2), rent_allowance: 40, + last_write: None, })); let mut overlay = OverlayAccountDb::::new(&DirectAccountDb); @@ -424,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(); @@ -555,7 +561,7 @@ const CODE_SET_RENT: &str = r#" ;; transfer 50 to ALICE (func $call_2 (call $ext_dispatch_call - (i32.const 8) + (i32.const 68) (i32.const 11) ) ) @@ -627,10 +633,12 @@ const CODE_SET_RENT: &str = r#" (data (i32.const 0) "\28") ;; Encoding of call transfer 50 to CHARLIE - (data (i32.const 8) "\00\00\03\00\00\00\00\00\00\00\C8") + (data (i32.const 68) "\00\00\03\00\00\00\00\00\00\00\C8") ) "#; -const HASH_SET_RENT: [u8; 32] = hex!("a51c2a6f3f68936d4ae9abdb93b28eedcbd0f6f39770e168f9025f0c1e7094ef"); + +// 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 { @@ -643,10 +651,10 @@ mod call { /// Test correspondance of set_rent code and its hash. /// Also test that encoded extrinsic in code correspond to the correct transfer #[test] -fn set_rent_hash_and_code() { +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 = 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_SET_RENT).unwrap(); @@ -657,7 +665,8 @@ fn set_rent_hash_and_code() { 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. + // 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), @@ -691,15 +700,15 @@ fn storage_size() { 100_000, HASH_SET_RENT.into(), ::Balance::from(1_000u32).encode() // rent allowance )); - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + 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 = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + 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 = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4); } ); @@ -723,7 +732,7 @@ fn deduct_blocks() { )); // Check creation - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.rent_allowance, 1_000); // Advance 4 blocks @@ -736,7 +745,7 @@ fn deduct_blocks() { 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 = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + 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); @@ -751,7 +760,7 @@ fn deduct_blocks() { 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 = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + 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); @@ -759,7 +768,7 @@ fn deduct_blocks() { // 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 = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + 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); @@ -822,9 +831,9 @@ fn claim_surcharge(blocks: u64, trigger_call: impl Fn() -> bool, removes: bool) assert!(trigger_call()); if removes { - assert!(super::ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); } else { - assert!(super::ContractInfoOf::::get(BOB).unwrap().get_alive().is_some()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_alive().is_some()); } } ); @@ -853,21 +862,21 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent must have no effect assert!(trigger_call()); - assert_eq!(super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + 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!(super::ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + 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!(super::ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); } ); @@ -887,21 +896,21 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent must have no effect assert!(trigger_call()); - assert_eq!(super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 100); + 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!(super::ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + 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!(super::ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); } ); @@ -921,25 +930,25 @@ fn removals(trigger_call: impl Fn() -> bool) { // Trigger rent must have no effect assert!(trigger_call()); - assert_eq!(super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + 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!(super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + 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!(super::ContractInfoOf::::get(BOB).is_none()); + 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!(super::ContractInfoOf::::get(BOB).is_none()); + assert!(ContractInfoOf::::get(BOB).is_none()); } ); } @@ -1014,7 +1023,7 @@ fn default_rent_allowance_on_create() { )); // Check creation - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.rent_allowance, >::max_value()); // Advance blocks @@ -1024,8 +1033,196 @@ fn default_rent_allowance_on_create() { assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); // Check contract is still alive - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_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/executive/src/lib.rs b/srml/executive/src/lib.rs index 3dc161bb0c..33d26ce42f 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -474,7 +474,7 @@ mod tests { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("ac2840371d51ff2e036c8fc05af7313b7a030f735c38b2f03b94cbe87bfbb7c9").into(), + state_root: hex!("5ba497e45e379d80a4524f9509d224e9c175d0fa30f3491481e7e44a6a758adf").into(), extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), digest: Digest { logs: vec![], }, }, -- GitLab From 373e490f93522d5ab9aa690ca3908b2a3b0e8762 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 23 May 2019 21:13:23 +0200 Subject: [PATCH 015/140] Rework the OnDemand service (#2670) * Rework the OnDemand service * Try fix line widths --- core/network/src/config.rs | 4 +- core/network/src/lib.rs | 4 +- core/network/src/on_demand.rs | 926 ++++++++++++---------------- core/network/src/on_demand_layer.rs | 149 +++++ core/network/src/protocol.rs | 137 ++-- core/network/src/service.rs | 18 +- core/network/src/test/mod.rs | 5 +- core/service/src/lib.rs | 5 +- 8 files changed, 665 insertions(+), 583 deletions(-) create mode 100644 core/network/src/on_demand_layer.rs diff --git a/core/network/src/config.rs b/core/network/src/config.rs index 05cf27ca75..a2a34780bf 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -21,7 +21,7 @@ pub use network_libp2p::{NonReservedPeerMode, NetworkConfiguration, NodeKeyConfi use bitflags::bitflags; 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; @@ -37,7 +37,7 @@ pub struct Params { /// 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>, /// Protocol specialization. diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 4d69767c7b..e3ed56d5ad 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -30,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; @@ -56,6 +57,7 @@ pub use network_libp2p::{ }; 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/on_demand.rs b/core/network/src/on_demand.rs index ec4c178232..f77b50dac6 100644 --- a/core/network/src/on_demand.rs +++ b/core/network/src/on_demand.rs @@ -17,22 +17,18 @@ //! On-demand requests service. use std::collections::{HashMap, VecDeque}; -use std::sync::{Arc, Weak}; +use std::sync::Arc; use std::time::{Instant, Duration}; use log::{trace, info}; -use futures::{Async, Future, Poll}; -use futures::sync::oneshot::{channel, Receiver, Sender as OneShotSender}; +use futures::sync::oneshot::{Sender as OneShotSender}; use linked_hash_map::{Entry, LinkedHashMap}; -use parking_lot::Mutex; use client::error::Error as ClientError; -use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, +use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof, RemoteReadChildRequest, RemoteBodyRequest}; use crate::message; use network_libp2p::PeerId; use crate::config::Roles; -use crate::service::Service as NetworkService; -use crate::specialization::NetworkSpecialization; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; /// Remote request timeout. @@ -42,97 +38,21 @@ 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); - - /// When block is announced by the peer. - fn on_block_announce(&self, peer: PeerId, best_number: NumberFor); - - /// 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> - ); - - /// When body response is received from remote node. - fn on_remote_body_response( - &self, - peer: PeerId, - response: message::BlockResponse - ); - - /// Check whether a block response is an `on_demand` response - fn is_on_demand_response(&self, peer: &PeerId, request_id: message::RequestId) -> bool; -} - -/// Trait used by the `OnDemand` service to communicate messages back to the network. +/// 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(&self, who: &PeerId, reputation_change: i32); + fn report_peer(&mut self, who: &PeerId, reputation_change: i32); /// Disconnect from the given peer. Used in case of misbehaviour. - fn disconnect_peer(&self, who: &PeerId); + fn disconnect_peer(&mut self, who: &PeerId); /// Send a request to a peer. - fn send_request(&self, who: &PeerId, message: message::Message); -} - -impl> OnDemandNetwork for Weak> { - fn report_peer(&self, who: &PeerId, reputation_change: i32) { - if let Some(service) = self.upgrade() { - service.report_peer(who.clone(), reputation_change) - } - } - - fn disconnect_peer(&self, who: &PeerId) { - if let Some(service) = self.upgrade() { - service.disconnect_peer(who.clone()) - } - } - - fn send_request(&self, who: &PeerId, message: message::Message) { - if let Some(service) = self.upgrade() { - service.send_request(who.clone(), message) - } - } + 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_interface: Mutex + Send + Sync + 'static>>>, -} - -/// 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>, @@ -147,7 +67,10 @@ 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>>), @@ -156,7 +79,10 @@ enum RequestData { OneShotSender>, ClientError>> ), RemoteCall(RemoteCallRequest, OneShotSender, ClientError>>), - RemoteChanges(RemoteChangesRequest, OneShotSender, u32)>, ClientError>>), + RemoteChanges( + RemoteChangesRequest, + OneShotSender, u32)>, ClientError>> + ), } enum Accept { @@ -165,103 +91,126 @@ enum Accept { Unexpected(RequestData), } -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), - }) +/// 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; + +impl FetchChecker for AlwaysBadChecker { + fn check_header_proof( + &self, + _request: &RemoteHeaderRequest, + _remote_header: Option, + _remote_proof: Vec> + ) -> Result { + Err(ClientError::Msg("AlwaysBadChecker".into())) } -} -impl OnDemand where - B::Header: HeaderT, -{ - /// Creates new on-demand service. - pub fn new(checker: Arc>) -> Self { - OnDemand { - checker, - network_interface: 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(), - }) - } + fn check_read_proof( + &self, + _request: &RemoteReadRequest, + _remote_proof: Vec> + ) -> Result>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) } - /// Get checker reference. - pub fn checker(&self) -> &Arc> { - &self.checker + 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())) } - /// Sets weak reference to network service. - pub fn set_network_interface(&self, network_interface: Box + Send + Sync + 'static>) { - self.network_interface.lock().replace(network_interface); + fn check_changes_proof( + &self, + _request: &RemoteChangesRequest, + _remote_proof: ChangesProof + ) -> Result, u32)>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) } - fn report_peer(&self, who: &PeerId, reputation_change: i32) { - self.network_interface - .lock() - .as_ref() - .expect("1. OnDemand is passed a network sender upon initialization of the service, 2. it should bet set by now") - .report_peer(who, reputation_change); + fn check_body_proof( + &self, + _request: &RemoteBodyRequest, + _body: Vec + ) -> Result, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) } +} - fn disconnect_peer(&self, who: &PeerId) { - self.network_interface - .lock() - .as_ref() - .expect("1. OnDemand is passed a network sender upon initialization of the service, 2. it should bet set by now") - .disconnect_peer(who); +impl OnDemandCore where + B::Header: HeaderT, +{ + /// Creates new on-demand requests processer. + pub fn new(checker: Arc>) -> Self { + OnDemandCore { + checker, + next_request_id: 0, + pending_requests: VecDeque::new(), + active_peers: LinkedHashMap::new(), + idle_peers: VecDeque::new(), + best_blocks: HashMap::new(), + } } - fn send_request(&self, who: &PeerId, msg: message::Message) { - self.network_interface - .lock() - .as_ref() - .expect("1. OnDemand is passed a network sender upon initialization of the service, 2. it should bet set by now") - .send_request(who, msg); + /// 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); } - /// 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 + /// 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; + + 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 => { info!("Invalid remote {} response from peer {}", rtype, peer); - self.report_peer(&peer, i32::min_value()); - self.disconnect_peer(&peer); - core.remove_peer(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) => { info!("Failed to check remote {} response from peer {}: {}", rtype, peer, error); - self.report_peer(&peer, i32::min_value()); - self.disconnect_peer(&peer); - core.remove_peer(peer); + 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)) @@ -273,60 +222,78 @@ impl OnDemand where }, Accept::Unexpected(retry_request_data) => { info!("Unexpected response to remote {} from peer", rtype); - self.report_peer(&peer, i32::min_value()); - self.disconnect_peer(&peer); - core.remove_peer(peer); + 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) { + 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.report_peer(&bad_peer, TIMEOUT_REPUTATION_CHANGE); - self.disconnect_peer(&bad_peer); + 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)); @@ -338,10 +305,15 @@ 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 { + 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 self.checker.check_read_proof(&request, response.proof) { + 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)); @@ -353,7 +325,7 @@ impl OnDemandService for OnDemand where ), }}, RequestData::RemoteReadChild(request, sender) => { - match self.checker.check_read_child_proof(&request, response.proof) { + 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)); @@ -368,9 +340,14 @@ impl OnDemandService for OnDemand where }) } - 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)); @@ -382,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, @@ -402,8 +384,13 @@ impl OnDemandService for OnDemand where }) } - fn on_remote_body_response(&self, peer: PeerId, response: message::BlockResponse) { - self.accept_response("body", peer, response.id, |request| match request.data { + 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 @@ -420,7 +407,7 @@ impl OnDemandService for OnDemand where } let body = bodies.remove(0); - match self.checker.check_body_proof(&request, body) { + match checker.check_body_proof(&request, body) { Ok(body) => { let _ = sender.send(Ok(body)); Accept::Ok @@ -432,83 +419,21 @@ impl OnDemandService for OnDemand where }) } - fn is_on_demand_response(&self, peer: &PeerId, request_id: message::RequestId) -> bool { - let core = self.core.lock(); - core.is_pending_request(&peer, request_id) - } -} - -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) = 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_read_child( - &self, - request: RemoteReadChildRequest - ) -> Self::RemoteReadResult { - let (sender, receiver) = channel(); - self.schedule_request( - request.retry_count.clone(), - RequestData::RemoteReadChild(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 }) - } - - 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 }) - } - - fn remote_body(&self, request: RemoteBodyRequest) -> Self::RemoteBodyResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteBody(request, sender), - RemoteResponse { receiver }) - } -} - -impl OnDemandCore where - B: BlockT, - B::Header: HeaderT, -{ - fn is_pending_request(&self, peer: &PeerId, request_id: message::RequestId) -> bool { + 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 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 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) { @@ -524,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(); @@ -610,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_request(&peer, request.message()); + network.send_request(&peer, request.message()); self.active_peers.insert(peer, request); } @@ -619,7 +504,7 @@ 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(), @@ -630,7 +515,7 @@ impl Request { } } - pub fn message(&self) -> message::Message { + fn message(&self) -> message::Message { match self.data { RequestData::RemoteHeader(ref data, _) => message::generic::Message::RemoteHeaderRequest(message::RemoteHeaderRequest { @@ -682,7 +567,7 @@ impl Request { } 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)); }, @@ -698,21 +583,20 @@ impl RequestData { #[cfg(test)] pub mod tests { use std::collections::HashSet; - use std::sync::{Arc, Mutex}; + use std::sync::Arc; use std::time::Instant; - use futures::Future; + 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::{Fetcher, FetchChecker, RemoteHeaderRequest, + use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, ChangesProof, RemoteCallRequest, RemoteReadRequest, RemoteReadChildRequest, RemoteChangesRequest, RemoteBodyRequest}; use crate::config::Roles; use crate::message; use network_libp2p::PeerId; - use super::{REQUEST_TIMEOUT, OnDemand, OnDemandNetwork, OnDemandService}; + 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 { @@ -776,19 +660,21 @@ pub mod tests { } } - 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]], }); @@ -806,152 +692,149 @@ pub mod tests { #[derive(Default)] struct DummyNetwork { - disconnected_peers: Mutex>, + disconnected_peers: HashSet, } - impl OnDemandNetwork for Arc { - fn report_peer(&self, _: &PeerId, _: i32) {} - fn disconnect_peer(&self, who: &PeerId) { - self.disconnected_peers.lock().unwrap().insert(who.clone()); + 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()); } - fn send_request(&self, _: &PeerId, _: message::Message) {} + fn send_request(&mut self, _: &PeerId, _: message::Message) {} } - fn assert_disconnected_peer(dummy: Arc) { - assert_eq!(dummy.disconnected_peers.lock().unwrap().len(), 1); + 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_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); let peer1 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.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_interface); + }, 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_interface = Arc::new(DummyNetwork::default()); - on_demand.set_network_interface(Box::new(network_interface.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_interface); - 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_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(false); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.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_interface); - 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_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.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_interface); + 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_interface = Arc::new(DummyNetwork::default()); - on_demand.set_network_interface(Box::new(network_interface.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_interface); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); + assert_disconnected_peer(&network_interface); + assert_eq!(on_demand.pending_requests.len(), 1); } #[test] @@ -960,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_interface = Arc::new(DummyNetwork::default()); - on_demand.set_network_interface(Box::new(network_interface.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(); }); @@ -988,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(); @@ -1000,48 +883,48 @@ pub mod tests { #[test] fn receives_remote_call_response() { - let (_x, on_demand) = dummy(true); - let network_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.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_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.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]], }); @@ -1050,25 +933,25 @@ pub mod tests { #[test] fn receives_remote_read_child_response() { - let (_x, on_demand) = dummy(true); - let network_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.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_child(RemoteReadChildRequest { + 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(); + let result = response.wait().unwrap().unwrap(); assert_eq!(result, Some(vec![42])); }); - on_demand.on_remote_read_response( + on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], @@ -1078,19 +961,19 @@ pub mod tests { #[test] fn receives_remote_header_response() { - let (_x, on_demand) = dummy(true); - let network_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.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\ @@ -1098,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(), @@ -1114,13 +997,13 @@ pub mod tests { #[test] fn receives_remote_changes_response() { - let (_x, on_demand) = dummy(true); - let network_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.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()), @@ -1128,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]], @@ -1146,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_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let peer2 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.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] @@ -1200,73 +1082,70 @@ 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_interface = Arc::new(DummyNetwork::default()); + 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_interface(Box::new(network_interface.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_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.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(peer1.clone(), Roles::FULL, 250); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); - assert!(on_demand.core.lock().idle_peers.iter().cloned().collect::>().is_empty()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); + 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 (_x, on_demand) = dummy(true); - let network_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.clone())); let header = dummy_header(); - on_demand.on_connect(peer1.clone(), Roles::FULL, 250); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); - on_demand.remote_body(RemoteBodyRequest { + on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { header: header.clone(), retry_count: None, - }); + }, oneshot::channel().0)); - assert!(on_demand.core.lock().pending_requests.is_empty()); - assert_eq!(on_demand.core.lock().active_peers.len(), 1); + assert!(on_demand.pending_requests.is_empty()); + assert_eq!(on_demand.active_peers.len(), 1); let block = message::BlockData:: { hash: primitives::H256::random(), @@ -1282,29 +1161,28 @@ pub mod tests { blocks: vec![block], }; - on_demand.on_remote_body_response(peer1.clone(), response); + on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); - assert!(on_demand.core.lock().active_peers.is_empty()); - assert_eq!(on_demand.core.lock().idle_peers.len(), 1); + 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 (_x, on_demand) = dummy(true); - let network_interface = Arc::new(DummyNetwork::default()); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); - on_demand.set_network_interface(Box::new(network_interface.clone())); let header = dummy_header(); - on_demand.on_connect(peer1.clone(), Roles::FULL, 250); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); - on_demand.remote_body(RemoteBodyRequest { + on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { header: header.clone(), retry_count: None, - }); + }, oneshot::channel().0)); - assert!(on_demand.core.lock().pending_requests.is_empty()); - assert_eq!(on_demand.core.lock().active_peers.len(), 1); + 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:: { @@ -1322,8 +1200,8 @@ pub mod tests { } }; - on_demand.on_remote_body_response(peer1.clone(), response); - assert!(on_demand.core.lock().active_peers.is_empty()); - assert!(on_demand.core.lock().idle_peers.is_empty(), "peer should be disconnected after bad response"); + 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 0000000000..95f9f4d67b --- /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 c9e56362d1..b3102e588e 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -30,7 +30,7 @@ use crate::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, Context as SyncContext, Status as SyncStatus, SyncState}; use crate::service::{TransactionPool, ExHashT}; @@ -41,7 +41,7 @@ use std::sync::Arc; use std::{cmp, num::NonZeroUsize, time}; use log::{trace, debug, warn, error}; use crate::chain::{Client, FinalityProofProvider}; -use client::light::fetcher::ChangesProof; +use client::light::fetcher::{FetchChecker, ChangesProof}; use crate::{error, util::LruHashSet}; const REQUEST_TIMEOUT_SEC: u64 = 40; @@ -83,7 +83,8 @@ pub struct Protocol, H: ExHashT> { /// 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, @@ -159,6 +160,20 @@ pub trait NetworkOut { 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 { /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or @@ -263,7 +278,7 @@ impl, H: ExHashT> Protocol { pub fn new( config: ProtocolConfig, chain: Arc>, - on_demand: Option>>, + checker: Arc>, specialization: S, ) -> error::Result> { let info = chain.info()?; @@ -276,7 +291,7 @@ impl, H: ExHashT> Protocol { peers: HashMap::new(), chain, }, - on_demand, + on_demand_core: OnDemandCore::new(checker), genesis_hash: info.chain.genesis_hash, sync, specialization: specialization, @@ -307,6 +322,13 @@ impl, H: ExHashT> Protocol { 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, @@ -324,7 +346,7 @@ impl, H: ExHashT> Protocol { } fn is_on_demand_response(&self, who: &PeerId, response_id: message::RequestId) -> bool { - self.on_demand.as_ref().map_or(false, |od| od.is_on_demand_response(&who, response_id)) + self.on_demand_core.is_on_demand_response(&who, response_id) } fn handle_response( @@ -378,7 +400,7 @@ impl, H: ExHashT> Protocol { GenericMessage::BlockResponse(r) => { // 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(who, r); + 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); @@ -394,13 +416,20 @@ impl, H: ExHashT> Protocol { 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(who, response), - GenericMessage::RemoteReadRequest(request) => self.on_remote_read_request(network_out, who, request), - GenericMessage::RemoteReadResponse(response) => self.on_remote_read_response(who, response), - GenericMessage::RemoteHeaderRequest(request) => self.on_remote_header_request(network_out, who, request), - GenericMessage::RemoteHeaderResponse(response) => self.on_remote_header_response(who, response), - GenericMessage::RemoteChangesRequest(request) => self.on_remote_changes_request(network_out, who, request), - GenericMessage::RemoteChangesResponse(response) => self.on_remote_changes_response(who, response), + 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) => @@ -480,7 +509,7 @@ impl, H: ExHashT> Protocol { } /// Called by peer when it is disconnecting - pub fn on_peer_disconnected(&mut self, network_out: &mut dyn NetworkOut, 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 = { @@ -494,7 +523,7 @@ impl, H: ExHashT> Protocol { } 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); } } @@ -514,7 +543,12 @@ impl, H: ExHashT> Protocol { } } - fn on_block_request(&mut self, network_out: &mut dyn NetworkOut, 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, @@ -643,13 +677,11 @@ impl, H: ExHashT> Protocol { /// Perform time based maintenance. /// /// > **Note**: This method normally doesn't have to be called except for testing purposes. - pub fn tick(&mut self, network_out: &mut dyn NetworkOut) { + 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 - .as_ref() - .map(|s| s.maintain_peers()); + self.on_demand_core.maintain_peers(&mut network_out); } fn maintain_peers(&mut self, network_out: &mut dyn NetworkOut) { @@ -681,7 +713,7 @@ impl, H: ExHashT> Protocol { } /// Called by peer to report status - fn on_status_message(&mut self, network_out: &mut dyn NetworkOut, 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) { @@ -756,10 +788,8 @@ impl, H: ExHashT> Protocol { status.version }; + 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.on_demand - .as_ref() - .map(|s| s.on_connect(who.clone(), status.roles, status.best_number)); self.sync.new_peer(&mut context, who.clone()); if protocol_version > 2 { self.consensus_gossip.new_peer(&mut context, who.clone(), status.roles); @@ -875,7 +905,7 @@ impl, H: ExHashT> Protocol { fn on_block_announce( &mut self, - network_out: &mut dyn NetworkOut, + mut network_out: &mut dyn NetworkOut, who: PeerId, announce: message::BlockAnnounce ) { @@ -886,9 +916,7 @@ 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, network_out), who.clone(), @@ -1029,7 +1057,12 @@ impl, H: ExHashT> Protocol { /// 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) { + 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); } @@ -1042,11 +1075,14 @@ impl, H: ExHashT> Protocol { self.sync.finality_proof_import_result(request_block, finalization_result) } - fn on_remote_call_response(&mut self, who: PeerId, response: message::RemoteCallResponse) { + 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( @@ -1079,11 +1115,15 @@ 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( @@ -1119,13 +1159,12 @@ 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( @@ -1182,6 +1221,7 @@ impl, H: ExHashT> Protocol { fn on_remote_changes_response( &mut self, + mut network_out: &mut dyn NetworkOut, who: PeerId, response: message::RemoteChangesResponse, B::Hash>, ) { @@ -1190,9 +1230,7 @@ impl, H: ExHashT> Protocol { who, response.max ); - self.on_demand - .as_ref() - .map(|s| s.on_remote_changes_response(who, response)); + self.on_demand_core.on_remote_changes_response(&mut network_out, who, response); } fn on_finality_proof_request( @@ -1250,10 +1288,13 @@ impl, H: ExHashT> Protocol { } } - fn on_remote_body_response(&self, peer: PeerId, response: message::BlockResponse) { - self.on_demand - .as_ref() - .map(|od| od.on_remote_body_response(peer, response)); + 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); } } diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 4516609c5e..b2e56a83bd 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -29,9 +29,11 @@ use peerset::PeersetHandle; 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::on_demand::RequestData; use crate::protocol::{self, Context, CustomMessageOutcome, Protocol, ConnectedPeer}; use crate::protocol::{ProtocolStatus, PeerInfo, NetworkOut}; use crate::config::Params; @@ -216,7 +218,8 @@ impl> Service { let protocol = Protocol::new( params.config, params.chain, - params.on_demand, + params.on_demand.as_ref().map(|od| od.checker().clone()) + .unwrap_or(Arc::new(AlwaysBadChecker)), params.specialization, )?; let versions: Vec<_> = ((protocol::MIN_VERSION as u8)..=(protocol::CURRENT_VERSION as u8)).collect(); @@ -234,6 +237,7 @@ impl> Service { status_sinks.clone(), params.network_config, registered, + params.on_demand.and_then(|od| od.extract_receiver()), )?; let service = Arc::new(Service { @@ -531,6 +535,7 @@ fn start_thread, H: ExHashT>( 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) { @@ -558,7 +563,8 @@ fn start_thread, H: ExHashT>( network_port, protocol_rx, status_sinks, - peerset_clone + peerset_clone, + on_demand_in ) .select(close_rx.then(|_| Ok(()))) .map(|(val, _)| val) @@ -589,6 +595,7 @@ fn run_thread, H: ExHashT>( 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); @@ -628,6 +635,13 @@ fn run_thread, H: ExHashT>( 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); + } + } + loop { match network_port.poll() { Ok(Async::NotReady) => break, diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 7cbbbf1370..13d18a0d44 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -24,6 +24,7 @@ mod sync; use std::collections::{HashMap, HashSet, VecDeque}; use std::sync::Arc; +use crate::AlwaysBadChecker; use log::trace; use crate::chain::FinalityProofProvider; use client::{self, ClientInfo, BlockchainEvents, FinalityNotifications}; @@ -956,7 +957,7 @@ pub trait TestNetFactory: Sized { let protocol = Protocol::new( config.clone(), client.clone(), - None, + Arc::new(AlwaysBadChecker), specialization, ).unwrap(); @@ -1010,7 +1011,7 @@ pub trait TestNetFactory: Sized { let protocol = Protocol::new( config, client.clone(), - None, + Arc::new(AlwaysBadChecker), specialization, ).unwrap(); diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index bc257dcd26..81e153b7ae 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -182,7 +182,7 @@ impl Service { network_config: config.network.clone(), chain: client.clone(), finality_proof_provider, - on_demand: on_demand.as_ref().map(|d| d.clone() as _), + on_demand, transaction_pool: transaction_pool_adapter.clone() as _, specialization: network_protocol, }; @@ -202,9 +202,6 @@ impl Service { let has_bootnodes = !network_params.network_config.boot_nodes.is_empty(); let network = network::Service::new(network_params, protocol_id, import_queue)?; - if let Some(on_demand) = on_demand.as_ref() { - on_demand.set_network_interface(Box::new(Arc::downgrade(&network))); - } let inherents_pool = Arc::new(InherentsPool::default()); let offchain_workers = if config.offchain_worker { -- GitLab From e7e53ea6bbb33a460d5e8fd8e9f656781cde979a Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 23 May 2019 21:17:58 +0200 Subject: [PATCH 016/140] Make peerset ban nodes under a reputation (#2667) --- core/peerset/src/lib.rs | 85 +++++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 12 deletions(-) diff --git a/core/peerset/src/lib.rs b/core/peerset/src/lib.rs index ac076be4b5..9b5155455a 100644 --- a/core/peerset/src/lib.rs +++ b/core/peerset/src/lib.rs @@ -25,6 +25,8 @@ use libp2p::PeerId; use log::{debug, error, trace}; use serde_json::json; +/// 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; @@ -232,7 +234,13 @@ impl Peerset { self.update_time(); match self.data.peer(&peer_id) { - peersstate::Peer::Connected(mut peer) => peer.add_reputation(score_diff), + 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)); + } + }, peersstate::Peer::NotConnected(mut peer) => peer.add_reputation(score_diff), peersstate::Peer::Unknown(peer) => peer.discover().add_reputation(score_diff), } @@ -283,22 +291,27 @@ impl Peerset { fn alloc_slots(&mut self) { 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.reserved_not_connected_peer() { + let next = match self.data.highest_not_connected_peer() { Some(p) => p, - None => if self.reserved_only { - break // No known node to add. - } else { - match self.data.highest_not_connected_peer() { - Some(p) => p, - None => break, // No known node to add. - } - } + None => break, // No known node to add. }; // Don't connect to nodes with an abysmal reputation. - if next.reputation() == i32::min_value() { + if next.reputation() < BANNED_THRESHOLD { break; } @@ -321,6 +334,7 @@ impl Peerset { // `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 {:?}", 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. @@ -329,6 +343,11 @@ impl Peerset { peersstate::Peer::Unknown(entry) => entry.discover(), }; + if not_connected.reputation() < BANNED_THRESHOLD { + 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)), @@ -430,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 { @@ -528,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(); + } } -- GitLab From c5b9acfe046f0c9707743b99c5e4936561fbd3fa Mon Sep 17 00:00:00 2001 From: Tengfei Niu Date: Fri, 24 May 2019 13:44:09 +0800 Subject: [PATCH 017/140] remove unused import (#2678) remove unused import --- core/rpc/src/chain/number.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/core/rpc/src/chain/number.rs b/core/rpc/src/chain/number.rs index 7983ac6c78..f927d51f14 100644 --- a/core/rpc/src/chain/number.rs +++ b/core/rpc/src/chain/number.rs @@ -17,7 +17,6 @@ use serde::Deserialize; use std::{convert::TryFrom, fmt::Debug}; use primitives::U256; -use runtime_primitives::traits; /// RPC Block number type /// -- GitLab From d713fbc358106ec7d400dea0a1d644a8448942ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 24 May 2019 11:35:31 +0200 Subject: [PATCH 018/140] Expunge error-chain (feat. tomaka) (#2662) * Remove error_chain * Expunge error-chain from rpc and service. * Expunge from transaction pool. * Expunge from node/cli * Expunge from keystore. * Remove some boilerplate. * Fix remaining stuff. * Improve on deprecation message. * Fix issues. * Fix trnsaction pool tests. * Fix the rest. * Fix borked merge. * Update lock --- Cargo.lock | 27 +- Cargo.toml | 1 - core/cli/Cargo.toml | 2 +- core/cli/src/error.rs | 50 ++-- core/cli/src/lib.rs | 25 +- core/client/db/src/cache/list_cache.rs | 2 +- core/client/db/src/lib.rs | 2 +- core/client/db/src/utils.rs | 2 +- core/client/src/client.rs | 14 +- core/consensus/aura/Cargo.toml | 1 - core/consensus/aura/src/lib.rs | 22 +- core/consensus/babe/Cargo.toml | 1 - core/consensus/babe/src/lib.rs | 20 +- core/consensus/common/Cargo.toml | 2 +- core/consensus/common/src/error.rs | 153 +++++------ core/consensus/common/src/evaluation.rs | 67 +++-- core/consensus/common/src/lib.rs | 2 +- core/consensus/rhd/Cargo.toml | 2 +- core/consensus/rhd/src/error.rs | 57 ++-- core/consensus/slots/Cargo.toml | 1 - core/consensus/slots/src/lib.rs | 5 - core/consensus/slots/src/slots.rs | 6 +- core/executor/Cargo.toml | 2 +- core/executor/src/error.rs | 107 ++++---- core/executor/src/native_executor.rs | 14 +- core/executor/src/sandbox.rs | 3 +- core/executor/src/wasm_executor.rs | 14 +- core/finality-grandpa/src/import.rs | 40 +-- core/finality-grandpa/src/lib.rs | 2 +- core/finality-grandpa/src/light_import.rs | 21 +- core/keystore/Cargo.toml | 2 +- core/keystore/src/lib.rs | 56 ++-- core/network-libp2p/Cargo.toml | 1 - core/network/Cargo.toml | 2 +- core/network/src/error.rs | 31 ++- core/network/src/test/mod.rs | 4 +- core/rpc/Cargo.toml | 2 +- core/rpc/src/author/error.rs | 69 ++--- core/rpc/src/author/mod.rs | 9 +- core/rpc/src/chain/error.rs | 43 +-- core/rpc/src/chain/mod.rs | 2 +- core/rpc/src/errors.rs | 8 - core/rpc/src/state/error.rs | 45 ++-- core/rpc/src/state/mod.rs | 27 +- core/rpc/src/state/tests.rs | 4 +- core/rpc/src/system/error.rs | 39 ++- core/service/Cargo.toml | 2 +- core/service/src/components.rs | 2 +- core/service/src/error.rs | 53 ++-- core/service/src/lib.rs | 4 +- core/test-runtime/wasm/Cargo.lock | 265 ++++++++----------- core/transaction-pool/Cargo.toml | 2 +- core/transaction-pool/graph/Cargo.toml | 2 +- core/transaction-pool/graph/src/base_pool.rs | 9 +- core/transaction-pool/graph/src/error.rs | 77 +++--- core/transaction-pool/graph/src/pool.rs | 22 +- core/transaction-pool/graph/src/ready.rs | 3 +- core/transaction-pool/src/error.rs | 35 +-- node-template/Cargo.toml | 2 +- node-template/runtime/wasm/Cargo.lock | 264 ++++++++---------- node-template/src/error.rs | 13 - node-template/src/main.rs | 10 +- node-template/src/service.rs | 20 +- node/cli/src/error.rs | 32 --- node/cli/src/service.rs | 4 +- node/runtime/wasm/Cargo.lock | 264 ++++++++---------- node/src/main.rs | 10 +- scripts/gitlab/check_line_width.sh | 5 +- 68 files changed, 952 insertions(+), 1159 deletions(-) delete mode 100644 node-template/src/error.rs delete mode 100644 node/cli/src/error.rs diff --git a/Cargo.lock b/Cargo.lock index 5550265cf4..5347186c37 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2124,7 +2124,7 @@ name = "node-template" version = "2.0.0" dependencies = [ "ctrlc 3.1.2 (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)", "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)", @@ -3764,7 +3764,6 @@ name = "substrate" version = "2.0.0" dependencies = [ "ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "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)", "node-cli 2.0.0", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3806,8 +3805,8 @@ dependencies = [ "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)", + "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)", - "error-chain 0.12.0 (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)", @@ -3892,7 +3891,6 @@ name = "substrate-consensus-aura" version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "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.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3946,7 +3944,6 @@ name = "substrate-consensus-babe" version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "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)", "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3992,7 +3989,7 @@ name = "substrate-consensus-common" 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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4010,7 +4007,7 @@ dependencies = [ name = "substrate-consensus-rhd" 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)", "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)", @@ -4035,7 +4032,6 @@ dependencies = [ name = "substrate-consensus-slots" 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.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4054,7 +4050,7 @@ 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)", + "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)", @@ -4137,7 +4133,7 @@ dependencies = [ name = "substrate-keystore" 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)", "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)", @@ -4151,8 +4147,8 @@ name = "substrate-network" version = "2.0.0" dependencies = [ "bitflags 1.0.4 (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)", - "error-chain 0.12.0 (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)", @@ -4182,7 +4178,6 @@ dependencies = [ "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)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.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)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4290,7 +4285,7 @@ name = "substrate-rpc" 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)", "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)", @@ -4341,7 +4336,7 @@ dependencies = [ name = "substrate-service" 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)", "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)", @@ -4487,8 +4482,8 @@ name = "substrate-transaction-graph" version = "2.0.0" dependencies = [ "assert_matches 1.3.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)", - "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.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4503,7 +4498,7 @@ dependencies = [ name = "substrate-transaction-pool" 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.5.1 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index f109d235af..3ccbb1c26d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,6 @@ 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"] } diff --git a/core/cli/Cargo.toml b/core/cli/Cargo.toml index 2482323c80..54cde50d1a 100644 --- a/core/cli/Cargo.toml +++ b/core/cli/Cargo.toml @@ -7,8 +7,8 @@ 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" diff --git a/core/cli/src/error.rs b/core/cli/src/error.rs index 07d14eb479..b052a29710 100644 --- a/core/cli/src/error.rs +++ b/core/cli/src/error.rs @@ -16,26 +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"]; - Client(client::error::Error) #[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/lib.rs b/core/cli/src/lib.rs index 82ebf8ec05..e629788e80 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -55,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; @@ -145,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(); @@ -278,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`. @@ -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); } @@ -392,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); @@ -417,7 +412,7 @@ where 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()))? ), }; @@ -851,7 +846,7 @@ mod tests { 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())) }) }) } @@ -877,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())) }) }) } @@ -911,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())) }) }) } @@ -928,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/client/db/src/cache/list_cache.rs b/core/client/db/src/cache/list_cache.rs index 3c74ac2d1f..4f343e93fd 100644 --- a/core/client/db/src/cache/list_cache.rs +++ b/core/client/db/src/cache/list_cache.rs @@ -45,7 +45,7 @@ use log::warn; use client::error::{Error as ClientError, Result as ClientResult}; use runtime_primitives::traits::{ - Block as BlockT, NumberFor, Zero, Bounded, SaturatedConversion, CheckedSub + Block as BlockT, NumberFor, Zero, Bounded, CheckedSub }; use crate::cache::{CacheItemT, ComplexBlockId, EntryType}; diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 0e65e17f8d..8f54099a78 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -48,7 +48,7 @@ use primitives::storage::well_known_keys; use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; use runtime_primitives::traits::{ Block as BlockT, Header as HeaderT, NumberFor, Zero, One, Digest, DigestItem, - SaturatedConversion, UniqueSaturatedFrom, UniqueSaturatedInto + SaturatedConversion, }; use runtime_primitives::BuildStorage; use state_machine::backend::Backend as StateBackend; diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index eec476f40e..43c559b349 100644 --- a/core/client/db/src/utils.rs +++ b/core/client/db/src/utils.rs @@ -31,7 +31,7 @@ use trie::DBValue; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ Block as BlockT, Header as HeaderT, Zero, UniqueSaturatedFrom, - UniqueSaturatedInto, SaturatedConversion, CheckedConversion + UniqueSaturatedInto, CheckedConversion }; use crate::DatabaseSettings; diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 5b849e1352..c9f70039ea 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -29,7 +29,7 @@ use runtime_primitives::{ generic::{BlockId, SignedBlock}, }; use consensus::{ - Error as ConsensusError, ErrorKind as ConsensusErrorKind, ImportBlock, + Error as ConsensusError, ImportBlock, ImportResult, BlockOrigin, ForkChoiceStrategy, well_known_cache_keys::Id as CacheKeyId, SelectChain, self, @@ -1387,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. @@ -1397,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), @@ -1405,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 => {}, @@ -1641,14 +1641,14 @@ where fn leaves(&self) -> Result::Hash>, ConsensusError> { LongestChain::leaves(self) - .map_err(|e| ConsensusErrorKind::ChainLookup(e.to_string()).into()) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) } fn best_chain(&self) -> Result<::Header, ConsensusError> { LongestChain::best_block_header(&self) - .map_err(|e| ConsensusErrorKind::ChainLookup(e.to_string()).into()) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) } fn finality_target( @@ -1657,7 +1657,7 @@ where maybe_max_number: Option> ) -> Result, ConsensusError> { LongestChain::best_containing(self, target_hash, maybe_max_number) - .map_err(|e| ConsensusErrorKind::ChainLookup(e.to_string()).into()) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) } } diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index 8a589aa126..6e489cf8a9 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -24,7 +24,6 @@ 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" [dev-dependencies] diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 429666585d..59483a5688 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -50,7 +50,7 @@ use runtime_primitives::traits::{ 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::{Future, IntoFuture, future, stream::Stream}; @@ -122,10 +122,6 @@ fn slot_author(slot_num: u64, authorities: &[AuthorityId

]) -> Option Some(current_author) } -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 @@ -177,7 +173,8 @@ impl SlotCompatible for AuraSlotCompatible { ) -> 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) } } @@ -448,7 +445,7 @@ impl SlotWorker for AuraWorker(client: &C) -> Result<(), ConsensusError> return Ok(()); } - let map_err = |error| consensus_common::Error::from(consensus_common::ErrorKind::ClientImport( + let map_err = |error| consensus_common::Error::from(consensus_common::Error::ClientImport( format!( "Error initializing authorities cache: {}", error, @@ -766,7 +763,7 @@ fn authorities(client: &C, at: &BlockId) -> Result as CompatibleDigestItem>::aura_seal( slot_num, signature, @@ -1120,7 +1118,7 @@ mod tests { // 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()); diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 8ecfa05c4d..bc557ffb56 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -25,7 +25,6 @@ runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } futures = "0.1.26" tokio = "0.1.18" parking_lot = "0.7.1" -error-chain = "0.12.0" log = "0.4.6" schnorrkel = "0.1.1" rand = "0.6.5" diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index c3d73b6e49..cccbc160c6 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -40,7 +40,7 @@ use primitives::{ sr25519::{Public, Signature, LocalizedSignature, self}, }; use merlin::Transcript; -use inherents::{InherentDataProviders, InherentData, RuntimeString}; +use inherents::{InherentDataProviders, InherentData}; use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_WARN, CONSENSUS_INFO}; use schnorrkel::{ keys::Keypair, @@ -191,10 +191,6 @@ impl Config { } } -fn inherent_to_common_error(err: RuntimeString) -> consensus_common::Error { - consensus_common::ErrorKind::InherentData(err.into()).into() -} - /// 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 @@ -243,7 +239,8 @@ impl SlotCompatible for BabeSlotCompatible { trace!(target: "babe", "extract timestamp"); data.timestamp_inherent_data() .and_then(|t| data.babe_inherent_data().map(|a| (t, a))) - .map_err(slots::inherent_to_common_error) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) } } @@ -520,7 +517,7 @@ impl SlotWorker for BabeWorker whe }) .map_err(|e| { warn!("Client import failed: {:?}", e); - consensus_common::ErrorKind::ClientImport(format!("{:?}", e)).into() + consensus_common::Error::ClientImport(format!("{:?}", e)) }) ) } @@ -585,7 +582,7 @@ fn check_header( format!("VRF verification failed") })? }; - + if check(&inout, threshold) { match check_equivocation(&client, slot_now, slot_num, header.clone(), signer.clone()) { Ok(Some(equivocation_proof)) => { @@ -797,7 +794,7 @@ fn authorities(client: &C, at: &BlockId) -> Result< panic!("We don’t support deprecated code with new consensus algorithms, \ therefore this is unreachable; qed") } - }).ok_or_else(|| consensus_common::ErrorKind::InvalidAuthoritiesSet.into()) + }).ok_or(consensus_common::Error::InvalidAuthoritiesSet) } /// The BABE import queue type. @@ -812,7 +809,8 @@ fn register_babe_inherent_data_provider( if !inherent_data_providers.has_provider(&srml_babe::INHERENT_IDENTIFIER) { inherent_data_providers .register_provider(srml_babe::InherentDataProvider::new(slot_duration)) - .map_err(inherent_to_common_error) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) } else { Ok(()) } @@ -1019,7 +1017,7 @@ mod tests { 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(); diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index 4031830108..5e55d555dd 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -6,12 +6,12 @@ description = "Common utilities for substrate consensus" edition = "2018" [dependencies] +derive_more = "0.14.0" crossbeam-channel = "0.3.4" 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" } diff --git a/core/consensus/common/src/error.rs b/core/consensus/common/src/error.rs index 71517c5440..a923c5f555 100644 --- a/core/consensus/common/src/error.rs +++ b/core/consensus/common/src/error.rs @@ -16,100 +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), - } - - /// Error from the client while importing - ChainLookup(reason: String) { - description("Looking up chain failed"), - display("Chain lookup 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 7f1f527042..ed7515a419 100644 --- a/core/consensus/common/src/evaluation.rs +++ b/core/consensus/common/src/evaluation.rs @@ -20,37 +20,36 @@ use super::MAX_BLOCK_SIZE; use parity_codec::Encode; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, One, CheckedConversion}; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind, bail}; // 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; -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) - ), - } - } +/// 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( @@ -61,24 +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 + One::one() != *proposal.header().number() { - bail!(ErrorKind::WrongNumber( - parent_number.checked_into::().map(|x| x + 1), - (*proposal.header().number()).checked_into::() - )); + 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/lib.rs b/core/consensus/common/src/lib.rs index 5e308ba8fe..d28864a0cc 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -47,7 +47,7 @@ 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, FinalityProofImport, FinalityProofRequestBuilder, diff --git a/core/consensus/rhd/Cargo.toml b/core/consensus/rhd/Cargo.toml index 8535f3f006..3f0a79a863 100644 --- a/core/consensus/rhd/Cargo.toml +++ b/core/consensus/rhd/Cargo.toml @@ -6,6 +6,7 @@ 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 3808110975..601cf1c963 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/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index c02559185f..ee3571bcdc 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -15,5 +15,4 @@ 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/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index 4ae72fd92a..783cb018b9 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -65,11 +65,6 @@ pub trait SlotCompatible { ) -> 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. #[deprecated(since = "1.1", note = "Please spawn a thread manually")] pub fn start_slot_worker_thread( diff --git a/core/consensus/slots/src/slots.rs b/core/consensus/slots/src/slots.rs index df21ae9b83..964eeaff29 100644 --- a/core/consensus/slots/src/slots.rs +++ b/core/consensus/slots/src/slots.rs @@ -19,7 +19,7 @@ //! This is used instead of `tokio_timer::Interval` because it was unreliable. use super::SlotCompatible; -use consensus_common::{Error, ErrorKind}; +use consensus_common::Error; use futures::prelude::*; use futures::try_ready; use inherents::{InherentData, InherentDataProviders}; @@ -125,7 +125,7 @@ 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)))); + .map_err(Error::FaultyTimer)); } // timeout has fired. @@ -133,7 +133,7 @@ impl Stream for Slots { let inherent_data = self .inherent_data_providers .create_inherent_data() - .map_err(crate::inherent_to_common_error)?; + .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. diff --git a/core/executor/Cargo.toml b/core/executor/Cargo.toml index 0272ce2f47..8f39d35c79 100644 --- a/core/executor/Cargo.toml +++ b/core/executor/Cargo.toml @@ -5,7 +5,7 @@ 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" } diff --git a/core/executor/src/error.rs b/core/executor/src/error.rs index b27ccf01bf..fdcb6cbc0e 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 0a702a5a1b..0a6f50d001 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}; @@ -55,7 +55,7 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( ) -> 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()) @@ -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) => { @@ -88,7 +88,7 @@ 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)) @@ -101,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. @@ -248,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 cc21d762be..24c8ad66ea 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 3fe1a1c3cc..988b6ddcf3 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -26,7 +26,7 @@ use wasmi::{ use wasmi::RuntimeValue::{I32, I64, self}; use wasmi::memory_units::{Pages}; use state_machine::{Externalities, ChildStorageKey}; -use crate::error::{Error, ErrorKind, Result}; +use crate::error::{Error, Result}; use crate::wasm_utils::UserError; use primitives::{blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair}; use primitives::hexdisplay::HexDisplay; @@ -769,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()) } @@ -795,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) } @@ -828,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) })?; @@ -841,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); @@ -877,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") diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index cd5ca02a5b..1966913c72 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -26,7 +26,7 @@ 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, }; @@ -187,11 +187,11 @@ where match maybe_change { Err(e) => 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 @@ -216,7 +216,7 @@ where ); match maybe_change { - Err(e) => 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, @@ -301,12 +301,12 @@ where guard.as_mut().add_pending_change( change, &is_descendent_of, - ).map_err(|e| ConsensusError::from(ConsensusErrorKind::ClientImport(e.to_string())))?; + ).map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; } let applied_changes = { let forced_change_set = guard.as_mut().apply_forced_changes(hash, number, &is_descendent_of) - .map_err(|e| ConsensusErrorKind::ClientImport(e.to_string())) + .map_err(|e| ConsensusError::ClientImport(e.to_string())) .map_err(ConsensusError::from)?; if let Some((median_last_finalized_number, new_set)) = forced_change_set { @@ -318,14 +318,14 @@ where // with. we use the minimum between the median and the local // best finalized block. let best_finalized_number = self.inner.backend().blockchain().info() - .map_err(|e| ConsensusErrorKind::ClientImport(e.to_string()))? + .map_err(|e| ConsensusError::ClientImport(e.to_string()))? .finalized_number; let canon_number = best_finalized_number.min(median_last_finalized_number); let canon_hash = self.inner.backend().blockchain().header(BlockId::Number(canon_number)) - .map_err(|e| ConsensusErrorKind::ClientImport(e.to_string()))? + .map_err(|e| ConsensusError::ClientImport(e.to_string()))? .expect("the given block number is less or equal than the current best finalized number; \ current best finalized number must exist in chain; qed.") .hash(); @@ -343,7 +343,7 @@ where AppliedChanges::Forced(new_authorities) } else { let did_standard = guard.as_mut().enacts_standard_change(hash, number, &is_descendent_of) - .map_err(|e| ConsensusErrorKind::ClientImport(e.to_string())) + .map_err(|e| ConsensusError::ClientImport(e.to_string())) .map_err(ConsensusError::from)?; if let Some(root) = did_standard { @@ -399,7 +399,7 @@ impl, RA, PRA, SC> 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, SC> 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,7 +509,7 @@ impl, RA, PRA, SC> BlockImport } } -impl, RA, PRA, SC> +impl, RA, PRA, SC> GrandpaBlockImport { pub(crate) fn new( @@ -559,7 +559,7 @@ where ); 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, }; @@ -579,17 +579,17 @@ where command {}, signaling voter.", number, command); if let Err(e) = self.send_voter_commands.unbounded_send(command) { - return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()); + return Err(ConsensusError::ClientImport(e.to_string()).into()); } }, Err(CommandOrError::Error(e)) => { 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/lib.rs b/core/finality-grandpa/src/lib.rs index 53dd9d2a57..75aa4d85ce 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -441,7 +441,7 @@ fn register_finality_tracker_inherent_data_provider, RA> BlockImport block: ImportBlock, new_cache: HashMap>, ) -> Result { - do_import_block::<_, _, _, _, GrandpaJustification>(&*self.client, &mut *self.data.write(), block, new_cache) + do_import_block::<_, _, _, _, GrandpaJustification>( + &*self.client, &mut *self.data.write(), block, new_cache + ) } fn check_block( @@ -238,7 +240,7 @@ fn do_import_block, RA, J>( let mut imported_aux = match import_result { Ok(ImportResult::Imported(aux)) => aux, Ok(r) => return Ok(r), - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), }; match justification { @@ -294,12 +296,13 @@ fn do_import_finality_proof, RA, J>( authorities, authority_set_provider, finality_proof, - ).map_err(|e| ConsensusError::from(ConsensusErrorKind::ClientImport(e.to_string())))?; + ).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)?; + 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(); @@ -313,7 +316,7 @@ fn do_import_finality_proof, RA, J>( 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::from(ConsensusErrorKind::ClientImport(e.to_string())))?; + .map_err(|e| ConsensusError::ClientImport(e.to_string()))?; do_finalize_block( client, data, @@ -383,7 +386,7 @@ fn do_import_justification, RA, J>( hash, ); - return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()); + return Err(ConsensusError::ClientImport(e.to_string()).into()); }, Ok(justification) => { trace!( @@ -417,7 +420,7 @@ fn do_finalize_block, RA>( // 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::from(ConsensusErrorKind::ClientImport(e.to_string())) + ConsensusError::ClientImport(e.to_string()) })?; // forget obsoleted consensus changes @@ -513,7 +516,7 @@ fn require_insert_aux, RA>( 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::from(ConsensusErrorKind::ClientImport(error.to_string())) + ConsensusError::ClientImport(error.to_string()) } #[cfg(test)] diff --git a/core/keystore/Cargo.toml b/core/keystore/Cargo.toml index 99f0ebedd2..1d4f146b7e 100644 --- a/core/keystore/Cargo.toml +++ b/core/keystore/Cargo.toml @@ -5,8 +5,8 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] +derive_more = "0.14.0" substrate-primitives = { path = "../primitives" } -error-chain = "0.12" hex = "0.3" rand = "0.6" serde_json = "1.0" diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index 9e6d4ec83c..67cf2c8d32 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -16,38 +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}; -error_chain! { - foreign_links { - Io(io::Error); - Json(serde_json::Error); - } +/// 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, +} - 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"), +/// Keystore Result +pub type Result = std::result::Result; + +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, } } } @@ -77,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) } @@ -92,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) } diff --git a/core/network-libp2p/Cargo.toml b/core/network-libp2p/Cargo.toml index be631aa4b9..a2ea8660a2 100644 --- a/core/network-libp2p/Cargo.toml +++ b/core/network-libp2p/Cargo.toml @@ -10,7 +10,6 @@ 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.8.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index c3184ab47d..d3b7a71f03 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -9,9 +9,9 @@ edition = "2018" [lib] [dependencies] +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" diff --git a/core/network/src/error.rs b/core/network/src/error.rs index 87b967765c..95a1dc5abe 100644 --- a/core/network/src/error.rs +++ b/core/network/src/error.rs @@ -14,22 +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."]; - Client(client::error::Error) #[doc="Client error"]; - } +/// Result type alias for the network. +pub type Result = std::result::Result; + +/// 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/test/mod.rs b/core/network/src/test/mod.rs index 13d18a0d44..ac9e9a98eb 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -37,7 +37,7 @@ use consensus::import_queue::{ Link, SharedBlockImport, SharedJustificationImport, Verifier, SharedFinalityProofImport, SharedFinalityProofRequestBuilder, }; -use consensus::{Error as ConsensusError, ErrorKind as ConsensusErrorKind}; +use consensus::{Error as ConsensusError}; use consensus::{BlockOrigin, ForkChoiceStrategy, ImportBlock, JustificationImport}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient, TopicNotification}; use futures::{prelude::*, sync::{mpsc, oneshot}}; @@ -1228,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()) } } diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index d0ead8224e..d69d7e17be 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" jsonrpc-core = "10.0.1" jsonrpc-pubsub = "10.0.1" jsonrpc-derive = "10.0.2" diff --git a/core/rpc/src/author/error.rs b/core/rpc/src/author/error.rs index 0084c4da8f..5955108249 100644 --- a/core/rpc/src/author/error.rs +++ b/core/rpc/src/author/error.rs @@ -16,35 +16,37 @@ //! Authoring RPC module errors. -use error_chain::*; use client; use transaction_pool::txpool; use crate::rpc; use crate::errors; -error_chain! { - foreign_links { - Client(client::error::Error) #[doc = "Client error"]; - } - links { - Pool(txpool::error::Error, txpool::error::ErrorKind) #[doc = "Pool 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, } } } @@ -73,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 acd500ba0b..ae160f1d1a 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -104,13 +104,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()) ) } @@ -121,12 +121,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/chain/error.rs b/core/rpc/src/chain/error.rs index 723a21d773..ffd94f4649 100644 --- a/core/rpc/src/chain/error.rs +++ b/core/rpc/src/chain/error.rs @@ -14,33 +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; -pub use internal_errors::*; - -#[allow(deprecated)] -mod internal_errors { - use super::*; - error_chain! { - foreign_links { - Client(client::error::Error) #[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 ab930d0076..9dd7ad84b8 100644 --- a/core/rpc/src/chain/mod.rs +++ b/core/rpc/src/chain/mod.rs @@ -145,7 +145,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); diff --git a/core/rpc/src/errors.rs b/core/rpc/src/errors.rs index a709013ad2..da910de762 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 d4b3013abb..30b3315b7b 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! { - foreign_links { - Client(client::error::Error) #[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 0f87faa7a7..98d62d678d 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; @@ -148,11 +147,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. @@ -213,7 +216,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()), @@ -221,7 +224,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()), @@ -241,7 +244,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()) ), } @@ -483,7 +486,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()); @@ -551,11 +556,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 73a52fbc62..0ad983fc11 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use super::*; -use self::error::{Error, ErrorKind}; +use self::error::Error; use assert_matches::assert_matches; use consensus::BlockOrigin; @@ -80,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::Error::Execution(_)), _)) + Err(Error::Client(client::error::Error::Execution(_))) ) } diff --git a/core/rpc/src/system/error.rs b/core/rpc/src/system/error.rs index d3c7e8b333..bdd4cbe667 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/service/Cargo.toml b/core/service/Cargo.toml index 89708683d0..e27c2d61b3 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -5,9 +5,9 @@ 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 = {version = "^2", features = ["nested-values"]} diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 2536d7c8f2..6e6503fc3d 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -522,7 +522,7 @@ impl Components for FullComponents { select_chain: Option, ) -> Result { let select_chain = select_chain - .ok_or_else(|| error::Error::from(error::ErrorKind::SelectChainRequired))?; + .ok_or(error::Error::SelectChainRequired)?; Factory::build_full_import_queue(config, client, select_chain) } diff --git a/core/service/src/error.rs b/core/service/src/error.rs index c5bcd61a3c..85a6892b26 100644 --- a/core/service/src/error.rs +++ b/core/service/src/error.rs @@ -16,32 +16,49 @@ //! Errors that can occur during the service operation. -// 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 network; use keystore; use consensus_common; -use error_chain::*; -error_chain! { - foreign_links { - Client(client::error::Error) #[doc="Client error"]; - Io(::std::io::Error) #[doc="IO error"]; - } +/// Service Result typedef. +pub type Result = std::result::Result; - links { - Consensus(consensus_common::Error, consensus_common::ErrorKind) #[doc="Consensus 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 { - SelectChainRequired { - description("Best chain selection strategy (SelectChain) must be provided when starting full node or authority."), - display("Best chain selection strategy (SelectChain) is not provided."), +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 81e153b7ae..2a69dc83c7 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -44,7 +44,7 @@ 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::{ @@ -515,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()) }, diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index df89cba455..eaa9acbd45 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -119,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" @@ -482,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" @@ -546,14 +536,6 @@ dependencies = [ "serde 1.0.89 (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.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "failure" version = "0.1.5" @@ -886,41 +868,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.7.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.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.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.7.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)", @@ -931,6 +914,7 @@ 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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -941,21 +925,20 @@ 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.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -964,20 +947,19 @@ dependencies = [ [[package]] name = "libp2p-dns" -version = "0.7.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.7.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.4.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.7.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)", @@ -985,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.7.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)", @@ -996,13 +978,13 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.7.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.7.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.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)", @@ -1010,14 +992,14 @@ 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-kad" -version = "0.7.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)", @@ -1027,7 +1009,7 @@ 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.7.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.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)", @@ -1037,20 +1019,20 @@ 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.7.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.7.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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1058,20 +1040,20 @@ dependencies = [ "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.7.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.7.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)", @@ -1081,14 +1063,16 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.5.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.7.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)", @@ -1099,41 +1083,42 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.7.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.7.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.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.7.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.7.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.7.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.7.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)", @@ -1141,7 +1126,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.7.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)", @@ -1152,7 +1137,7 @@ dependencies = [ "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.7.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)", @@ -1170,14 +1155,14 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.7.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)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.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.4.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)", @@ -1185,23 +1170,36 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.7.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.7.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.4.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.7.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.7.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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1972,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" @@ -2304,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.12 (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.33 (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.12 (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.33 (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" @@ -2447,9 +2391,9 @@ name = "substrate-consensus-common" 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.7.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.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -2464,7 +2408,6 @@ dependencies = [ name = "substrate-consensus-slots" version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (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)", @@ -2482,7 +2425,7 @@ name = "substrate-executor" 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)", @@ -3146,6 +3089,18 @@ dependencies = [ "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" @@ -3295,7 +3250,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" @@ -3341,7 +3295,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" @@ -3349,7 +3302,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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" @@ -3394,23 +3346,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.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-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"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" @@ -3496,7 +3449,6 @@ 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" @@ -3519,10 +3471,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" @@ -3579,6 +3527,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" diff --git a/core/transaction-pool/Cargo.toml b/core/transaction-pool/Cargo.toml index c3f9dce5fe..5b2c2350af 100644 --- a/core/transaction-pool/Cargo.toml +++ b/core/transaction-pool/Cargo.toml @@ -5,7 +5,7 @@ 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 29accf0eb8..0ebc74b7da 100644 --- a/core/transaction-pool/graph/Cargo.toml +++ b/core/transaction-pool/graph/Cargo.toml @@ -5,7 +5,7 @@ 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" diff --git a/core/transaction-pool/graph/src/base_pool.rs b/core/transaction-pool/graph/src/base_pool.rs index 2b4b96839d..74e499674a 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; @@ -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 78d06eabb5..a5b7a3d2aa 100644 --- a/core/transaction-pool/graph/src/pool.rs +++ b/core/transaction-pool/graph/src/pool.rs @@ -27,7 +27,6 @@ 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; @@ -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())? { @@ -144,11 +143,11 @@ impl Pool { }) }, 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()) }, } }) @@ -168,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()) } @@ -308,10 +307,7 @@ impl Pool { // 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 @@ -319,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); @@ -338,7 +334,7 @@ impl Pool { /// 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())? + .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())? .saturated_into::(); let now = time::Instant::now(); let to_remove = { @@ -569,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 befb1b60cc..ca3d7322cc 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/src/error.rs b/core/transaction-pool/src/error.rs index d4cc0acee8..f3641aa8ec 100644 --- a/core/transaction-pool/src/error.rs +++ b/core/transaction-pool/src/error.rs @@ -16,29 +16,34 @@ //! Transaction pool error. -// 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 txpool; -use error_chain::{ - error_chain, error_chain_processing, impl_error_chain_processed, impl_extract_backtrace, impl_error_chain_kind -}; -error_chain! { - foreign_links { - Client(client::error::Error) #[doc = "Client error"]; - } - links { - 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/node-template/Cargo.toml b/node-template/Cargo.toml index d0427ec80d..69f9c884cd 100644 --- a/node-template/Cargo.toml +++ b/node-template/Cargo.toml @@ -10,7 +10,7 @@ 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" diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index e458c165c0..5f46b360e4 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -119,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" @@ -482,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" @@ -546,14 +536,6 @@ dependencies = [ "serde 1.0.89 (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.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "failure" version = "0.1.5" @@ -886,41 +868,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.7.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.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.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.7.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)", @@ -931,6 +914,7 @@ 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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -941,21 +925,20 @@ 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.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -964,20 +947,19 @@ dependencies = [ [[package]] name = "libp2p-dns" -version = "0.7.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.7.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.4.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.7.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)", @@ -985,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.7.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)", @@ -996,13 +978,13 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.7.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.7.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.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)", @@ -1010,14 +992,14 @@ 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-kad" -version = "0.7.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)", @@ -1027,7 +1009,7 @@ 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.7.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.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)", @@ -1037,20 +1019,20 @@ 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.7.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.7.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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1058,20 +1040,20 @@ dependencies = [ "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.7.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.7.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)", @@ -1081,14 +1063,16 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.5.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.7.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)", @@ -1099,41 +1083,42 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.7.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.7.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.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.7.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.7.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.7.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.7.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)", @@ -1141,7 +1126,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.7.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)", @@ -1152,7 +1137,7 @@ dependencies = [ "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.7.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)", @@ -1170,14 +1155,14 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.7.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)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.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.4.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)", @@ -1185,23 +1170,36 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.7.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.7.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.4.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.7.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.7.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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2006,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" @@ -2457,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.12 (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.33 (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.12 (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.33 (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" @@ -2590,9 +2534,9 @@ name = "substrate-consensus-common" 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.7.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.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -2608,7 +2552,7 @@ name = "substrate-executor" 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)", @@ -3238,6 +3182,18 @@ dependencies = [ "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" @@ -3387,7 +3343,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" @@ -3433,7 +3388,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" @@ -3441,7 +3395,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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" @@ -3486,23 +3439,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.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-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"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" @@ -3588,7 +3542,6 @@ 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" @@ -3611,10 +3564,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" @@ -3671,6 +3620,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" diff --git a/node-template/src/error.rs b/node-template/src/error.rs deleted file mode 100644 index a8aa94bf32..0000000000 --- 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 53845ddd08..5418453a02 100644 --- a/node-template/src/main.rs +++ b/node-template/src/main.rs @@ -9,7 +9,7 @@ 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"), @@ -19,7 +19,9 @@ fn run() -> cli::error::Result<()> { 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 7a6a3f0c27..3725833e3d 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -10,7 +10,7 @@ use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, FullClient, LightClient, LightBackend, FullExecutor, LightExecutor, TaskExecutor, - error::{Error as ServiceError, ErrorKind as ServiceErrorKind}, + error::{Error as ServiceError}, }; use basic_authorship::ProposerFactory; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; @@ -46,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 @@ -67,7 +75,7 @@ construct_service_factory! { }); let client = service.client(); let select_chain = service.select_chain() - .ok_or_else(|| ServiceError::from(ServiceErrorKind::SelectChainRequired))?; + .ok_or_else(|| ServiceError::SelectChainRequired)?; executor.spawn(start_aura( SlotDuration::get_or_compute(&*client)?, key.clone(), diff --git a/node/cli/src/error.rs b/node/cli/src/error.rs deleted file mode 100644 index dd5448ac8a..0000000000 --- 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/service.rs b/node/cli/src/service.rs index 90041b4cbb..a4ac1b0660 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -31,7 +31,7 @@ use node_runtime::{GenesisConfig, RuntimeApi}; use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, FullClient, LightClient, LightBackend, FullExecutor, LightExecutor, TaskExecutor, - error::{Error as ServiceError, ErrorKind as ServiceErrorKind}, + error::{Error as ServiceError}, }; use transaction_pool::{self, txpool::{Pool as TransactionPool}}; use inherents::InherentDataProviders; @@ -92,7 +92,7 @@ construct_service_factory! { let client = service.client(); let select_chain = service.select_chain() - .ok_or_else(|| ServiceError::from(ServiceErrorKind::SelectChainRequired))?; + .ok_or(ServiceError::SelectChainRequired)?; executor.spawn(start_aura( SlotDuration::get_or_compute(&*client)?, key.clone(), diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index 50037f709e..846857caa2 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -119,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" @@ -482,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" @@ -546,14 +536,6 @@ dependencies = [ "serde 1.0.89 (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.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "failure" version = "0.1.5" @@ -886,41 +868,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.7.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.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.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.7.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)", @@ -931,6 +914,7 @@ 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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -941,21 +925,20 @@ 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.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -964,20 +947,19 @@ dependencies = [ [[package]] name = "libp2p-dns" -version = "0.7.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.7.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.4.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.7.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)", @@ -985,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.7.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)", @@ -996,13 +978,13 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.7.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.7.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.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)", @@ -1010,14 +992,14 @@ 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-kad" -version = "0.7.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)", @@ -1027,7 +1009,7 @@ 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.7.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.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)", @@ -1037,20 +1019,20 @@ 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.7.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.7.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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1058,20 +1040,20 @@ dependencies = [ "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.7.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.7.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)", @@ -1081,14 +1063,16 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.5.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.7.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)", @@ -1099,41 +1083,42 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.7.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.7.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.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.7.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.7.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.7.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.7.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)", @@ -1141,7 +1126,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.7.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)", @@ -1152,7 +1137,7 @@ dependencies = [ "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.7.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)", @@ -1170,14 +1155,14 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.7.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)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.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.4.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)", @@ -1185,23 +1170,36 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.7.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.7.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.4.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.7.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.7.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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2038,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" @@ -2592,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.12 (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.33 (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.12 (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.33 (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" @@ -2725,9 +2669,9 @@ name = "substrate-consensus-common" 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.7.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.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -2743,7 +2687,7 @@ name = "substrate-executor" 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)", @@ -3384,6 +3328,18 @@ dependencies = [ "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" @@ -3542,7 +3498,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" @@ -3588,7 +3543,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" @@ -3596,7 +3550,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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" @@ -3641,23 +3594,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.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-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"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" @@ -3744,7 +3698,6 @@ 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" @@ -3767,10 +3720,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" @@ -3827,6 +3776,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" diff --git a/node/src/main.rs b/node/src/main.rs index 5ff0d7ff3b..15b603e7a2 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/gitlab/check_line_width.sh b/scripts/gitlab/check_line_width.sh index ad78b24e11..f382d630b1 100755 --- a/scripts/gitlab/check_line_width.sh +++ b/scripts/gitlab/check_line_width.sh @@ -11,7 +11,10 @@ GOOD_LINE_WIDTH="101" git diff --name-only ${BASE_BRANCH}...${CI_COMMIT_SHA} \*.rs | ( while read file do - if git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} | grep -q "^+.\{${LINE_WIDTH}\}" + 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 -- GitLab From 6bf7a175771863606561438c8fac2e624e3ececb Mon Sep 17 00:00:00 2001 From: TriplEight Date: Fri, 24 May 2019 12:24:37 +0200 Subject: [PATCH 019/140] rust versions (#2681) --- .gitlab-ci.yml | 59 +++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index abab05f74e..0ee23e7253 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,6 +38,12 @@ variables: environment: name: parity-build +.compiler_info: &compiler_info + before_script: + - rustup show + - cargo --version + - sccache -s + #### stage: test @@ -67,6 +73,7 @@ check-line-width: test-linux-stable: &test stage: test + <<: *compiler_info variables: RUST_TOOLCHAIN: stable # Enable debug assertions since we are running optimized builds for testing @@ -84,15 +91,14 @@ test-linux-stable: &test except: variables: - $DEPLOY_TAG - before_script: - - sccache -s - - ./scripts/build.sh script: + - ./scripts/build.sh - time cargo test --all --release --verbose --locked - sccache -s check-web-wasm: stage: test + <<: *compiler_info allow_failure: true only: - master @@ -115,6 +121,7 @@ check-web-wasm: - time cargo web build -p substrate-state-db - time cargo web build -p substrate-state-machine - time cargo web build -p substrate-trie + - sccache -s tags: - linux-docker @@ -126,19 +133,18 @@ check-web-wasm: #### stage: build -build-linux-release: &build +build-linux-release: stage: build <<: *collect-artifacts <<: *build-only + <<: *compiler_info except: variables: - $DEPLOY_TAG tags: - linux-docker - before_script: - - sccache -s - - ./scripts/build.sh script: + - ./scripts/build.sh - time cargo build --release --verbose - mkdir -p ./artifacts - mv ./target/release/substrate ./artifacts/. @@ -156,8 +162,9 @@ build-linux-release: &build - cp -r scripts/docker/* ./artifacts - sccache -s -build-rust-doc-release: &build +build-rust-doc-release: stage: build + <<: *compiler_info allow_failure: true artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}-doc" @@ -168,10 +175,8 @@ build-rust-doc-release: &build <<: *build-only tags: - linux-docker - before_script: - - sccache -s - - ./scripts/build.sh script: + - ./scripts/build.sh - 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 @@ -317,46 +322,46 @@ publish-s3-doc: deploy-ew3: <<: *deploy-cibuild environment: - name: parity-prod-ew3 + name: parity-prod-ew3 deploy-ue1: <<: *deploy-cibuild environment: - name: parity-prod-ue1 + name: parity-prod-ue1 deploy-ew3-tag: <<: *deploy-tag environment: - name: parity-prod-ew3 + name: parity-prod-ew3 deploy-ue1-tag: <<: *deploy-tag environment: name: parity-prod-ue1 -.validator-deploy: &validator-deploy - stage: flaming-fir +.validator-deploy: &validator-deploy + stage: flaming-fir dependencies: - build-linux-release - image: parity/azure-ansible:v1 - allow_failure: true - when: manual + image: parity/azure-ansible:v1 + allow_failure: true + when: manual tags: - linux-docker -validator1: - <<: *validator-deploy +validator 1 4: + <<: *validator-deploy script: - ./scripts/flamingfir-deploy.sh flamingfir-validator1 -validator2: - <<: *validator-deploy +validator 2 4: + <<: *validator-deploy script: - ./scripts/flamingfir-deploy.sh flamingfir-validator2 -validator3: - <<: *validator-deploy +validator 3 4: + <<: *validator-deploy script: - ./scripts/flamingfir-deploy.sh flamingfir-validator3 -validator4: - <<: *validator-deploy +validator 4 4: + <<: *validator-deploy script: - ./scripts/flamingfir-deploy.sh flamingfir-validator4 -- GitLab From 79dd9c83027495107509b700057d04577a2ea242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 24 May 2019 15:21:19 +0200 Subject: [PATCH 020/140] Lower the required code threshold. (#2685) --- core/rpc/src/state/tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 0ad983fc11..4cd4e7bfd4 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -34,7 +34,7 @@ fn should_return_storage() { assert!( client.storage(key.clone(), Some(genesis_hash).into()) .map(|x| x.map(|x| x.0.len())).unwrap().unwrap() - > 195_000 + > 10_000 ); assert_matches!( client.storage_hash(key.clone(), Some(genesis_hash).into()).map(|x| x.is_some()), @@ -42,7 +42,7 @@ fn should_return_storage() { ); assert!( client.storage_size(key.clone(), None).unwrap().unwrap() - > 195_000 + > 10_000 ); } -- GitLab From 0e911351f20e03253fe5bf5f0de4aaee435a111f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sat, 25 May 2019 21:02:50 +0200 Subject: [PATCH 021/140] Check for exact wasm blob size in RPC tests (#2687) --- core/rpc/src/state/tests.rs | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 4cd4e7bfd4..14b6506f29 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -21,34 +21,35 @@ 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}; +use test_client::{self, runtime, AccountKeyring, TestClient, BlockBuilderExt, LocalExecutor}; +use substrate_executor::NativeExecutionDispatch; #[test] fn should_return_storage() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + 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 key = StorageKey(b":code".to_vec()); - assert!( + assert_eq!( client.storage(key.clone(), Some(genesis_hash).into()) - .map(|x| x.map(|x| x.0.len())).unwrap().unwrap() - > 10_000 + .map(|x| x.map(|x| x.0.len())).unwrap().unwrap() as usize, + LocalExecutor::native_equivalent().len(), ); assert_matches!( 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() - > 10_000 + assert_eq!( + client.storage_size(key.clone(), None).unwrap().unwrap() as usize, + LocalExecutor::native_equivalent().len(), ); } #[test] fn should_return_child_storage() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + 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())); @@ -73,7 +74,7 @@ fn should_return_child_storage() { #[test] fn should_call_contract() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + 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())); @@ -86,7 +87,7 @@ fn should_call_contract() { #[test] fn should_notify_about_storage_changes() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); + let mut core = tokio::runtime::Runtime::new().unwrap(); let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); @@ -117,7 +118,7 @@ fn should_notify_about_storage_changes() { #[test] fn should_send_initial_storage_changes_and_notifications() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); + let mut core = tokio::runtime::Runtime::new().unwrap(); let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); @@ -163,7 +164,7 @@ fn should_query_storage() { >; fn run_tests(client: Arc) { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let api = State::new(client.clone(), Subscriptions::new(core.executor())); let add_block = |nonce| { @@ -250,20 +251,20 @@ fn should_split_ranges() { #[test] fn should_return_runtime_version() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let api = State::new(client.clone(), Subscriptions::new(core.executor())); assert_eq!( - ::serde_json::to_string(&api.runtime_version(None.into()).unwrap()).unwrap(), + 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],["0xcbca25e39f142387",1],["0xf78b278be53f454c",1],["0x7801759919ee83e5",1]]}"# ); } #[test] fn should_notify_on_runtime_version_initially() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); + let mut core = tokio::runtime::Runtime::new().unwrap(); let (subscriber, id, transport) = Subscriber::new_test("test"); { -- GitLab From 85bda652419886cdd21aad4297ba2692f2b8e79d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sat, 25 May 2019 21:03:27 +0200 Subject: [PATCH 022/140] Fix doc propagation for `Call` enum (#2690) * Fix doc propagation for `Call` enum * Fix warnings while generating `srml-staking` docs * Make the line check happy --- srml/staking/src/lib.rs | 7 ++++--- srml/support/src/dispatch.rs | 12 ++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 1901752666..6a9846e07f 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -187,15 +187,16 @@ //! 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). +//! [`ValidatorPrefs::unstake_threshold`](./struct.ValidatorPrefs.html#structfield.unstake_threshold). //! //! 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`] times. Getting slashed due to offline report always leads -//! to being _unstaked_ (_i.e._ removed as a validator candidate) as the consequence. +//! [`OfflineSlashGrace`] + [`ValidatorPrefs::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`](./struct.Module.html#method.offline_slash) and the `total` `Exposure`. This value is then diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index aa6282c773..f2db609dc3 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -773,6 +773,7 @@ macro_rules! decl_module { $type, } variant $fn_name; + $( #[doc = $doc_attr] )* $( $rest )* } }; @@ -800,6 +801,7 @@ macro_rules! decl_module { $type, } variant $fn_name; + $( #[doc = $doc_attr] )* $( $rest )* } }; @@ -859,7 +861,10 @@ macro_rules! decl_module { (@imp $(#[$attr:meta])* - pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?> + pub struct $mod_type:ident< + $trait_instance:ident: $trait_name:ident + $(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)? + > for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident { $( $(#[doc = $doc_attr:tt])* @@ -881,7 +886,10 @@ macro_rules! decl_module { // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] - pub struct $mod_type<$trait_instance: $trait_name $(, $instance: $instantiable $( = $module_default_instance)?)?>($crate::rstd::marker::PhantomData<($trait_instance $(, $instance)?)>); + pub struct $mod_type< + $trait_instance: $trait_name + $(, $instance: $instantiable $( = $module_default_instance)?)? + >($crate::rstd::marker::PhantomData<($trait_instance $(, $instance)?)>); $crate::decl_module! { @impl_on_initialize -- GitLab From 824ccf3b95ecc6acdac9a1847b7cdedf7aa02ad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Sun, 26 May 2019 22:05:02 +0100 Subject: [PATCH 023/140] Register previous rounds' votes with gossip service on startup (#2676) * grandpa: register previous round votes with gossip service on startup * gossip: fix tests * grandpa: optionally register previous round votes on startup * grandpa: fix tests --- .../finality-grandpa/src/communication/mod.rs | 54 +++++++++++++++++++ .../src/communication/tests.rs | 10 ++++ core/finality-grandpa/src/environment.rs | 4 ++ core/finality-grandpa/src/lib.rs | 10 +++- core/finality-grandpa/src/observer.rs | 10 +++- core/finality-grandpa/src/tests.rs | 14 ++++- core/network/src/consensus_gossip.rs | 36 ++++++++----- 7 files changed, 119 insertions(+), 19 deletions(-) diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index 395f820254..e4343352d9 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -99,6 +99,12 @@ pub trait Network: Clone + Send + 'static { /// Only should be used in case of consensus stall. fn gossip_message(&self, topic: Block::Hash, data: Vec, force: bool); + /// Register a message with the gossip service, it isn't broadcast right + /// away to any peers, but may be sent to new peers joining or when asked to + /// broadcast the topic. Useful to register previous messages on node + /// startup. + fn register_gossip_message(&self, topic: Block::Hash, data: Vec); + /// Send a message to a bunch of specific peers, even if they've seen it already. fn send_message(&self, who: Vec, data: Vec); @@ -145,11 +151,21 @@ impl Network for Arc> where engine_id: GRANDPA_ENGINE_ID, data, }; + self.with_gossip( move |gossip, ctx| gossip.multicast(ctx, topic, msg, force) ) } + fn register_gossip_message(&self, topic: B::Hash, data: Vec) { + let msg = ConsensusMessage { + engine_id: GRANDPA_ENGINE_ID, + data, + }; + + self.with_gossip(move |gossip, _| gossip.register_message(topic, msg)) + } + fn send_message(&self, who: Vec, data: Vec) { let msg = ConsensusMessage { engine_id: GRANDPA_ENGINE_ID, @@ -212,9 +228,12 @@ pub(crate) struct NetworkBridge> { impl> NetworkBridge { /// Create a new NetworkBridge to the given NetworkService. Returns the service /// handle and a future that must be polled to completion to finish startup. + /// If a voter set state is given it registers previous round votes with the + /// gossip service. pub(crate) fn new( service: N, config: crate::Config, + set_state: Option<(u64, &crate::environment::VoterSetState)>, on_exit: impl Future + Clone + Send + 'static, ) -> ( Self, @@ -225,6 +244,41 @@ impl> NetworkBridge { let validator = Arc::new(validator); service.register_validator(validator.clone()); + if let Some((set_id, set_state)) = set_state { + // register all previous votes with the gossip service so that they're + // available to peers potentially stuck on a previous round. + for round in set_state.completed_rounds().iter() { + let topic = round_topic::(round.number, set_id); + + // we need to note the round with the gossip validator otherwise + // messages will be ignored. + validator.note_round(Round(round.number), SetId(set_id), |_, _| {}); + + for signed in round.votes.iter() { + let message = gossip::GossipMessage::VoteOrPrecommit( + gossip::VoteOrPrecommitMessage:: { + message: signed.clone(), + round: Round(round.number), + set_id: SetId(set_id), + } + ); + + service.register_gossip_message( + topic, + message.encode(), + ); + } + + trace!(target: "afg", + "Registered {} messages for topic {:?} (round: {}, set_id: {})", + round.votes.len(), + topic, + round.number, + set_id, + ); + } + } + let (rebroadcast_job, neighbor_sender) = periodic::neighbor_packet_worker(service.clone()); let reporting_job = report_stream.consume(service.clone()); diff --git a/core/finality-grandpa/src/communication/tests.rs b/core/finality-grandpa/src/communication/tests.rs index 2ef6d28064..f2b50ab80c 100644 --- a/core/finality-grandpa/src/communication/tests.rs +++ b/core/finality-grandpa/src/communication/tests.rs @@ -72,6 +72,15 @@ impl super::Network for TestNetwork { let _ = self.sender.unbounded_send(Event::SendMessage(who, data)); } + /// Register a message with the gossip service, it isn't broadcast right + /// away to any peers, but may be sent to new peers joining or when asked to + /// broadcast the topic. Useful to register previous messages on node + /// startup. + fn register_gossip_message(&self, _topic: Hash, _data: Vec) { + // NOTE: only required to restore previous state on startup + // not required for tests currently + } + /// 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)); @@ -136,6 +145,7 @@ fn make_test_network() -> impl Future { let (bridge, startup_work) = super::NetworkBridge::new( net.clone(), config(), + None, Exit, ); diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 564b7630c4..1f3bcbca96 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -101,6 +101,10 @@ impl CompletedRounds { CompletedRounds { inner } } + pub fn iter(&self) -> impl Iterator> { + self.inner.iter() + } + /// Returns the last (latest) completed round. pub fn last(&self) -> &CompletedRound { self.inner.back() diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 75aa4d85ce..2d08bdc04e 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -490,16 +490,22 @@ pub fn run_grandpa_voter, N, RA, SC, X>( use futures::future::{self, Loop as FutureLoop}; - let (network, network_startup) = NetworkBridge::new(network, config.clone(), on_exit.clone()); - let LinkHalf { client, select_chain, persistent_data, voter_commands_rx, } = link; + let PersistentData { authority_set, set_state, consensus_changes } = persistent_data; + let (network, network_startup) = NetworkBridge::new( + network, + config.clone(), + Some((authority_set.set_id(), &set_state.read())), + on_exit.clone(), + ); + register_finality_tracker_inherent_data_provider(client.clone(), &inherent_data_providers)?; if let Some(telemetry_on_connect) = telemetry_on_connect { diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index f6d657e1ff..9f6f87f8c4 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -166,9 +166,15 @@ pub fn run_grandpa_observer, N, RA, SC>( } = 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 (network, network_startup) = NetworkBridge::new( + network, + config.clone(), + None, + on_exit.clone(), + ); + + let initial_state = (authority_set, consensus_changes, set_state, voter_commands_rx.into_future()); let observer_work = future::loop_fn(initial_state, move |state| { let (authority_set, consensus_changes, set_state, voter_commands_rx) = state; diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 622eb7d470..a64060d01f 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -253,6 +253,11 @@ impl Network for MessageRouting { }) } + fn register_gossip_message(&self, _topic: Hash, _data: Vec) { + // NOTE: only required to restore previous state on startup + // not required for tests currently + } + fn report(&self, _who: network::PeerId, _cost_benefit: i32) { } @@ -1242,7 +1247,12 @@ fn voter_persists_its_votes() { name: Some(format!("peer#{}", 1)), }; let routing = MessageRouting::new(net.clone(), 1); - let (network, routing_work) = communication::NetworkBridge::new(routing, config.clone(), Exit); + let (network, routing_work) = communication::NetworkBridge::new( + routing, + config.clone(), + None, + Exit, + ); runtime.block_on(routing_work).unwrap(); let (round_rx, round_tx) = network.round_communication( @@ -1470,4 +1480,4 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ 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/network/src/consensus_gossip.rs b/core/network/src/consensus_gossip.rs index c7747a9101..c5f1a2d927 100644 --- a/core/network/src/consensus_gossip.rs +++ b/core/network/src/consensus_gossip.rs @@ -281,7 +281,7 @@ impl ConsensusGossip { } } - fn register_message( + fn register_message_hashed( &mut self, message_hash: B::Hash, topic: B::Hash, @@ -296,6 +296,20 @@ impl ConsensusGossip { } } + /// Registers a message without propagating it to any peers. The message + /// becomes available to new peers or when the service is asked to gossip + /// the message's topic. No validation is performed on the message, if the + /// message is already expired it should be dropped on the next garbage + /// collection. + pub fn register_message( + &mut self, + topic: B::Hash, + message: ConsensusMessage, + ) { + let message_hash = HashFor::::hash(&message.data[..]); + self.register_message_hashed(message_hash, topic, message); + } + /// Call when a peer has been disconnected to stop tracking gossip status. pub fn peer_disconnected(&mut self, protocol: &mut Context, who: PeerId) { for (engine_id, v) in self.validators.clone() { @@ -447,7 +461,7 @@ impl ConsensusGossip { } } if keep { - self.register_message(message_hash, topic, message); + self.register_message_hashed(message_hash, topic, message); } } else { trace!(target:"gossip", "Ignored statement from unregistered peer {}", who); @@ -495,7 +509,7 @@ impl ConsensusGossip { force: bool, ) { let message_hash = HashFor::::hash(&message.data); - self.register_message(message_hash, topic, message.clone()); + self.register_message_hashed(message_hash, topic, message.clone()); let intent = if force { MessageIntent::ForcedBroadcast } else { MessageIntent::Broadcast }; propagate(protocol, iter::once((&message_hash, &topic, &message)), intent, &mut self.peers, &self.validators); } @@ -604,11 +618,9 @@ mod tests { consensus.register_validator_internal([0, 0, 0, 0], Arc::new(AllowAll)); let message = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 0] }; - - let message_hash = HashFor::::hash(&message.data); let topic = HashFor::::hash(&[1,2,3]); - consensus.register_message(message_hash, topic, message.clone()); + consensus.register_message(topic, message.clone()); let stream = consensus.messages_for([0, 0, 0, 0], topic); assert_eq!(stream.wait().next(), Some(Ok(TopicNotification { message: message.data, sender: None }))); @@ -622,8 +634,8 @@ mod tests { let msg_a = ConsensusMessage { data: vec![1, 2, 3], engine_id: [0, 0, 0, 0] }; let msg_b = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 0] }; - consensus.register_message(HashFor::::hash(&msg_a.data), topic,msg_a); - consensus.register_message(HashFor::::hash(&msg_b.data), topic,msg_b); + consensus.register_message(topic, msg_a); + consensus.register_message(topic, msg_b); assert_eq!(consensus.messages.len(), 2); } @@ -634,11 +646,9 @@ mod tests { consensus.register_validator_internal([0, 0, 0, 0], Arc::new(AllowAll)); let message = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 0] }; - - let message_hash = HashFor::::hash(&message.data); let topic = HashFor::::hash(&[1,2,3]); - consensus.register_message(message_hash, topic, message.clone()); + consensus.register_message(topic, message.clone()); let stream1 = consensus.messages_for([0, 0, 0, 0], topic); let stream2 = consensus.messages_for([0, 0, 0, 0], topic); @@ -656,8 +666,8 @@ mod tests { let msg_a = ConsensusMessage { data: vec![1, 2, 3], engine_id: [0, 0, 0, 0] }; let msg_b = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 1] }; - consensus.register_message(HashFor::::hash(&msg_a.data), topic, msg_a); - consensus.register_message(HashFor::::hash(&msg_b.data), topic, msg_b); + consensus.register_message(topic, msg_a); + consensus.register_message(topic, msg_b); let mut stream = consensus.messages_for([0, 0, 0, 0], topic).wait(); -- GitLab From db453ba2e76488ba21762c466b6d1685c9d323c9 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 27 May 2019 12:01:07 +0200 Subject: [PATCH 024/140] Fix not connected peers being connected peers (#2692) --- core/network-libp2p/src/service_task.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/network-libp2p/src/service_task.rs b/core/network-libp2p/src/service_task.rs index 5a6fb6978c..912c0f71ba 100644 --- a/core/network-libp2p/src/service_task.rs +++ b/core/network-libp2p/src/service_task.rs @@ -200,7 +200,7 @@ where TMessage: CustomMessage + Send + 'static { let not_connected_peers = { let swarm = &mut self.swarm; - let list = swarm.known_peers().filter(|p| !open.iter().all(|n| n != *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 { -- GitLab From 8d8f923d2b479e2b4fb4631c05aeb279ad734ed7 Mon Sep 17 00:00:00 2001 From: TriplEight Date: Mon, 27 May 2019 14:06:38 +0200 Subject: [PATCH 025/140] some prettiness, fix dockerfile's metadata (#2682) --- .gitlab-ci.yml | 8 ++++---- scripts/docker/Dockerfile | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0ee23e7253..c11d5ccfc2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,7 +38,7 @@ variables: environment: name: parity-build -.compiler_info: &compiler_info +.compiler_info: &compiler_info before_script: - rustup show - cargo --version @@ -125,7 +125,7 @@ check-web-wasm: tags: - linux-docker -.build-only: &build-only +.build-only: &build-only only: - master - tags @@ -216,7 +216,7 @@ publish-docker-release: - test -z "${VERSION}" && exit 1 - cd ./artifacts - docker build - --build-arg VCS_REF="${CI_COMMIT_SHORT_SHA}" + --build-arg VCS_REF="${CI_COMMIT_SHA}" --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" --tag $CONTAINER_IMAGE:$VERSION --tag $CONTAINER_IMAGE:latest . @@ -337,7 +337,7 @@ deploy-ew3-tag: deploy-ue1-tag: <<: *deploy-tag environment: - name: parity-prod-ue1 + name: parity-prod-ue1 .validator-deploy: &validator-deploy stage: flaming-fir diff --git a/scripts/docker/Dockerfile b/scripts/docker/Dockerfile index 4afa0101fc..2bdf49e2fc 100644 --- a/scripts/docker/Dockerfile +++ b/scripts/docker/Dockerfile @@ -8,7 +8,7 @@ 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.source="https://github.com/paritytech/substrate/blob/${VCS_REF}/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" -- GitLab From 950e90e75dc7d16dcf99972fcc733945a832dc3e Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 27 May 2019 20:08:03 +0200 Subject: [PATCH 026/140] Peerset should never return Ready(None) (#2684) --- core/peerset/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/peerset/src/lib.rs b/core/peerset/src/lib.rs index 9b5155455a..6956cd16e1 100644 --- a/core/peerset/src/lib.rs +++ b/core/peerset/src/lib.rs @@ -433,7 +433,7 @@ impl Stream for Peerset { return Ok(Async::Ready(Some(message))); } match try_ready!(self.rx.poll()) { - None => return Ok(Async::Ready(None)), + None => return Ok(Async::NotReady), Some(action) => match action { Action::AddReservedPeer(peer_id) => self.on_add_reserved_peer(peer_id), Action::RemoveReservedPeer(peer_id) => self.on_remove_reserved_peer(peer_id), -- GitLab From d8fc4485dacd4752a7e342b8c8a908db8736bd99 Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Tue, 28 May 2019 10:35:00 +0200 Subject: [PATCH 027/140] Silence known deprecation warnings (#2651) * Silence known deprecation warnings 1. Prefixes known instances of usages of client.backend and client.import_lock with `#[allow(deprecated)]` to silence the warnings. 2. Remove file-global `#![allow(deprecated)]` used in these cases. Both to prevent us overlooking externally caused deprecation messages. * fixing missing ; * fix missing test cases * move deprecated markers to make CI happy * move deprecated markers to make CI happy * attempt to fix the test * bumping impl_version of node runtime * Minor cleanup --- core/cli/src/informant.rs | 2 + core/client/src/client.rs | 18 ++++-- core/consensus/aura/src/lib.rs | 1 + core/consensus/babe/src/lib.rs | 6 +- core/finality-grandpa/src/environment.rs | 12 +++- core/finality-grandpa/src/finality_proof.rs | 1 + core/finality-grandpa/src/import.rs | 4 ++ core/finality-grandpa/src/justification.rs | 1 + core/finality-grandpa/src/lib.rs | 6 +- core/finality-grandpa/src/light_import.rs | 4 ++ core/finality-grandpa/src/observer.rs | 2 + core/finality-grandpa/src/tests.rs | 5 ++ core/network/src/chain.rs | 1 + core/network/src/test/mod.rs | 2 + core/service/src/components.rs | 1 + core/sr-api-macros/tests/runtime_calls.rs | 1 + core/test-client/src/trait_tests.rs | 61 +++++++++++---------- node-template/src/service.rs | 1 + node/cli/src/service.rs | 2 + node/runtime/src/lib.rs | 2 +- 20 files changed, 95 insertions(+), 38 deletions(-) diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index 5c60229fab..6149d6c95b 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -83,6 +83,7 @@ where C: Components { TransferRateFormat(bandwidth_upload), ); + #[allow(deprecated)] let backend = (*client).backend(); let used_state_cache_size = match backend.used_state_cache_size(){ Some(size) => size, @@ -132,6 +133,7 @@ where C: Components { if let Some((ref last_num, ref last_hash)) = last { if n.header.parent_hash() != last_hash { let tree_route = ::client::blockchain::tree_route( + #[allow(deprecated)] client.backend().blockchain(), BlockId::Hash(last_hash.clone()), BlockId::Hash(n.hash), diff --git a/core/client/src/client.rs b/core/client/src/client.rs index c9f70039ea..a7e1e18847 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -1884,6 +1884,7 @@ pub(crate) mod tests { let client = test_client::new(); let genesis_hash = client.info().unwrap().chain.genesis_hash; + #[allow(deprecated)] let longest_chain_select = test_client::client::LongestChain::new( client.backend().clone(), client.import_lock() @@ -1902,7 +1903,9 @@ pub(crate) mod tests { let client = test_client::new(); let uninserted_block = client.new_block().unwrap().bake().unwrap(); + #[allow(deprecated)] let backend = client.backend().as_in_memory(); + #[allow(deprecated)] let longest_chain_select = test_client::client::LongestChain::new( Arc::new(backend), client.import_lock()); @@ -2038,7 +2041,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, a2.clone()).unwrap(); let genesis_hash = client.info().unwrap().chain.genesis_hash; - + #[allow(deprecated)] let longest_chain_select = test_client::client::LongestChain::new( Arc::new(client.backend().as_in_memory()), client.import_lock()); @@ -2127,6 +2130,7 @@ pub(crate) mod tests { assert_eq!(client.info().unwrap().chain.best_hash, a5.hash()); let genesis_hash = client.info().unwrap().chain.genesis_hash; + #[allow(deprecated)] let longest_chain_select = test_client::client::LongestChain::new( Arc::new(client.backend().as_in_memory()), client.import_lock()); @@ -2357,6 +2361,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, a2.clone()).unwrap(); let genesis_hash = client.info().unwrap().chain.genesis_hash; + #[allow(deprecated)] let longest_chain_select = test_client::client::LongestChain::new( Arc::new(client.backend().as_in_memory()), client.import_lock() @@ -2400,23 +2405,26 @@ pub(crate) mod tests { let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); client.import_justified(BlockOrigin::Own, a3.clone(), justification.clone()).unwrap(); + #[allow(deprecated)] + let blockchain = client.backend().blockchain(); + assert_eq!( - client.backend().blockchain().last_finalized().unwrap(), + blockchain.last_finalized().unwrap(), a3.hash(), ); assert_eq!( - client.backend().blockchain().justification(BlockId::Hash(a3.hash())).unwrap(), + blockchain.justification(BlockId::Hash(a3.hash())).unwrap(), Some(justification), ); assert_eq!( - client.backend().blockchain().justification(BlockId::Hash(a1.hash())).unwrap(), + blockchain.justification(BlockId::Hash(a1.hash())).unwrap(), None, ); assert_eq!( - client.backend().blockchain().justification(BlockId::Hash(a2.hash())).unwrap(), + blockchain.justification(BlockId::Hash(a2.hash())).unwrap(), None, ); } diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 59483a5688..554a63de94 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -1026,6 +1026,7 @@ mod tests { let mut runtime = current_thread::Runtime::new().unwrap(); for (peer_id, key) in peers { let client = net.lock().peer(*peer_id).client().as_full().expect("full clients are created").clone(); + #[allow(deprecated)] let select_chain = LongestChain::new( client.backend().clone(), client.import_lock().clone(), diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index cccbc160c6..72a4e55a30 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -1079,11 +1079,15 @@ mod tests { &inherent_data_providers, config.get() ).expect("Registers babe inherent data provider"); + + #[allow(deprecated)] + let select_chain = LongestChain::new(client.backend().clone(), client.import_lock().clone()); + 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()), + select_chain, client, env: environ.clone(), sync_oracle: DummyOracle, diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 1f3bcbca96..ed50629f47 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -399,6 +399,7 @@ pub(crate) fn ancestry, E, RA>( if base == block { return Err(GrandpaError::NotDescendent) } let tree_route_res = ::client::blockchain::tree_route( + #[allow(deprecated)] client.backend().blockchain(), BlockId::Hash(block), BlockId::Hash(base), @@ -521,6 +522,7 @@ where current_round: HasVoted::Yes(local_id, Vote::Propose(propose)), }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**self.inner.backend(), &set_state)?; Ok(Some(set_state)) @@ -562,6 +564,7 @@ where current_round: HasVoted::Yes(local_id, Vote::Prevote(propose.cloned(), prevote)), }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**self.inner.backend(), &set_state)?; Ok(Some(set_state)) @@ -601,6 +604,7 @@ where current_round: HasVoted::Yes(local_id, Vote::Precommit(propose.clone(), prevote.clone(), precommit)), }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**self.inner.backend(), &set_state)?; Ok(Some(set_state)) @@ -644,6 +648,7 @@ where current_round: HasVoted::No, }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**self.inner.backend(), &set_state)?; Ok(Some(set_state)) @@ -655,8 +660,10 @@ where fn finalize_block(&self, hash: Block::Hash, number: NumberFor, round: u64, commit: Commit) -> Result<(), Self::Error> { use client::blockchain::HeaderBackend; - let status = self.inner.backend().blockchain().info()?; - if number <= status.finalized_number && self.inner.backend().blockchain().hash(number)? == Some(hash) { + #[allow(deprecated)] + let blockchain = self.inner.backend().blockchain(); + let status = blockchain.info()?; + if number <= status.finalized_number && blockchain.hash(number)? == Some(hash) { // This can happen after a forced change (triggered by the finality tracker when finality is stalled), since // the voter will be restarted at the median last finalized block, which can be lower than the local best // finalized block. @@ -974,6 +981,7 @@ where B: Backend, } let tree_route = client::blockchain::tree_route( + #[allow(deprecated)] client.backend().blockchain(), BlockId::Hash(*hash), BlockId::Hash(*base), diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index 4cffe0dd98..c80b65741b 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -173,6 +173,7 @@ impl network::FinalityProofProvider for FinalityProofPro })?; match request { FinalityProofRequest::Original(request) => prove_finality::<_, _, GrandpaJustification>( + #[allow(deprecated)] &*self.client.backend().blockchain(), &*self.authority_provider, request.authorities_set_id, diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index 1966913c72..6d64ad6778 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -317,12 +317,15 @@ where // for the canon block the new authority set should start // with. we use the minimum between the median and the local // best finalized block. + + #[allow(deprecated)] let best_finalized_number = self.inner.backend().blockchain().info() .map_err(|e| ConsensusError::ClientImport(e.to_string()))? .finalized_number; let canon_number = best_finalized_number.min(median_last_finalized_number); + #[allow(deprecated)] let canon_hash = self.inner.backend().blockchain().header(BlockId::Number(canon_number)) .map_err(|e| ConsensusError::ClientImport(e.to_string()))? @@ -396,6 +399,7 @@ impl, RA, PRA, SC> BlockImport // early exit if block already in chain, otherwise the check for // authority changes will error when trying to re-import a change block + #[allow(deprecated)] match self.inner.backend().blockchain().status(BlockId::Hash(hash)) { Ok(blockchain::BlockStatus::InChain) => return Ok(ImportResult::AlreadyInChain), Ok(blockchain::BlockStatus::Unknown) => {}, diff --git a/core/finality-grandpa/src/justification.rs b/core/finality-grandpa/src/justification.rs index f16824f924..fc7f833c75 100644 --- a/core/finality-grandpa/src/justification.rs +++ b/core/finality-grandpa/src/justification.rs @@ -72,6 +72,7 @@ impl> GrandpaJustification { loop { if current_hash == commit.target_hash { break; } + #[allow(deprecated)] match client.backend().blockchain().header(BlockId::Hash(current_hash))? { Some(current_header) => { if *current_header.number() <= commit.target_number { diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 2d08bdc04e..aee6c16d13 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -52,7 +52,6 @@ //! 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}; @@ -321,6 +320,7 @@ where let genesis_hash = chain_info.chain.genesis_hash; let persistent_data = aux_schema::load_persistent( + #[allow(deprecated)] &**client.backend(), genesis_hash, >::zero(), @@ -430,6 +430,7 @@ fn register_finality_tracker_inherent_data_provider Err(std::borrow::Cow::Owned(e.to_string())), Ok(info) => { @@ -653,6 +654,7 @@ pub fn run_grandpa_voter, N, RA, SC, X>( current_round: HasVoted::No, }; + #[allow(deprecated)] aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; let set_state: SharedVoterSetState<_> = set_state.into(); @@ -678,6 +680,8 @@ pub fn run_grandpa_voter, N, RA, SC, X>( env.update_voter_set_state(|voter_set_state| { let completed_rounds = voter_set_state.completed_rounds(); let set_state = VoterSetState::Paused { completed_rounds }; + + #[allow(deprecated)] aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; Ok(Some(set_state)) })?; diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index 10143154f9..9e257e9ccc 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -64,6 +64,7 @@ pub fn light_block_import, RA, PRA>( PRA::Api: GrandpaApi, { let info = client.info()?; + #[allow(deprecated)] let import_data = load_aux_import_data(info.chain.finalized_hash, &**client.backend(), api)?; Ok(GrandpaLightBlockImport { client, @@ -291,6 +292,7 @@ fn do_import_finality_proof, RA, J>( let authority_set_id = data.authority_set.set_id(); let authorities = data.authority_set.authorities(); let finality_effects = crate::finality_proof::check_finality_proof( + #[allow(deprecated)] &*client.backend().blockchain(), authority_set_id, authorities, @@ -314,6 +316,7 @@ fn do_import_finality_proof, RA, J>( // try to import latest justification let finalized_block_hash = finality_effects.block; + #[allow(deprecated)] 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()))?; @@ -502,6 +505,7 @@ fn require_insert_aux, RA>( B: Backend + 'static, E: CallExecutor + 'static + Clone + Send + Sync, { + #[allow(deprecated)] let backend = &**client.backend(); let encoded = value.encode(); let update_res = Backend::insert_aux(backend, &[(key, &encoded[..])], &[]); diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index 9f6f87f8c4..3fc9665a8d 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -218,6 +218,7 @@ pub fn run_grandpa_observer, N, RA, SC>( let completed_rounds = set_state.read().completed_rounds(); let set_state = VoterSetState::Paused { completed_rounds }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; set_state @@ -238,6 +239,7 @@ pub fn run_grandpa_observer, N, RA, SC>( current_round: HasVoted::No, }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; set_state diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index a64060d01f..455afb865a 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -119,6 +119,7 @@ impl TestNetFactory for GrandpaTestNet { { match client { PeersClient::Full(ref client) => { + #[allow(deprecated)] let select_chain = LongestChain::new( client.backend().clone(), client.import_lock().clone() @@ -676,6 +677,7 @@ fn transition_3_voters_twice_1_full_observer() { "Peer #{} failed to sync", i); let set: AuthoritySet = crate::aux_schema::load_authorities( + #[allow(deprecated)] &**full_client.backend() ).unwrap(); @@ -765,6 +767,7 @@ fn transition_3_voters_twice_1_full_observer() { .map(move |()| { let full_client = client.as_full().expect("only full clients are used in test"); let set: AuthoritySet = crate::aux_schema::load_authorities( + #[allow(deprecated)] &**full_client.backend() ).unwrap(); @@ -1035,6 +1038,7 @@ fn force_change_to_new_set() { let full_client = peer.client().as_full().expect("only full clients are used in test"); let set: AuthoritySet = crate::aux_schema::load_authorities( + #[allow(deprecated)] &**full_client.backend() ).unwrap(); @@ -1288,6 +1292,7 @@ fn voter_persists_its_votes() { assert_eq!(net.lock().peer(0).client().info().unwrap().chain.best_number, 40, "Peer #{} failed to sync", 0); + #[allow(deprecated)] let block_30_hash = net.lock().peer(0).client().as_full().unwrap().backend().blockchain().hash(30).unwrap().unwrap(); diff --git a/core/network/src/chain.rs b/core/network/src/chain.rs index 9548afc9d1..f7ce4f9d5c 100644 --- a/core/network/src/chain.rs +++ b/core/network/src/chain.rs @@ -134,6 +134,7 @@ impl Client for SubstrateClient where } let tree_route = ::client::blockchain::tree_route( + #[allow(deprecated)] self.backend().blockchain(), BlockId::Hash(*block), BlockId::Hash(*base), diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index ac9e9a98eb..301f5653f1 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -143,6 +143,7 @@ impl PeersClient { } pub fn as_in_memory_backend(&self) -> InMemoryBackend { + #[allow(deprecated)] match *self { PeersClient::Full(ref client) => client.backend().as_in_memory(), PeersClient::Light(_) => unimplemented!("TODO"), @@ -150,6 +151,7 @@ impl PeersClient { } pub fn get_aux(&self, key: &[u8]) -> ClientResult>> { + #[allow(deprecated)] match *self { PeersClient::Full(ref client) => client.backend().get_aux(key), PeersClient::Light(ref client) => client.backend().get_aux(key), diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 6e6503fc3d..202bd15b2a 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -646,6 +646,7 @@ mod tests { from: AccountKeyring::Alice.into(), to: Default::default(), }.into_signed_tx(); + #[allow(deprecated)] let best = LongestChain::new(client.backend().clone(), client.import_lock()) .best_chain().unwrap(); diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index fb3cad3238..ca008444e1 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -158,6 +158,7 @@ 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); + #[allow(deprecated)] let storage_root = LongestChain::new(client.backend().clone(), client.import_lock()) .best_chain().unwrap().state_root().clone(); diff --git a/core/test-client/src/trait_tests.rs b/core/test-client/src/trait_tests.rs index aa51f7d8bf..a6da3b206b 100644 --- a/core/test-client/src/trait_tests.rs +++ b/core/test-client/src/trait_tests.rs @@ -41,46 +41,49 @@ pub fn test_leaves_for_backend(backend: Arc) where // A1 -> D2 let client = new_with_backend(backend.clone(), false); + let blockchain = backend.blockchain(); let genesis_hash = client.info().unwrap().chain.genesis_hash; assert_eq!( - client.backend().blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![genesis_hash]); // G -> A1 let a1 = client.new_block().unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a1.hash()]); // A1 -> A2 let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); + + #[allow(deprecated)] assert_eq!( - client.backend().blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a2.hash()]); // A2 -> A3 let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a3.hash()]); // A3 -> A4 let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a4.hash()]); // A4 -> A5 let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash()]); // A1 -> B2 @@ -95,21 +98,21 @@ pub fn test_leaves_for_backend(backend: Arc) where let b2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, b2.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b2.hash()]); // B2 -> B3 let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b3.hash()]); // B3 -> B4 let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b4.hash()]); // // B2 -> C3 @@ -124,7 +127,7 @@ pub fn test_leaves_for_backend(backend: Arc) where let c3 = builder.bake().unwrap(); client.import(BlockOrigin::Own, c3.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b4.hash(), c3.hash()]); // A1 -> D2 @@ -139,7 +142,7 @@ pub fn test_leaves_for_backend(backend: Arc) where let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b4.hash(), c3.hash(), d2.hash()]); } @@ -154,6 +157,7 @@ pub fn test_children_for_backend(backend: Arc) where // A1 -> D2 let client = new_with_backend(backend.clone(), false); + let blockchain = backend.blockchain(); // G -> A1 let a1 = client.new_block().unwrap().bake().unwrap(); @@ -221,16 +225,16 @@ pub fn test_children_for_backend(backend: Arc) where let genesis_hash = client.info().unwrap().chain.genesis_hash; - let children1 = backend.blockchain().children(a4.hash()).unwrap(); + let children1 = blockchain.children(a4.hash()).unwrap(); assert_eq!(vec![a5.hash()], children1); - let children2 = backend.blockchain().children(a1.hash()).unwrap(); + let children2 = blockchain.children(a1.hash()).unwrap(); assert_eq!(vec![a2.hash(), b2.hash(), d2.hash()], children2); - let children3 = backend.blockchain().children(genesis_hash).unwrap(); + let children3 = blockchain.children(genesis_hash).unwrap(); assert_eq!(vec![a1.hash()], children3); - let children4 = backend.blockchain().children(b2.hash()).unwrap(); + let children4 = blockchain.children(b2.hash()).unwrap(); assert_eq!(vec![b3.hash(), c3.hash()], children4); } @@ -242,7 +246,8 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let client = new_with_backend(backend, false); + let client = new_with_backend(backend.clone(), false); + let blockchain = backend.blockchain(); // G -> A1 let a1 = client.new_block().unwrap().bake().unwrap(); @@ -310,21 +315,21 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc, Self::Block> { |config: &FactoryFullConfiguration, client: Arc>| { + #[allow(deprecated)] Ok(LongestChain::new( client.backend().clone(), client.import_lock() diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index a4ac1b0660..bb1c257155 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -180,6 +180,7 @@ construct_service_factory! { }}, LightImportQueue = AuraImportQueue { |config: &FactoryFullConfiguration, client: Arc>| { + #[allow(deprecated)] let fetch_checker = client.backend().blockchain().fetcher() .upgrade() .map(|fetcher| fetcher.checker().clone()) @@ -204,6 +205,7 @@ construct_service_factory! { }}, SelectChain = LongestChain, Self::Block> { |config: &FactoryFullConfiguration, client: Arc>| { + #[allow(deprecated)] Ok(LongestChain::new( client.backend().clone(), client.import_lock() diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index e2bd336916..0ec44093b4 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 81, - impl_version: 82, + impl_version: 83, apis: RUNTIME_API_VERSIONS, }; -- GitLab From 3b76ebc2b882a43d1d381cbcfa66dfd07f99e17d Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 28 May 2019 12:54:02 +0200 Subject: [PATCH 028/140] Allow passing an optional transport to network-libp2p (#2680) * Allow passing an optional transport * Fix tests * Fix Cargo.lock * Fix Cargo.lock again?!?! --- Cargo.lock | 24 +++++++++++++++--------- core/network-libp2p/src/config.rs | 9 +++++++++ core/network-libp2p/src/service_task.rs | 5 ++++- core/network-libp2p/src/transport.rs | 22 ++++++++++++++-------- core/service/test/src/lib.rs | 1 + 5 files changed, 43 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5347186c37..5d2a6c5b29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1439,10 +1439,10 @@ dependencies = [ "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-secio 0.8.1 (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-wasm-ext 0.1.1 (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)", @@ -1680,7 +1680,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.8.0" +version = "0.8.1" 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)", @@ -1693,11 +1693,11 @@ dependencies = [ "lazy_static 1.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)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.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)", - "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)", "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)", @@ -1735,13 +1735,13 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" -version = "0.1.0" +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)", "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)", + "parity-send-wrapper 0.1.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)", @@ -2349,6 +2349,11 @@ dependencies = [ "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-wasm" version = "0.31.3" @@ -4988,7 +4993,7 @@ name = "twox-hash" 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)", + "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5625,10 +5630,10 @@ dependencies = [ "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-secio 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ea5c0636053e01575d6269b6112f9239e9d35ca861e3e5c7d6970a07f9e1682a" "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-wasm-ext 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "318d727d5e8e0fe3bb70aacbf99bde57334eae9559deff447edd993422dc0f03" "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" @@ -5676,6 +5681,7 @@ dependencies = [ "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" "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-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "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" diff --git a/core/network-libp2p/src/config.rs b/core/network-libp2p/src/config.rs index d845d132a8..b9ccbb6428 100644 --- a/core/network-libp2p/src/config.rs +++ b/core/network-libp2p/src/config.rs @@ -17,6 +17,7 @@ //! Libp2p network configuration. use libp2p::identity::{Keypair, secp256k1, ed25519}; +use libp2p::wasm_ext; use libp2p::{Multiaddr, multiaddr::Protocol}; use std::error::Error; use std::{io::{self, Write}, iter, fs, net::Ipv4Addr, path::{Path, PathBuf}}; @@ -52,6 +53,13 @@ pub struct NetworkConfiguration { /// If true, the network will use mDNS to discover other libp2p nodes on the local network /// and connect to them if they support the same chain. pub enable_mdns: bool, + /// Optional external implementation of a libp2p transport. Used in WASM contexts where we need + /// some binding between the networking provided by the operating system or environment and + /// libp2p. + /// + /// This parameter exists whatever the target platform is, but it is expected to be set to + /// `Some` only when compiling for WASM. + pub wasm_external_transport: Option, } impl Default for NetworkConfiguration { @@ -70,6 +78,7 @@ impl Default for NetworkConfiguration { client_version: "unknown".into(), node_name: "unknown".into(), enable_mdns: false, + wasm_external_transport: None, } } } diff --git a/core/network-libp2p/src/service_task.rs b/core/network-libp2p/src/service_task.rs index 912c0f71ba..a58b24cbfe 100644 --- a/core/network-libp2p/src/service_task.rs +++ b/core/network-libp2p/src/service_task.rs @@ -89,7 +89,10 @@ where TMessage: CustomMessage + Send + 'static { let user_agent = format!("{} ({})", config.client_version, config.node_name); 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); + let (transport, bandwidth) = transport::build_transport( + local_identity, + config.wasm_external_transport + ); (Swarm::new(transport, behaviour, local_peer_id.clone()), bandwidth) }; diff --git a/core/network-libp2p/src/transport.rs b/core/network-libp2p/src/transport.rs index 1e8b280f3b..f2860c7856 100644 --- a/core/network-libp2p/src/transport.rs +++ b/core/network-libp2p/src/transport.rs @@ -17,11 +17,11 @@ use futures::prelude::*; use libp2p::{ InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, - mplex, identity, secio, yamux, websocket, bandwidth + mplex, identity, secio, yamux, websocket, bandwidth, wasm_ext }; #[cfg(not(target_os = "unknown"))] use libp2p::{tcp, dns}; -use libp2p::core::{self, transport::boxed::Boxed, muxing::StreamMuxerBox}; +use libp2p::core::{self, transport::boxed::Boxed, transport::OptionalTransport, muxing::StreamMuxerBox}; use std::{io, sync::Arc, time::Duration, usize}; pub use self::bandwidth::BandwidthSinks; @@ -31,20 +31,26 @@ pub use self::bandwidth::BandwidthSinks; /// Returns a `BandwidthSinks` object that allows querying the average bandwidth produced by all /// the connections spawned with this transport. pub fn build_transport( - keypair: identity::Keypair + keypair: identity::Keypair, + wasm_external_transport: Option ) -> (Boxed<(PeerId, StreamMuxerBox), io::Error>, Arc) { let mut mplex_config = mplex::MplexConfig::new(); mplex_config.max_buffer_len_behaviour(mplex::MaxBufferBehaviour::Block); mplex_config.max_buffer_len(usize::MAX); + let transport = if let Some(t) = wasm_external_transport { + OptionalTransport::some(t) + } else { + OptionalTransport::none() + }; + #[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) + let desktop_trans = tcp::TcpConfig::new(); + let desktop_trans = websocket::WsConfig::new(desktop_trans.clone()) + .or_transport(desktop_trans); + transport.or_transport(dns::DnsConfig::new(desktop_trans)) }; - #[cfg(target_os = "unknown")] - let transport = websocket::BrowserWsConfig::new(); let (transport, sinks) = bandwidth::BandwidthLogging::new(transport, Duration::from_secs(5)); diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index dc4676dc0a..88425e1956 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -99,6 +99,7 @@ fn node_config ( client_version: "network/test/0.1".to_owned(), node_name: "unknown".to_owned(), enable_mdns: false, + wasm_external_transport: None, }; Configuration { -- GitLab From b5483b43e714e6365828daa64556a4dbce243a88 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 28 May 2019 16:07:16 +0300 Subject: [PATCH 029/140] Remove BlockNumber <-> u64 conversions from light-client related code (#2666) * Remove As usage from CHT * Remove As usage from CHT (continue) * Restrict BN <-> int conversions in CT * more BN <-> u64 conversions removed * upd spec_version * Apply suggestions from code review Co-Authored-By: Gavin Wood * Apply suggestions from code review Co-Authored-By: Gavin Wood * more grumbles * fix last grumbles + compilation * too long lines * too long lines --- Cargo.lock | 2 + core/client/db/src/cache/mod.rs | 2 +- core/client/db/src/lib.rs | 68 +++-- core/client/db/src/light.rs | 124 +++++---- core/client/src/backend.rs | 12 +- core/client/src/cht.rs | 177 +++++++------ core/client/src/client.rs | 81 +++--- core/client/src/error.rs | 4 +- core/client/src/genesis.rs | 12 +- core/client/src/in_mem.rs | 63 +++-- core/client/src/light/backend.rs | 2 +- core/client/src/light/blockchain.rs | 14 +- core/client/src/light/call_executor.rs | 2 +- core/client/src/light/fetcher.rs | 53 ++-- core/executor/src/sandbox.rs | 4 +- core/executor/src/wasm_executor.rs | 9 +- core/executor/wasm/Cargo.lock | 16 ++ core/primitives/Cargo.toml | 4 +- core/primitives/src/changes_trie.rs | 87 ++++--- core/sr-io/src/lib.rs | 8 +- core/sr-io/with_std.rs | 6 +- core/sr-io/without_std.rs | 6 +- core/sr-primitives/src/traits.rs | 6 +- core/state-machine/Cargo.toml | 1 + core/state-machine/src/basic.rs | 4 +- core/state-machine/src/changes_trie/build.rs | 111 +++++--- .../src/changes_trie/build_iterator.rs | 90 +++++-- .../src/changes_trie/changes_iterator.rs | 236 +++++++++++------- core/state-machine/src/changes_trie/input.rs | 51 ++-- core/state-machine/src/changes_trie/mod.rs | 98 ++++++-- core/state-machine/src/changes_trie/prune.rs | 132 +++++----- .../state-machine/src/changes_trie/storage.rs | 58 +++-- core/state-machine/src/ext.rs | 64 ++--- core/state-machine/src/lib.rs | 43 ++-- core/state-machine/src/overlayed_changes.rs | 2 +- core/state-machine/src/testing.rs | 52 ++-- .../state-machine/src/trie_backend_essence.rs | 10 - core/test-runtime/src/system.rs | 6 +- node/executor/src/lib.rs | 14 +- node/runtime/src/lib.rs | 4 +- srml/system/src/lib.rs | 5 +- 41 files changed, 1088 insertions(+), 655 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5d2a6c5b29..a40f588d29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4268,6 +4268,7 @@ dependencies = [ "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)", "impl-serde 0.1.1 (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.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)", @@ -4410,6 +4411,7 @@ dependencies = [ "hash-db 0.12.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)", + "num-traits 0.2.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)", "substrate-panic-handler 2.0.0", diff --git a/core/client/db/src/cache/mod.rs b/core/client/db/src/cache/mod.rs index d8ffaea723..d79b01ab6b 100644 --- a/core/client/db/src/cache/mod.rs +++ b/core/client/db/src/cache/mod.rs @@ -35,7 +35,7 @@ mod list_cache; mod list_entry; mod list_storage; -/// Minimal post-finalization age age of finalized blocks before they'll pruned. +/// Minimal post-finalization age of finalized blocks before they'll pruned. const PRUNE_DEPTH: u32 = 1024; /// The type of entry that is inserted to the cache. diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 8f54099a78..e9e9a61a76 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -48,7 +48,7 @@ use primitives::storage::well_known_keys; use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; use runtime_primitives::traits::{ Block as BlockT, Header as HeaderT, NumberFor, Zero, One, Digest, DigestItem, - SaturatedConversion, + SaturatedConversion }; use runtime_primitives::BuildStorage; use state_machine::backend::Backend as StateBackend; @@ -67,7 +67,7 @@ pub use state_db::PruningMode; use client::in_mem::Backend as InMemoryBackend; const CANONICALIZATION_DELAY: u64 = 4096; -const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u64 = 32768; +const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u32 = 32768; /// DB-backed patricia trie state, transaction type is an overlay of changes to commit. pub type DbState = state_machine::TrieBackend>, Blake2Hasher>; @@ -423,11 +423,11 @@ impl state_machine::Storage for DbGenesisStorage { pub struct DbChangesTrieStorage { db: Arc, meta: Arc, Block::Hash>>>, - min_blocks_to_keep: Option, + min_blocks_to_keep: Option, _phantom: ::std::marker::PhantomData, } -impl DbChangesTrieStorage { +impl> DbChangesTrieStorage { /// Commit new changes trie. pub fn commit(&self, tx: &mut DBTransaction, mut changes_trie: MemoryDB) { for (key, (val, _)) in changes_trie.drain() { @@ -446,53 +446,79 @@ impl DbChangesTrieStorage { state_machine::prune_changes_tries( config, &*self, - min_blocks_to_keep, + min_blocks_to_keep.into(), &state_machine::ChangesTrieAnchorBlockId { hash: convert_hash(&block_hash), - number: block_num.saturated_into::(), + number: block_num, }, |node| tx.delete(columns::CHANGES_TRIE, node.as_ref())); } } -impl client::backend::PrunableStateChangesTrieStorage for DbChangesTrieStorage { +impl client::backend::PrunableStateChangesTrieStorage + for DbChangesTrieStorage +where + Block: BlockT, +{ fn oldest_changes_trie_block( &self, config: &ChangesTrieConfiguration, - best_finalized_block: u64 - ) -> u64 { + best_finalized_block: NumberFor, + ) -> NumberFor { match self.min_blocks_to_keep { Some(min_blocks_to_keep) => state_machine::oldest_non_pruned_changes_trie( config, - min_blocks_to_keep, + min_blocks_to_keep.into(), best_finalized_block, ), - None => 1, + None => One::one(), } } } -impl state_machine::ChangesTrieRootsStorage for DbChangesTrieStorage { - fn root(&self, anchor: &state_machine::ChangesTrieAnchorBlockId, block: u64) -> Result, String> { +impl state_machine::ChangesTrieRootsStorage> + for DbChangesTrieStorage +where + Block: BlockT, +{ + fn build_anchor( + &self, + hash: H256, + ) -> Result>, String> { + utils::read_header::(&*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Hash(hash)) + .map_err(|e| e.to_string()) + .and_then(|maybe_header| maybe_header.map(|header| + state_machine::ChangesTrieAnchorBlockId { + hash, + number: *header.number(), + } + ).ok_or_else(|| format!("Unknown header: {}", hash))) + } + + fn root( + &self, + anchor: &state_machine::ChangesTrieAnchorBlockId>, + block: NumberFor, + ) -> Result, String> { // check API requirement: we can't get NEXT block(s) based on anchor if block > anchor.number { return Err(format!("Can't get changes trie root at {} using anchor at {}", block, anchor.number)); } // we need to get hash of the block to resolve changes trie root - let block_id = if block <= self.meta.read().finalized_number.saturated_into::() { + let block_id = if block <= self.meta.read().finalized_number { // if block is finalized, we could just read canonical hash - BlockId::Number(block.saturated_into()) + BlockId::Number(block) } 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(current_num.saturated_into()) + &*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Number(current_num) ).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(block.saturated_into()) + BlockId::Number(block) } else { // else (block is not finalized + anchor is not canonicalized): // => we should find the required block hash by traversing @@ -503,7 +529,7 @@ impl state_machine::ChangesTrieRootsStorage for DbC ).map_err(|e| e.to_string())?; current_hash = *current_header.parent_hash(); - current_num = current_num - 1; + current_num = current_num - One::one(); } BlockId::Hash(current_hash) @@ -517,7 +543,11 @@ impl state_machine::ChangesTrieRootsStorage for DbC } } -impl state_machine::ChangesTrieStorage for DbChangesTrieStorage { +impl state_machine::ChangesTrieStorage> + for DbChangesTrieStorage +where + Block: BlockT, +{ fn get(&self, key: &H256, _prefix: &[u8]) -> Result, String> { self.db.get(columns::CHANGES_TRIE, &key[..]) .map_err(|err| format!("{}", err)) diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index 02525455ba..cbac1b730e 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -32,8 +32,9 @@ 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, SaturatedConversion, NumberFor, Digest, DigestItem +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, + Zero, One, NumberFor, Digest, DigestItem, }; use consensus_common::well_known_cache_keys; use crate::cache::{DbCacheSync, DbCache, ComplexBlockId, EntryType as CacheEntryType}; @@ -269,12 +270,18 @@ impl LightStorage { transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); // build new CHT(s) if required - if let Some(new_cht_number) = cht::is_build_required(cht::SIZE, *header.number()) { - let new_cht_start: NumberFor = cht::start_number(cht::SIZE, new_cht_number); + if let Some(new_cht_number) = cht::is_build_required(cht::size(), *header.number()) { + let new_cht_start: NumberFor = cht::start_number(cht::size(), new_cht_number); + + let mut current_num = new_cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); let new_header_cht_root = cht::compute_root::( - cht::SIZE, new_cht_number, (new_cht_start.saturated_into::()..) - .map(|num| self.hash(num.saturated_into())) + cht::size(), new_cht_number, cht_range.map(|num| self.hash(num)) )?; transaction.put( columns::CHT, @@ -284,9 +291,15 @@ 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 mut current_num = new_cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); let new_changes_trie_cht_root = cht::compute_root::( - cht::SIZE, new_cht_number, (new_cht_start.saturated_into::()..) - .map(|num| self.changes_trie_root(BlockId::Number(num.saturated_into()))) + cht::size(), new_cht_number, cht_range + .map(|num| self.changes_trie_root(BlockId::Number(num))) )?; transaction.put( columns::CHT, @@ -297,7 +310,7 @@ impl LightStorage { // prune headers that are replaced with CHT let mut prune_block = new_cht_start; - let new_cht_end = cht::end_number(cht::SIZE, new_cht_number); + let new_cht_end = cht::end_number(cht::size(), new_cht_number); trace!(target: "db", "Replacing blocks [{}..{}] with CHT#{}", new_cht_start, new_cht_end, new_cht_number); @@ -330,7 +343,7 @@ impl LightStorage { fn read_cht_root( &self, cht_type: u8, - cht_size: u64, + cht_size: NumberFor, block: NumberFor ) -> ClientResult { let no_cht_for_block = || ClientError::Backend(format!("CHT for block {} not exists", block)); @@ -482,11 +495,19 @@ impl LightBlockchainStorage for LightStorage } } - fn header_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult { + fn header_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult { self.read_cht_root(HEADER_CHT_PREFIX, cht_size, block) } - fn changes_trie_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult { + fn changes_trie_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult { self.read_cht_root(CHANGES_TRIE_CHT_PREFIX, cht_size, block) } @@ -670,33 +691,44 @@ pub(crate) mod tests { fn finalized_ancient_headers_are_replaced_with_cht() { fn insert_headers Header>(header_producer: F) -> LightStorage { let db = LightStorage::new_test(); + let cht_size: u64 = cht::size(); + let ucht_size: usize = cht_size as _; // insert genesis block header (never pruned) let mut prev_hash = insert_final_block(&db, HashMap::new(), || header_producer(&Default::default(), 0)); // insert SIZE blocks && ensure that nothing is pruned - for number in 0..cht::SIZE { + + for number in 0..cht::size() { prev_hash = insert_block(&db, HashMap::new(), || header_producer(&prev_hash, 1 + number)); } - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE) as usize); + assert_eq!(db.db.iter(columns::HEADER).count(), 1 + ucht_size); assert_eq!(db.db.iter(columns::CHT).count(), 0); // insert next SIZE blocks && ensure that nothing is pruned - for number in 0..cht::SIZE { - prev_hash = insert_block(&db, HashMap::new(), || header_producer(&prev_hash, 1 + cht::SIZE + number)); + for number in 0..(cht_size as _) { + prev_hash = insert_block( + &db, + HashMap::new(), + || header_producer(&prev_hash, 1 + cht_size + number), + ); } - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE + cht::SIZE) as usize); + assert_eq!(db.db.iter(columns::HEADER).count(), 1 + ucht_size + ucht_size); assert_eq!(db.db.iter(columns::CHT).count(), 0); - // insert block #{2 * cht::SIZE + 1} && check that new CHT is created + headers of this CHT are pruned + // insert block #{2 * cht::size() + 1} && check that new CHT is created + headers of this CHT are pruned // nothing is yet finalized, so nothing is pruned. - prev_hash = insert_block(&db, HashMap::new(), || header_producer(&prev_hash, 1 + cht::SIZE + cht::SIZE)); - assert_eq!(db.db.iter(columns::HEADER).count(), (2 + cht::SIZE + cht::SIZE) as usize); + prev_hash = insert_block( + &db, + HashMap::new(), + || header_producer(&prev_hash, 1 + cht_size + cht_size), + ); + assert_eq!(db.db.iter(columns::HEADER).count(), 2 + ucht_size + ucht_size); assert_eq!(db.db.iter(columns::CHT).count(), 0); // now finalize the block. - for i in (0..(cht::SIZE + cht::SIZE)).map(|i| i + 1) { - db.finalize_header(BlockId::Number(i)).unwrap(); + for i in (0..(ucht_size + ucht_size)).map(|i| i + 1) { + db.finalize_header(BlockId::Number(i as _)).unwrap(); } db.finalize_header(BlockId::Hash(prev_hash)).unwrap(); db @@ -704,34 +736,36 @@ pub(crate) mod tests { // when headers are created without changes tries roots let db = insert_headers(default_header); - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE + 1) as usize); - assert_eq!(db.db.iter(columns::KEY_LOOKUP).count(), (2 * (1 + cht::SIZE + 1)) as usize); + let cht_size: u64 = cht::size(); + assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht_size + 1) as usize); + assert_eq!(db.db.iter(columns::KEY_LOOKUP).count(), (2 * (1 + cht_size + 1)) as usize); assert_eq!(db.db.iter(columns::CHT).count(), 1); - assert!((0..cht::SIZE).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE / 2).is_ok()); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE / 2).is_err()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); + assert!((0..cht_size as _).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); + assert!(db.header_cht_root(cht_size, cht_size / 2).is_ok()); + assert!(db.header_cht_root(cht_size, cht_size + cht_size / 2).is_err()); + assert!(db.changes_trie_cht_root(cht_size, cht_size / 2).is_err()); + assert!(db.changes_trie_cht_root(cht_size, cht_size + cht_size / 2).is_err()); // when headers are created with changes tries roots let db = insert_headers(header_with_changes_trie); - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE + 1) as usize); + assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht_size + 1) as usize); assert_eq!(db.db.iter(columns::CHT).count(), 2); - assert!((0..cht::SIZE).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE / 2).is_ok()); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE / 2).is_ok()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); + assert!((0..cht_size as _).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); + assert!(db.header_cht_root(cht_size, cht_size / 2).is_ok()); + assert!(db.header_cht_root(cht_size, cht_size + cht_size / 2).is_err()); + assert!(db.changes_trie_cht_root(cht_size, cht_size / 2).is_ok()); + assert!(db.changes_trie_cht_root(cht_size, cht_size + cht_size / 2).is_err()); } #[test] fn get_cht_fails_for_genesis_block() { - assert!(LightStorage::::new_test().header_cht_root(cht::SIZE, 0).is_err()); + assert!(LightStorage::::new_test().header_cht_root(cht::size(), 0).is_err()); } #[test] fn get_cht_fails_for_non_existant_cht() { - assert!(LightStorage::::new_test().header_cht_root(cht::SIZE, (cht::SIZE / 2) as u64).is_err()); + let cht_size: u64 = cht::size(); + assert!(LightStorage::::new_test().header_cht_root(cht_size, cht_size / 2).is_err()); } #[test] @@ -740,20 +774,22 @@ pub(crate) mod tests { // insert 1 + SIZE + SIZE + 1 blocks so that CHT#0 is created let mut prev_hash = insert_final_block(&db, HashMap::new(), || header_with_changes_trie(&Default::default(), 0)); - for i in 1..1 + cht::SIZE + cht::SIZE + 1 { + let cht_size: u64 = cht::size(); + let ucht_size: usize = cht_size as _; + for i in 1..1 + ucht_size + ucht_size + 1 { prev_hash = insert_block(&db, HashMap::new(), || header_with_changes_trie(&prev_hash, i as u64)); db.finalize_header(BlockId::Hash(prev_hash)).unwrap(); } - let cht_root_1 = db.header_cht_root(cht::SIZE, cht::start_number(cht::SIZE, 0)).unwrap(); - let cht_root_2 = db.header_cht_root(cht::SIZE, (cht::start_number(cht::SIZE, 0) + cht::SIZE / 2) as u64).unwrap(); - let cht_root_3 = db.header_cht_root(cht::SIZE, cht::end_number(cht::SIZE, 0)).unwrap(); + let cht_root_1 = db.header_cht_root(cht_size, cht::start_number(cht_size, 0)).unwrap(); + let cht_root_2 = db.header_cht_root(cht_size, cht::start_number(cht_size, 0) + cht_size / 2).unwrap(); + let cht_root_3 = db.header_cht_root(cht_size, cht::end_number(cht_size, 0)).unwrap(); assert_eq!(cht_root_1, cht_root_2); assert_eq!(cht_root_2, cht_root_3); - let cht_root_1 = db.changes_trie_cht_root(cht::SIZE, cht::start_number(cht::SIZE, 0)).unwrap(); - let cht_root_2 = db.changes_trie_cht_root(cht::SIZE, (cht::start_number(cht::SIZE, 0) + cht::SIZE / 2) as u64).unwrap(); - let cht_root_3 = db.changes_trie_cht_root(cht::SIZE, cht::end_number(cht::SIZE, 0)).unwrap(); + let cht_root_1 = db.changes_trie_cht_root(cht_size, cht::start_number(cht_size, 0)).unwrap(); + let cht_root_2 = db.changes_trie_cht_root(cht_size, cht::start_number(cht_size, 0) + cht_size / 2).unwrap(); + let cht_root_3 = db.changes_trie_cht_root(cht_size, cht::end_number(cht_size, 0)).unwrap(); assert_eq!(cht_root_1, cht_root_2); assert_eq!(cht_root_2, cht_root_3); } diff --git a/core/client/src/backend.rs b/core/client/src/backend.rs index 09faab1a12..d2cc086ecd 100644 --- a/core/client/src/backend.rs +++ b/core/client/src/backend.rs @@ -127,7 +127,7 @@ pub trait Backend: AuxStore + Send + Sync where /// Associated state backend type. type State: StateBackend; /// Changes trie storage. - type ChangesTrieStorage: PrunableStateChangesTrieStorage; + type ChangesTrieStorage: PrunableStateChangesTrieStorage; /// Begin a new block insertion transaction with given parent block id. /// When constructing the genesis, this is called with all-zero hash. @@ -177,9 +177,15 @@ pub trait Backend: AuxStore + Send + Sync where } /// Changes trie storage that supports pruning. -pub trait PrunableStateChangesTrieStorage: StateChangesTrieStorage { +pub trait PrunableStateChangesTrieStorage: + StateChangesTrieStorage> +{ /// Get number block of oldest, non-pruned changes trie. - fn oldest_changes_trie_block(&self, config: &ChangesTrieConfiguration, best_finalized: u64) -> u64; + fn oldest_changes_trie_block( + &self, + config: &ChangesTrieConfiguration, + best_finalized: NumberFor, + ) -> NumberFor; } /// Mark for all Backend implementations, that are making use of state data, stored locally. diff --git a/core/client/src/cht.rs b/core/client/src/cht.rs index 42b4654d34..996a6b37f1 100644 --- a/core/client/src/cht.rs +++ b/core/client/src/cht.rs @@ -26,15 +26,11 @@ use std::collections::HashSet; use hash_db; +use parity_codec::Encode; use trie; use primitives::{H256, convert_hash}; -// 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 runtime_primitives::traits::{Header as HeaderT, SimpleArithmetic, Zero, One}; 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}; @@ -43,14 +39,19 @@ 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. -pub const SIZE: u64 = 2048; +const SIZE: u32 = 2048; + +/// Gets default CHT size. +pub fn size>() -> N { + SIZE.into() +} /// Returns Some(cht_number) if CHT is need to be built when the block with given number is canonized. -pub fn is_build_required(cht_size: u64, block_num: N) -> Option +pub fn is_build_required(cht_size: N, block_num: N) -> Option where N: Clone + SimpleArithmetic, { - let block_cht_num = block_to_cht_number(cht_size, block_num.clone())?; + let block_cht_num = block_to_cht_number(cht_size.clone(), block_num.clone())?; let two = N::one() + N::one(); if block_cht_num < two { return None; @@ -67,7 +68,7 @@ pub fn is_build_required(cht_size: u64, block_num: N) -> Option /// SIZE items. The items are assumed to proceed sequentially from `start_number(cht_num)`. /// Discards the trie's nodes. pub fn compute_root( - cht_size: u64, + cht_size: Header::Number, cht_num: Header::Number, hashes: I, ) -> ClientResult @@ -84,7 +85,7 @@ pub fn compute_root( /// Build CHT-based header proof. pub fn build_proof( - cht_size: u64, + cht_size: Header::Number, cht_num: Header::Number, blocks: BlocksI, hashes: HashesI @@ -175,7 +176,7 @@ fn do_check_proof( /// Group ordered blocks by CHT number and call functor with blocks of each group. pub fn for_each_cht_group( - cht_size: u64, + cht_size: Header::Number, blocks: I, mut functor: F, mut functor_param: P, @@ -188,7 +189,7 @@ 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.saturated_into()) { + let new_cht_num = match block_to_cht_number(cht_size, block) { Some(new_cht_num) => new_cht_num, None => return Err(ClientError::Backend(format!( "Cannot compute CHT root for the block #{}", block)).into() @@ -203,7 +204,7 @@ pub fn for_each_cht_group( functor_param = functor( functor_param, - current_cht_num.saturated_into(), + current_cht_num, ::std::mem::replace(&mut current_cht_blocks, Vec::new()), )?; } @@ -215,7 +216,7 @@ pub fn for_each_cht_group( if let Some(current_cht_num) = current_cht_num { functor( functor_param, - current_cht_num.saturated_into(), + current_cht_num, ::std::mem::replace(&mut current_cht_blocks, Vec::new()), )?; } @@ -225,7 +226,7 @@ pub fn for_each_cht_group( /// Build pairs for computing CHT. fn build_pairs( - cht_size: u64, + cht_size: Header::Number, cht_num: Header::Number, hashes: I ) -> ClientResult, Vec)>> @@ -235,28 +236,25 @@ fn build_pairs( { let start_num = start_number(cht_size, cht_num); let mut pairs = Vec::new(); - let mut hash_number = start_num; - for hash in hashes.into_iter().take(cht_size as usize) { + let mut hash_index = Header::Number::zero(); + for hash in hashes.into_iter() { let hash = hash?.ok_or_else(|| ClientError::from( - ClientError::MissingHashRequiredForCHT( - cht_num.saturated_into::(), - hash_number.saturated_into::() - ) + ClientError::MissingHashRequiredForCHT ))?; pairs.push(( - encode_cht_key(hash_number).to_vec(), + encode_cht_key(start_num + hash_index).to_vec(), encode_cht_value(hash) )); - hash_number += Header::Number::one(); + hash_index += Header::Number::one(); + if hash_index == cht_size { + break; + } } - if pairs.len() as u64 == cht_size { + if hash_index == cht_size { Ok(pairs) } else { - Err(ClientError::MissingHashRequiredForCHT( - cht_num.saturated_into::(), - hash_number.saturated_into::() - )) + Err(ClientError::MissingHashRequiredForCHT) } } @@ -266,39 +264,28 @@ fn build_pairs( /// More generally: CHT N includes block (1 + N*SIZE)...((N+1)*SIZE). /// 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 * cht_size.saturated_into()) + N::one() +pub fn start_number(cht_size: N, cht_num: N) -> N { + (cht_num * cht_size) + 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()) * cht_size.saturated_into() +pub fn end_number(cht_size: N, cht_num: N) -> N { + (cht_num + N::one()) * cht_size } /// Convert a block number to a CHT number. /// Returns `None` for `block_num` == 0, `Some` otherwise. -pub fn block_to_cht_number(cht_size: u64, block_num: N) -> Option { +pub fn block_to_cht_number(cht_size: N, block_num: N) -> Option { if block_num == N::zero() { None } else { - Some((block_num - N::one()) / cht_size.saturated_into()) + Some((block_num - N::one()) / cht_size) } } /// Convert header number into CHT key. -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, - ((number >> 40) & 0xff) as u8, - ((number >> 32) & 0xff) as u8, - ((number >> 24) & 0xff) as u8, - ((number >> 16) & 0xff) as u8, - ((number >> 8) & 0xff) as u8, - (number & 0xff) as u8 - ] +pub fn encode_cht_key(number: N) -> Vec { + number.encode() } /// Convert header hash into CHT value. @@ -323,8 +310,8 @@ mod tests { #[test] fn is_build_required_works() { - assert_eq!(is_build_required(SIZE, 0u64), None); - assert_eq!(is_build_required(SIZE, 1u64), None); + assert_eq!(is_build_required(SIZE, 0u32.into()), None); + assert_eq!(is_build_required(SIZE, 1u32.into()), None); assert_eq!(is_build_required(SIZE, SIZE), None); assert_eq!(is_build_required(SIZE, SIZE + 1), None); assert_eq!(is_build_required(SIZE, 2 * SIZE), None); @@ -335,73 +322,101 @@ mod tests { #[test] fn start_number_works() { - assert_eq!(start_number(SIZE, 0u64), 1u64); - assert_eq!(start_number(SIZE, 1u64), SIZE + 1); - assert_eq!(start_number(SIZE, 2u64), SIZE + SIZE + 1); + assert_eq!(start_number(SIZE, 0u32), 1u32); + assert_eq!(start_number(SIZE, 1u32), SIZE + 1); + assert_eq!(start_number(SIZE, 2u32), SIZE + SIZE + 1); } #[test] fn end_number_works() { - assert_eq!(end_number(SIZE, 0u64), SIZE); - assert_eq!(end_number(SIZE, 1u64), SIZE + SIZE); - assert_eq!(end_number(SIZE, 2u64), SIZE + SIZE + SIZE); + assert_eq!(end_number(SIZE, 0u32), SIZE); + assert_eq!(end_number(SIZE, 1u32), SIZE + SIZE); + assert_eq!(end_number(SIZE, 2u32), SIZE + SIZE + SIZE); } #[test] fn build_pairs_fails_when_no_enough_blocks() { - assert!(build_pairs::(SIZE, 0, + assert!(build_pairs::(SIZE as _, 0, ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize / 2)).is_err()); } #[test] fn build_pairs_fails_when_missing_block() { - assert!(build_pairs::(SIZE, 0, ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize / 2) - .chain(::std::iter::once(Ok(None))) - .chain(::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(2)))).take(SIZE as usize / 2 - 1))).is_err()); + assert!(build_pairs::( + SIZE as _, + 0, + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize / 2) + .chain(::std::iter::once(Ok(None))) + .chain(::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(2)))) + .take(SIZE as usize / 2 - 1)) + ).is_err()); } #[test] fn compute_root_works() { - assert!(compute_root::(SIZE, 42, - ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize)).is_ok()); + assert!(compute_root::( + SIZE as _, + 42, + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize) + ).is_ok()); } #[test] #[should_panic] fn build_proof_panics_when_querying_wrong_block() { assert!(build_proof::( - SIZE, 0, vec![(SIZE * 1000) as u64], - ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize)).is_err()); + SIZE as _, + 0, + vec![(SIZE * 1000) as u64], + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize) + ).is_err()); } #[test] fn build_proof_works() { assert!(build_proof::( - SIZE, 0, vec![(SIZE / 2) as u64], - ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize)).is_ok()); + SIZE as _, + 0, + vec![(SIZE / 2) as u64], + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize) + ).is_ok()); } #[test] #[should_panic] fn for_each_cht_group_panics() { - let _ = for_each_cht_group::(SIZE, vec![SIZE * 5, SIZE * 2], |_, _, _| Ok(()), ()); + let cht_size = SIZE as u64; + let _ = for_each_cht_group::( + cht_size, + vec![cht_size * 5, cht_size * 2], + |_, _, _| Ok(()), + (), + ); } #[test] fn for_each_cht_group_works() { - let _ = for_each_cht_group::(SIZE, vec![ - SIZE * 2 + 1, SIZE * 2 + 2, SIZE * 2 + 5, - SIZE * 4 + 1, SIZE * 4 + 7, - SIZE * 6 + 1 - ], |_, cht_num, blocks| { - match cht_num { - 2 => assert_eq!(blocks, vec![SIZE * 2 + 1, SIZE * 2 + 2, SIZE * 2 + 5]), - 4 => assert_eq!(blocks, vec![SIZE * 4 + 1, SIZE * 4 + 7]), - 6 => assert_eq!(blocks, vec![SIZE * 6 + 1]), - _ => unreachable!(), - } - - Ok(()) - }, ()); + let cht_size = SIZE as u64; + let _ = for_each_cht_group::( + cht_size, + vec![ + cht_size * 2 + 1, cht_size * 2 + 2, cht_size * 2 + 5, + cht_size * 4 + 1, cht_size * 4 + 7, + cht_size * 6 + 1 + ], |_, cht_num, blocks| { + match cht_num { + 2 => assert_eq!(blocks, vec![cht_size * 2 + 1, cht_size * 2 + 2, cht_size * 2 + 5]), + 4 => assert_eq!(blocks, vec![cht_size * 4 + 1, cht_size * 4 + 7]), + 6 => assert_eq!(blocks, vec![cht_size * 6 + 1]), + _ => unreachable!(), + } + + Ok(()) + }, () + ); } } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index a7e1e18847..f36992a14e 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -448,7 +448,7 @@ impl Client where /// Reads given header and generates CHT-based header proof. pub fn header_proof(&self, id: &BlockId) -> error::Result<(Block::Header, Vec>)> { - self.header_proof_with_cht_size(id, cht::SIZE) + self.header_proof_with_cht_size(id, cht::size()) } /// Get block hash by number. @@ -459,16 +459,23 @@ impl Client where } /// Reads given header and generates CHT-based header proof for CHT of given size. - pub fn header_proof_with_cht_size(&self, + pub fn header_proof_with_cht_size( + &self, id: &BlockId, - cht_size: u64 + cht_size: NumberFor, ) -> 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.saturated_into()..).map(|num| self.block_hash(num.saturated_into())); + let mut current_num = cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); + let headers = cht_range.map(|num| self.block_hash(num)); let proof = cht::build_proof::(cht_size, cht_num, ::std::iter::once(block_num), headers)?; Ok((header, proof)) } @@ -486,14 +493,13 @@ impl Client where Some((config, storage)) => (config, storage), None => return Ok(None), }; - let first = first.saturated_into::(); - let last_num = self.backend.blockchain().expect_block_number_from_id(&last)?.saturated_into::(); + let last_num = self.backend.blockchain().expect_block_number_from_id(&last)?; if first > last_num { 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.saturated_into::()); - let first = ::std::cmp::max(first, oldest).saturated_into::>(); + let oldest = storage.oldest_changes_trie_block(&config, finalized_number); + let first = ::std::cmp::max(first, oldest); Ok(Some((first, last))) } @@ -506,20 +512,20 @@ 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)?.saturated_into::(); + let last_number = self.backend.blockchain().expect_block_number_from_id(&last)?; let last_hash = self.backend.blockchain().expect_block_hash_from_id(&last)?; - key_changes::<_, Blake2Hasher>( + key_changes::<_, Blake2Hasher, _>( &config, &*storage, - first.saturated_into::(), + first, &ChangesTrieAnchorBlockId { hash: convert_hash(&last_hash), number: last_number, }, - self.backend.blockchain().info()?.best_number.saturated_into::(), + self.backend.blockchain().info()?.best_number, &key.0) - .and_then(|r| r.map(|r| r.map(|(block, tx)| (block.saturated_into(), tx))).collect::>()) + .and_then(|r| r.map(|r| r.map(|(block, tx)| (block, tx))).collect::>()) .map_err(|err| error::Error::ChangesTrieAccessFailed(err)) } @@ -543,7 +549,7 @@ impl Client where min, max, key, - cht::SIZE, + cht::size(), ) } @@ -555,21 +561,29 @@ impl Client where min: Block::Hash, max: Block::Hash, key: &StorageKey, - cht_size: u64, + cht_size: NumberFor, ) -> error::Result> { struct AccessedRootsRecorder<'a, Block: BlockT> { - storage: &'a ChangesTrieStorage, - min: u64, + storage: &'a ChangesTrieStorage>, + min: NumberFor, required_roots_proofs: Mutex, H256>>, }; - impl<'a, Block: BlockT> ChangesTrieRootsStorage for AccessedRootsRecorder<'a, Block> { - fn root(&self, anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { + impl<'a, Block: BlockT> ChangesTrieRootsStorage> for AccessedRootsRecorder<'a, Block> { + fn build_anchor(&self, hash: H256) -> Result>, String> { + self.storage.build_anchor(hash) + } + + fn root( + &self, + anchor: &ChangesTrieAnchorBlockId>, + block: NumberFor, + ) -> Result, String> { let root = self.storage.root(anchor, block)?; if block < self.min { if let Some(ref root) = root { self.required_roots_proofs.lock().insert( - block.saturated_into(), + block, root.clone() ); } @@ -578,7 +592,7 @@ impl Client where } } - impl<'a, Block: BlockT> ChangesTrieStorage for AccessedRootsRecorder<'a, Block> { + impl<'a, Block: BlockT> ChangesTrieStorage> for AccessedRootsRecorder<'a, Block> { fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { self.storage.get(key, prefix) } @@ -589,7 +603,7 @@ impl Client where let recording_storage = AccessedRootsRecorder:: { storage, - min: min_number.saturated_into::(), + min: min_number, required_roots_proofs: Mutex::new(BTreeMap::new()), }; @@ -600,12 +614,10 @@ impl Client where // fetch key changes proof let first_number = self.backend.blockchain() - .expect_block_number_from_id(&BlockId::Hash(first))? - .saturated_into::(); + .expect_block_number_from_id(&BlockId::Hash(first))?; let last_number = self.backend.blockchain() - .expect_block_number_from_id(&BlockId::Hash(last))? - .saturated_into::(); - let key_changes_proof = key_changes_proof::<_, Blake2Hasher>( + .expect_block_number_from_id(&BlockId::Hash(last))?; + let key_changes_proof = key_changes_proof::<_, Blake2Hasher, _>( &config, &recording_storage, first_number, @@ -613,7 +625,7 @@ impl Client where hash: convert_hash(&last), number: last_number, }, - max_number.saturated_into::(), + max_number, &key.0 ) .map_err(|err| error::Error::from(error::Error::ChangesTrieAccessFailed(err)))?; @@ -634,7 +646,7 @@ impl Client where /// Generate CHT-based proof for roots of changes tries at given blocks. fn changes_trie_roots_proof>>( &self, - cht_size: u64, + cht_size: NumberFor, blocks: I ) -> error::Result>> { // most probably we have touched several changes tries that are parts of the single CHT @@ -653,12 +665,19 @@ impl Client where /// Generates CHT-based proof for roots of changes tries at given blocks (that are part of single CHT). fn changes_trie_roots_proof_at_cht( &self, - cht_size: u64, + cht_size: NumberFor, cht_num: NumberFor, blocks: Vec> ) -> error::Result>> { let cht_start = cht::start_number(cht_size, cht_num); - let roots = (cht_start.saturated_into()..).map(|num| self.header(&BlockId::Number(num.saturated_into())) + let mut current_num = cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); + let roots = cht_range + .map(|num| self.header(&BlockId::Number(num)) .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) diff --git a/core/client/src/error.rs b/core/client/src/error.rs index b201c092e0..bad279f2e4 100644 --- a/core/client/src/error.rs +++ b/core/client/src/error.rs @@ -92,8 +92,8 @@ pub enum Error { #[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), + #[display(fmt = "Failed to get hash of block for building CHT")] + MissingHashRequiredForCHT, /// A convenience variant for String #[display(fmt = "{}", _0)] Msg(String), diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index 74bc74360a..73bd1e0368 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -84,7 +84,7 @@ mod tests { state_machine::new( backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -97,7 +97,7 @@ mod tests { for tx in transactions.iter() { state_machine::new( backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -110,7 +110,7 @@ mod tests { let (ret_data, _, _) = state_machine::new( backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -157,7 +157,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let _ = state_machine::new( &backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -186,7 +186,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let _ = state_machine::new( &backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -215,7 +215,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let r = state_machine::new( &backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &Executor::new(None), diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index 558643e887..1172939b34 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -23,7 +23,7 @@ use primitives::{ChangesTrieConfiguration, storage::well_known_keys}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ Block as BlockT, Header as HeaderT, Zero, - NumberFor, SaturatedConversion, Digest, DigestItem + NumberFor, Digest, DigestItem }; use runtime_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::backend::{Backend as StateBackend, InMemory}; @@ -415,12 +415,20 @@ impl light::blockchain::Storage for Blockchain Blockchain::finalize_header(self, id, None) } - fn header_cht_root(&self, _cht_size: u64, block: NumberFor) -> error::Result { + fn header_cht_root( + &self, + _cht_size: NumberFor, + block: NumberFor, + ) -> error::Result { self.storage.read().header_cht_roots.get(&block).cloned() .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 { + fn changes_trie_cht_root( + &self, + _cht_size: NumberFor, + block: NumberFor, + ) -> error::Result { self.storage.read().changes_trie_cht_roots.get(&block).cloned() .ok_or_else(|| error::Error::Backend(format!("Changes trie CHT for block {} not exists", block))) } @@ -531,7 +539,7 @@ where H::Out: Ord, { states: RwLock>>, - changes_trie_storage: ChangesTrieStorage, + changes_trie_storage: ChangesTrieStorage, blockchain: Blockchain, } @@ -581,7 +589,7 @@ where type BlockImportOperation = BlockImportOperation; type Blockchain = Blockchain; type State = InMemory; - type ChangesTrieStorage = ChangesTrieStorage; + type ChangesTrieStorage = ChangesTrieStorage; fn begin_operation(&self) -> error::Result { let old_state = self.state_at(BlockId::Hash(Default::default()))?; @@ -622,7 +630,7 @@ where 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()).saturated_into::(), + *header.number(), changes_trie_root, changes_trie_update ); @@ -699,22 +707,45 @@ where } /// Prunable in-memory changes trie storage. -pub struct ChangesTrieStorage(InMemoryChangesTrieStorage); -impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage { - fn oldest_changes_trie_block(&self, _config: &ChangesTrieConfiguration, _best_finalized: u64) -> u64 { - 0 +pub struct ChangesTrieStorage(InMemoryChangesTrieStorage>); +impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage { + fn oldest_changes_trie_block( + &self, + _config: &ChangesTrieConfiguration, + _best_finalized: NumberFor, + ) -> NumberFor { + Zero::zero() } } -impl state_machine::ChangesTrieRootsStorage for ChangesTrieStorage { - fn root(&self, anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { - self.0.root(anchor, block) +impl state_machine::ChangesTrieRootsStorage> for ChangesTrieStorage + where + Block: BlockT, + H: Hasher, +{ + fn build_anchor( + &self, + _hash: H::Out, + ) -> Result>, String> { + Err("Dummy implementation".into()) + } + + fn root( + &self, + _anchor: &ChangesTrieAnchorBlockId>, + _block: NumberFor, + ) -> Result, String> { + Err("Dummy implementation".into()) } } -impl state_machine::ChangesTrieStorage for ChangesTrieStorage { - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { - self.0.get(key, prefix) +impl state_machine::ChangesTrieStorage> for ChangesTrieStorage + where + Block: BlockT, + H: Hasher, +{ + fn get(&self, _key: &H::Out, _prefix: &[u8]) -> Result, String> { + Err("Dummy implementation".into()) } } diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index 0579c8c8d4..bf5eb11f26 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -112,7 +112,7 @@ impl ClientBackend for Backend where type BlockImportOperation = ImportOperation; type Blockchain = Blockchain; type State = OnDemandOrGenesisState; - type ChangesTrieStorage = in_mem::ChangesTrieStorage; + type ChangesTrieStorage = in_mem::ChangesTrieStorage; fn begin_operation(&self) -> ClientResult { Ok(ImportOperation { diff --git a/core/client/src/light/blockchain.rs b/core/client/src/light/blockchain.rs index d7fcd44232..b231f7e8aa 100644 --- a/core/client/src/light/blockchain.rs +++ b/core/client/src/light/blockchain.rs @@ -56,10 +56,18 @@ pub trait Storage: AuxStore + BlockchainHeaderBackend { fn last_finalized(&self) -> ClientResult; /// Get headers CHT root for given block. Fails if the block is not pruned (not a part of any CHT). - fn header_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult; + fn header_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult; /// Get changes trie CHT root for given block. Fails if the block is not pruned (not a part of any CHT). - fn changes_trie_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult; + fn changes_trie_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult; /// Get storage cache. fn cache(&self) -> Option>>; @@ -116,7 +124,7 @@ impl BlockchainHeaderBackend for Blockchain where Bloc self.fetcher().upgrade().ok_or(ClientError::NotAvailableOnLightClient)? .remote_header(RemoteHeaderRequest { - cht_root: self.storage.header_cht_root(cht::SIZE, number)?, + cht_root: self.storage.header_cht_root(cht::size(), number)?, block: number, retry_count: None, }) diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index a45a166674..982f106f2a 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -435,7 +435,7 @@ pub fn check_execution_proof( Header: HeaderT, E: CodeExecutor, H: Hasher, - H::Out: Ord, + H::Out: Ord + 'static, { let local_state_root = request.header.state_root(); let root: H::Out = convert_hash(&local_state_root); diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index 29fd6f4c39..39563aa83c 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -22,11 +22,11 @@ use std::marker::PhantomData; use futures::IntoFuture; use hash_db::{HashDB, Hasher}; -use parity_codec::Encode; +use parity_codec::{Decode, Encode}; use primitives::{ChangesTrieConfiguration, convert_hash}; use runtime_primitives::traits::{ Block as BlockT, Header as HeaderT, Hash, HashFor, NumberFor, - UniqueSaturatedInto, UniqueSaturatedFrom, SaturatedConversion + SimpleArithmetic, CheckedConversion, }; use state_machine::{CodeExecutor, ChangesTrieRootsStorage, ChangesTrieAnchorBlockId, TrieBackend, read_proof_check, key_changes_proof_check, @@ -236,7 +236,7 @@ impl, F> LightDataChecker, remote_proof: ChangesProof, - cht_size: u64, + cht_size: NumberFor, ) -> ClientResult, u32)>> where H: Hasher, @@ -284,30 +284,27 @@ impl, F> LightDataChecker( + key_changes_proof_check::<_, H, _>( &request.changes_trie_config, &RootsStorage { roots: (request.tries_roots.0, &request.tries_roots.2), prev_roots: remote_roots, }, remote_proof, - request.first_block.0.saturated_into::(), + request.first_block.0, &ChangesTrieAnchorBlockId { hash: convert_hash(&request.last_block.1), - number: request.last_block.0.saturated_into::(), + number: request.last_block.0, }, - remote_max_block.saturated_into::(), + remote_max_block, &request.key) - .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. fn check_changes_tries_proof( &self, - cht_size: u64, + cht_size: NumberFor, remote_roots: &BTreeMap, B::Hash>, remote_roots_proof: Vec>, ) -> ClientResult<()> @@ -363,7 +360,7 @@ impl FetchChecker for LightDataChecker, H: Hasher, - H::Out: Ord, + H::Out: Ord + 'static, S: BlockchainStorage, F: Send + Sync, { @@ -419,7 +416,7 @@ impl FetchChecker for LightDataChecker, remote_proof: ChangesProof ) -> ClientResult, u32)>> { - self.check_changes_proof_with_cht_size(request, remote_proof, cht::SIZE) + self.check_changes_proof_with_cht_size(request, remote_proof, cht::size()) } fn check_body_proof( @@ -443,26 +440,38 @@ impl FetchChecker for LightDataChecker as a changes trie roots storage. -struct RootsStorage<'a, Number: UniqueSaturatedInto + UniqueSaturatedFrom, Hash: 'a> { +struct RootsStorage<'a, Number: SimpleArithmetic, Hash: 'a> { roots: (Number, &'a [Hash]), prev_roots: BTreeMap, } -impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a, Number, Hash> +impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a, Number, Hash> where H: Hasher, - Number: Send + Sync + Eq + ::std::cmp::Ord + Copy + UniqueSaturatedInto - + UniqueSaturatedFrom, + Number: ::std::fmt::Display + Clone + SimpleArithmetic + Encode + Decode + Send + Sync + 'static, Hash: 'a + Send + Sync + Clone + AsRef<[u8]>, { - fn root(&self, _anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { + fn build_anchor( + &self, + _hash: H::Out, + ) -> Result, String> { + Err("build_anchor is only called when building block".into()) + } + + fn root( + &self, + _anchor: &ChangesTrieAnchorBlockId, + block: Number, + ) -> Result, String> { // we can't ask for roots from parallel forks here => ignore anchor - let root = if block < self.roots.0.saturated_into::() { + let root = if block < self.roots.0 { self.prev_roots.get(&Number::unique_saturated_from(block)).cloned() } else { - block.checked_sub(self.roots.0.saturated_into::()) - .and_then(|index| self.roots.1.get(index as usize)) - .cloned() + let index: Option = block.checked_sub(&self.roots.0).and_then(|index| index.checked_into()); + match index { + Some(index) => self.roots.1.get(index as usize).cloned(), + None => None, + } }; Ok(root.map(|root| { diff --git a/core/executor/src/sandbox.rs b/core/executor/src/sandbox.rs index 24c8ad66ea..377294f7b1 100644 --- a/core/executor/src/sandbox.rs +++ b/core/executor/src/sandbox.rs @@ -569,9 +569,11 @@ mod tests { use crate::allocator; use crate::sandbox::trap; use crate::wasm_executor::WasmExecutor; - use state_machine::TestExternalities; + use state_machine::TestExternalities as CoreTestExternalities; use wabt; + type TestExternalities = CoreTestExternalities; + #[test] fn sandbox_should_work() { let mut ext = TestExternalities::::default(); diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 988b6ddcf3..bed60666f7 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -414,7 +414,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, .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 => { + ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, result: *mut u8) -> u32 => { let mut parent_hash = H256::default(); if parent_hash_len != parent_hash.as_ref().len() as u32 { return Err(UserError("Invalid parent_hash_len in ext_storage_changes_root").into()); @@ -422,7 +422,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let raw_parent_hash = this.memory.get(parent_hash_data, parent_hash_len as usize) .map_err(|_| UserError("Invalid attempt to get parent_hash in ext_storage_changes_root"))?; parent_hash.as_mut().copy_from_slice(&raw_parent_hash[..]); - let r = this.ext.storage_changes_root(parent_hash, parent_number); + let r = this.ext.storage_changes_root(parent_hash) + .map_err(|_| UserError("Invaid parent_hash passed to ext_storage_changes_root"))?; if let Some(r) = r { this.memory.set(result, &r[..]).map_err(|_| UserError("Invalid attempt to set memory in ext_storage_changes_root"))?; Ok(1) @@ -896,10 +897,12 @@ mod tests { use parity_codec::Encode; - use state_machine::TestExternalities; + use state_machine::TestExternalities as CoreTestExternalities; use hex_literal::hex; use primitives::map; + type TestExternalities = CoreTestExternalities; + #[test] fn returning_should_work() { let mut ext = TestExternalities::default(); diff --git a/core/executor/wasm/Cargo.lock b/core/executor/wasm/Cargo.lock index b65d8e0869..8c53b790d8 100644 --- a/core/executor/wasm/Cargo.lock +++ b/core/executor/wasm/Cargo.lock @@ -8,6 +8,11 @@ dependencies = [ "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "autocfg" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byteorder" version = "1.3.1" @@ -52,6 +57,14 @@ name = "nodrop" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "num-traits" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parity-codec" version = "3.5.1" @@ -186,6 +199,7 @@ dependencies = [ "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)", + "num-traits 0.2.8 (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)", @@ -227,6 +241,7 @@ 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 autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" "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" @@ -234,6 +249,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "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" diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 8eb62ddf84..0875de55b7 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -25,7 +25,8 @@ sha2 = { version = "0.8", optional = true } substrate-bip39 = { git = "https://github.com/paritytech/substrate-bip39", optional = true } tiny-bip39 = { version = "0.6.1", optional = true } hex = { version = "0.3", optional = true } -regex = {version = "1.1", optional = true } +regex = { version = "1.1", optional = true } +num-traits = { version = "0.2", default-features = false } [dev-dependencies] substrate-serializer = { path = "../serializer" } @@ -71,4 +72,5 @@ std = [ "sha2", "schnorrkel", "regex", + "num-traits/std", ] diff --git a/core/primitives/src/changes_trie.rs b/core/primitives/src/changes_trie.rs index 2fa11f5641..eb6a75454f 100644 --- a/core/primitives/src/changes_trie.rs +++ b/core/primitives/src/changes_trie.rs @@ -19,6 +19,7 @@ #[cfg(any(feature = "std", test))] use serde::{Serialize, Deserialize}; use parity_codec::{Encode, Decode}; +use num_traits::Zero; /// Substrate changes trie configuration. #[cfg_attr(any(feature = "std", test), derive(Serialize, Deserialize))] @@ -26,10 +27,14 @@ use parity_codec::{Encode, Decode}; pub struct ChangesTrieConfiguration { /// Interval (in blocks) at which level1-digests are created. Digests are not /// created when this is less or equal to 1. - pub digest_interval: u64, + pub digest_interval: u32, /// Maximal number of digest levels in hierarchy. 0 means that digests are not /// created at all (even level1 digests). 1 means only level1-digests are created. /// 2 means that every digest_interval^2 there will be a level2-digest, and so on. + /// Please ensure that maximum digest interval (i.e. digest_interval^digest_levels) + /// is within `u32` limits. Otherwise you'll never see digests covering such intervals + /// && maximal digests interval will be truncated to the last interval that fits + /// `u32` limits. pub digest_levels: u32, } @@ -40,20 +45,30 @@ impl ChangesTrieConfiguration { } /// Do we need to build digest at given block? - pub fn is_digest_build_required_at_block(&self, block: u64) -> bool { - block != 0 + pub fn is_digest_build_required_at_block(&self, block: Number) -> bool + where + Number: From + PartialEq + ::rstd::ops::Rem + Zero, + { + block != 0.into() && self.is_digest_build_enabled() - && block % self.digest_interval == 0 + && (block % self.digest_interval.into()).is_zero() } /// Returns max digest interval. One if digests are not created at all. - /// Returns ::std::u64::MAX instead of panic in the case of overflow. - pub fn max_digest_interval(&self) -> u64 { + pub fn max_digest_interval(&self) -> u32 { if !self.is_digest_build_enabled() { return 1; } - self.digest_interval.saturating_pow(self.digest_levels) + // we'll get >1 loop iteration only when bad configuration parameters are selected + let mut current_level = self.digest_levels; + loop { + if let Some(max_digest_interval) = self.digest_interval.checked_pow(current_level) { + return max_digest_interval; + } + + current_level = current_level - 1; + } } /// Returns Some if digest must be built at given block number. @@ -63,17 +78,21 @@ impl ChangesTrieConfiguration { /// digest interval (in blocks) /// step between blocks we're interested in when digest is built /// ) - pub fn digest_level_at_block(&self, block: u64) -> Option<(u32, u64, u64)> { - if !self.is_digest_build_required_at_block(block) { + pub fn digest_level_at_block(&self, block: Number) -> Option<(u32, u32, u32)> + where + Number: Clone + From + PartialEq + ::rstd::ops::Rem + Zero, + { + if !self.is_digest_build_required_at_block(block.clone()) { return None; } let mut digest_interval = self.digest_interval; let mut current_level = 1u32; - let mut digest_step = 1u64; + let mut digest_step = 1u32; while current_level < self.digest_levels { let new_digest_interval = match digest_interval.checked_mul(self.digest_interval) { - Some(new_digest_interval) if block % new_digest_interval == 0 => new_digest_interval, + Some(new_digest_interval) if (block.clone() % new_digest_interval.into()).is_zero() + => new_digest_interval, _ => break, }; @@ -94,7 +113,7 @@ impl ChangesTrieConfiguration { mod tests { use super::ChangesTrieConfiguration; - fn config(interval: u64, levels: u32) -> ChangesTrieConfiguration { + fn config(interval: u32, levels: u32) -> ChangesTrieConfiguration { ChangesTrieConfiguration { digest_interval: interval, digest_levels: levels, @@ -112,31 +131,31 @@ mod tests { #[test] fn is_digest_build_required_at_block_works() { - assert!(!config(8, 4).is_digest_build_required_at_block(0)); - assert!(!config(8, 4).is_digest_build_required_at_block(1)); - assert!(!config(8, 4).is_digest_build_required_at_block(2)); - assert!(!config(8, 4).is_digest_build_required_at_block(4)); - assert!(config(8, 4).is_digest_build_required_at_block(8)); - assert!(!config(8, 4).is_digest_build_required_at_block(9)); - assert!(config(8, 4).is_digest_build_required_at_block(64)); - assert!(config(8, 4).is_digest_build_required_at_block(64)); - assert!(config(8, 4).is_digest_build_required_at_block(512)); - assert!(config(8, 4).is_digest_build_required_at_block(4096)); - assert!(!config(8, 4).is_digest_build_required_at_block(4103)); - assert!(config(8, 4).is_digest_build_required_at_block(4104)); - assert!(!config(8, 4).is_digest_build_required_at_block(4108)); + assert!(!config(8, 4).is_digest_build_required_at_block(0u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(1u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(2u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(4u64)); + assert!(config(8, 4).is_digest_build_required_at_block(8u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(9u64)); + assert!(config(8, 4).is_digest_build_required_at_block(64u64)); + assert!(config(8, 4).is_digest_build_required_at_block(64u64)); + assert!(config(8, 4).is_digest_build_required_at_block(512u64)); + assert!(config(8, 4).is_digest_build_required_at_block(4096u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(4103u64)); + assert!(config(8, 4).is_digest_build_required_at_block(4104u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(4108u64)); } #[test] fn digest_level_at_block_works() { - assert_eq!(config(8, 4).digest_level_at_block(0), None); - assert_eq!(config(8, 4).digest_level_at_block(7), None); - assert_eq!(config(8, 4).digest_level_at_block(63), None); - assert_eq!(config(8, 4).digest_level_at_block(8), Some((1, 8, 1))); - assert_eq!(config(8, 4).digest_level_at_block(64), Some((2, 64, 8))); - assert_eq!(config(8, 4).digest_level_at_block(512), Some((3, 512, 64))); - assert_eq!(config(8, 4).digest_level_at_block(4096), Some((4, 4096, 512))); - assert_eq!(config(8, 4).digest_level_at_block(4112), Some((1, 8, 1))); + assert_eq!(config(8, 4).digest_level_at_block(0u64), None); + assert_eq!(config(8, 4).digest_level_at_block(7u64), None); + assert_eq!(config(8, 4).digest_level_at_block(63u64), None); + assert_eq!(config(8, 4).digest_level_at_block(8u64), Some((1, 8, 1))); + assert_eq!(config(8, 4).digest_level_at_block(64u64), Some((2, 64, 8))); + assert_eq!(config(8, 4).digest_level_at_block(512u64), Some((3, 512, 64))); + assert_eq!(config(8, 4).digest_level_at_block(4096u64), Some((4, 4096, 512))); + assert_eq!(config(8, 4).digest_level_at_block(4112u64), Some((1, 8, 1))); } #[test] @@ -144,6 +163,6 @@ mod tests { assert_eq!(config(0, 0).max_digest_interval(), 1); assert_eq!(config(2, 2).max_digest_interval(), 4); assert_eq!(config(8, 4).max_digest_interval(), 4096); - assert_eq!(config(::std::u64::MAX, 1024).max_digest_interval(), ::std::u64::MAX); + assert_eq!(config(::std::u32::MAX, 1024).max_digest_interval(), ::std::u32::MAX); } } diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 47af4de98b..314aa3b61e 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -138,7 +138,7 @@ export_api! { 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]>; + fn storage_changes_root(parent_hash: [u8; 32]) -> 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)) @@ -251,6 +251,10 @@ mod imp { } #[cfg(feature = "std")] -pub use self::imp::{StorageOverlay, ChildrenStorageOverlay, with_storage, with_externalities, TestExternalities}; +pub use self::imp::{StorageOverlay, ChildrenStorageOverlay, with_storage, with_externalities}; #[cfg(not(feature = "std"))] pub use self::imp::ext::*; + +/// Type alias for Externalities implementation used in tests. +#[cfg(feature = "std")] +pub type TestExternalities = self::imp::TestExternalities; diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index d73ccf4b66..1bc0141c1d 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -158,10 +158,10 @@ impl StorageApi for () { }).expect("child_storage_root cannot be called outside of an Externalities-provided environment.") } - fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]> { + fn storage_changes_root(parent_hash: [u8; 32]) -> Option<[u8; 32]> { ext::with(|ext| - ext.storage_changes_root(parent_hash.into(), parent_num).map(Into::into) - ).unwrap_or(None) + ext.storage_changes_root(parent_hash.into()).map(|h| h.map(|h| h.into())) + ).unwrap_or(Ok(None)).expect("Invalid parent hash passed to storage_changes_root") } fn enumerated_trie_root(input: &[&[u8]]) -> H::Out diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 2f2b482f5e..de87aeddbd 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -242,7 +242,7 @@ pub mod ext { /// /// - `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; + fn ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, result: *mut u8) -> u32; /// A child storage function. /// @@ -498,10 +498,10 @@ impl StorageApi for () { } } - fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]> { + fn storage_changes_root(parent_hash: [u8; 32]) -> 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()) + ext_storage_changes_root.get()(parent_hash.as_ptr(), parent_hash.len() as u32, result.as_mut_ptr()) }; if is_set != 0 { diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 8906bbf074..dcfe8ffd24 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -435,7 +435,7 @@ pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stup fn storage_root() -> Self::Output; /// Acquire the global storage changes root. - fn storage_changes_root(parent_hash: Self::Output, parent_number: u64) -> Option; + fn storage_changes_root(parent_hash: Self::Output) -> Option; } /// Blake2-256 Hash implementation. @@ -468,8 +468,8 @@ impl Hash for BlakeTwo256 { fn storage_root() -> Self::Output { runtime_io::storage_root().into() } - fn storage_changes_root(parent_hash: Self::Output, parent_number: u64) -> Option { - runtime_io::storage_changes_root(parent_hash.into(), parent_number).map(Into::into) + fn storage_changes_root(parent_hash: Self::Output) -> Option { + runtime_io::storage_changes_root(parent_hash.into()).map(Into::into) } } diff --git a/core/state-machine/Cargo.toml b/core/state-machine/Cargo.toml index 405e62bacc..222c543f54 100644 --- a/core/state-machine/Cargo.toml +++ b/core/state-machine/Cargo.toml @@ -15,6 +15,7 @@ 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" +num-traits = "0.2" [dev-dependencies] hex-literal = "0.2.0" diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index 3021ddfd28..6cb3efd267 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -151,8 +151,8 @@ impl Externalities for BasicExternalities where H::Out: Ord { vec![42] } - fn storage_changes_root(&mut self, _parent: H::Out, _parent_num: u64) -> Option { - None + fn storage_changes_root(&mut self, _parent: H::Out) -> Result, ()> { + Ok(None) } fn submit_extrinsic(&mut self, _extrinsic: Vec) -> Result<(), ()> { diff --git a/core/state-machine/src/changes_trie/build.rs b/core/state-machine/src/changes_trie/build.rs index 9af058515a..487fde2e35 100644 --- a/core/state-machine/src/changes_trie/build.rs +++ b/core/state-machine/src/changes_trie/build.rs @@ -19,12 +19,13 @@ use std::collections::{BTreeMap, BTreeSet}; use parity_codec::Decode; use hash_db::Hasher; +use num_traits::One; use crate::backend::Backend; use crate::overlayed_changes::OverlayedChanges; -use crate::trie_backend_essence::{TrieBackendStorage, TrieBackendEssence}; +use crate::trie_backend_essence::TrieBackendEssence; use crate::changes_trie::build_iterator::digest_build_iterator; use crate::changes_trie::input::{InputKey, InputPair, DigestIndex, ExtrinsicIndex}; -use crate::changes_trie::{AnchorBlockId, Configuration, Storage}; +use crate::changes_trie::{AnchorBlockId, Configuration, Storage, BlockNumber}; /// Prepare input pairs for building a changes trie of given block. /// @@ -32,29 +33,25 @@ use crate::changes_trie::{AnchorBlockId, Configuration, Storage}; /// required data. /// Returns Ok(None) data required to prepare input pairs is not collected /// or storage is not provided. -pub fn prepare_input<'a, B, S, H>( +pub fn prepare_input<'a, B, S, H, Number>( backend: &B, - storage: Option<&'a S>, + storage: &'a S, + config: &'a Configuration, changes: &OverlayedChanges, - parent: &'a AnchorBlockId, -) -> Result>, String> + parent: &'a AnchorBlockId, +) -> Result>>, String> where B: Backend, - S: Storage, - &'a S: TrieBackendStorage, + S: Storage, H: Hasher, + Number: BlockNumber, { - let (storage, config) = match (storage, changes.changes_trie_config.as_ref()) { - (Some(storage), Some(config)) => (storage, config), - _ => return Ok(None), - }; - let mut input = Vec::new(); input.extend(prepare_extrinsics_input( backend, - parent.number + 1, + parent.number.clone() + 1.into(), changes)?); - input.extend(prepare_digest_input::<_, H>( + input.extend(prepare_digest_input::<_, H, Number>( parent, config, storage)?); @@ -63,14 +60,15 @@ pub fn prepare_input<'a, B, S, H>( } /// Prepare ExtrinsicIndex input pairs. -fn prepare_extrinsics_input( +fn prepare_extrinsics_input( backend: &B, - block: u64, + block: Number, changes: &OverlayedChanges, -) -> Result, String> +) -> Result>, String> where B: Backend, H: Hasher, + Number: BlockNumber, { let mut extrinsic_map = BTreeMap::, BTreeSet>::new(); for (key, val) in changes.prospective.top.iter().chain(changes.committed.top.iter()) { @@ -93,47 +91,50 @@ fn prepare_extrinsics_input( Ok(extrinsic_map.into_iter() .map(move |(key, extrinsics)| InputPair::ExtrinsicIndex(ExtrinsicIndex { - block, + block: block.clone(), key, }, extrinsics.iter().cloned().collect()))) } /// Prepare DigestIndex input pairs. -fn prepare_digest_input<'a, S, H>( - parent: &'a AnchorBlockId, +fn prepare_digest_input<'a, S, H, Number>( + parent: &'a AnchorBlockId, config: &Configuration, storage: &'a S -) -> Result + 'a, String> +) -> Result> + 'a, String> where - S: Storage, - &'a S: TrieBackendStorage, + S: Storage, H: Hasher, H::Out: 'a, + Number: BlockNumber, { - let mut digest_map = BTreeMap::, BTreeSet>::new(); - for digest_build_block in digest_build_iterator(config, parent.number + 1) { - let trie_root = storage.root(parent, digest_build_block)?; - let trie_root = trie_root.ok_or_else(|| format!("No changes trie root for block {}", digest_build_block))?; - let trie_storage = TrieBackendEssence::<_, H>::new(storage, trie_root); + let mut digest_map = BTreeMap::, BTreeSet>::new(); + for digest_build_block in digest_build_iterator(config, parent.number.clone() + One::one()) { + let trie_root = storage.root(parent, digest_build_block.clone())?; + let trie_root = trie_root.ok_or_else(|| format!("No changes trie root for block {}", digest_build_block.clone()))?; + let trie_storage = TrieBackendEssence::<_, H>::new( + crate::changes_trie::TrieBackendStorageAdapter(storage), + trie_root, + ); - let extrinsic_prefix = ExtrinsicIndex::key_neutral_prefix(digest_build_block); + let extrinsic_prefix = ExtrinsicIndex::key_neutral_prefix(digest_build_block.clone()); trie_storage.for_keys_with_prefix(&extrinsic_prefix, |key| - if let Some(InputKey::ExtrinsicIndex(trie_key)) = Decode::decode(&mut &key[..]) { + if let Some(InputKey::ExtrinsicIndex::(trie_key)) = Decode::decode(&mut &key[..]) { digest_map.entry(trie_key.key).or_default() - .insert(digest_build_block); + .insert(digest_build_block.clone()); }); - let digest_prefix = DigestIndex::key_neutral_prefix(digest_build_block); + let digest_prefix = DigestIndex::key_neutral_prefix(digest_build_block.clone()); trie_storage.for_keys_with_prefix(&digest_prefix, |key| - if let Some(InputKey::DigestIndex(trie_key)) = Decode::decode(&mut &key[..]) { + if let Some(InputKey::DigestIndex::(trie_key)) = Decode::decode(&mut &key[..]) { digest_map.entry(trie_key.key).or_default() - .insert(digest_build_block); + .insert(digest_build_block.clone()); }); } Ok(digest_map.into_iter() .map(move |(key, set)| InputPair::DigestIndex(DigestIndex { - block: parent.number + 1, + block: parent.number.clone() + One::one(), key }, set.into_iter().collect()))) } @@ -148,7 +149,7 @@ mod test { use crate::overlayed_changes::OverlayedValue; use super::*; - fn prepare_for_build() -> (InMemory, InMemoryStorage, OverlayedChanges) { + fn prepare_for_build() -> (InMemory, InMemoryStorage, OverlayedChanges) { let backend: InMemory<_> = vec![ (vec![100], vec![255]), (vec![101], vec![255]), @@ -225,7 +226,14 @@ mod test { #[test] fn build_changes_trie_nodes_on_non_digest_block() { let (backend, storage, changes) = prepare_for_build(); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 4 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 4 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 5, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 5, key: vec![101] }, vec![1]), @@ -236,7 +244,14 @@ mod test { #[test] fn build_changes_trie_nodes_on_digest_block_l1() { let (backend, storage, changes) = prepare_for_build(); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 3 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 3 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![101] }, vec![1]), @@ -252,7 +267,14 @@ mod test { #[test] fn build_changes_trie_nodes_on_digest_block_l2() { let (backend, storage, changes) = prepare_for_build(); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 15 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 15 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 16, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 16, key: vec![101] }, vec![1]), @@ -276,7 +298,14 @@ mod test { extrinsics: Some(vec![1].into_iter().collect()) }); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 3 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 3 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![101] }, vec![1]), diff --git a/core/state-machine/src/changes_trie/build_iterator.rs b/core/state-machine/src/changes_trie/build_iterator.rs index f9c6ba6e7b..5d8a8318ab 100644 --- a/core/state-machine/src/changes_trie/build_iterator.rs +++ b/core/state-machine/src/changes_trie/build_iterator.rs @@ -17,13 +17,16 @@ //! Structures and functions to return blocks whose changes are to be included //! in given block' changes trie. -use crate::changes_trie::Configuration; +use crate::changes_trie::{Configuration, BlockNumber}; /// Returns iterator of OTHER blocks that are required for inclusion into /// changes trie of given block. -pub fn digest_build_iterator(config: &Configuration, block: u64) -> DigestBuildIterator { +pub fn digest_build_iterator( + config: &Configuration, + block: Number, +) -> DigestBuildIterator { // prepare digest build parameters - let (_, _, digest_step) = match config.digest_level_at_block(block) { + let (_, _, digest_step) = match config.digest_level_at_block(block.clone()) { Some((current_level, digest_interval, digest_step)) => (current_level, digest_interval, digest_step), None => return DigestBuildIterator::empty(), @@ -35,24 +38,26 @@ pub fn digest_build_iterator(config: &Configuration, block: u64) -> DigestBuildI /// Changes trie build iterator that returns numbers of OTHER blocks that are /// required for inclusion into changes trie of given block. #[derive(Debug)] -pub struct DigestBuildIterator { +pub struct DigestBuildIterator { /// Block we're building changes trie for. - block: u64, + block: Number, /// Interval for creation digest blocks. - digest_interval: u64, + digest_interval: u32, + /// Max step of blocks range. + max_step: u32, /// Step of current blocks range. - current_step: u64, + current_step: u32, /// Current blocks range. - current_range: Option<::std::iter::StepBy<::std::ops::Range>>, - /// Max step of blocks range. - max_step: u64, + current_range: Option>, } -impl DigestBuildIterator { +impl DigestBuildIterator { /// Create new digest build iterator. - pub fn new(block: u64, digest_interval: u64, max_step: u64) -> Self { + pub fn new(block: Number, digest_interval: u32, max_step: u32) -> Self { DigestBuildIterator { - block, digest_interval, max_step, + block, + digest_interval, + max_step, current_step: 0, current_range: None, } @@ -60,12 +65,12 @@ impl DigestBuildIterator { /// Create empty digest build iterator. pub fn empty() -> Self { - Self::new(0, 0, 0) + Self::new(0.into(), 0, 0) } } -impl Iterator for DigestBuildIterator { - type Item = u64; +impl Iterator for DigestBuildIterator { + type Item = Number; fn next(&mut self) -> Option { if let Some(next) = self.current_range.as_mut().and_then(|iter| iter.next()) { @@ -82,10 +87,11 @@ impl Iterator for DigestBuildIterator { } self.current_step = next_step; - self.current_range = Some( - ((self.block - self.current_step * self.digest_interval + self.current_step)..self.block) - .step_by(self.current_step as usize) - ); + self.current_range = Some(BlocksRange::new( + self.block.clone() - (self.current_step * self.digest_interval - self.current_step).into(), + self.block.clone(), + self.current_step.into(), + )); Some(self.current_range.as_mut() .expect("assigned one line above; qed") @@ -94,20 +100,52 @@ impl Iterator for DigestBuildIterator { } } +/// Blocks range iterator with builtin step_by support. +#[derive(Debug)] +struct BlocksRange { + current: Number, + end: Number, + step: Number, +} + +impl BlocksRange { + pub fn new(begin: Number, end: Number, step: Number) -> Self { + BlocksRange { + current: begin, + end, + step, + } + } +} + +impl Iterator for BlocksRange { + type Item = Number; + + fn next(&mut self) -> Option { + if self.current >= self.end { + return None; + } + + let current = Some(self.current.clone()); + self.current += self.step.clone(); + current + } +} + #[cfg(test)] mod tests { use super::*; - fn digest_build_iterator(digest_interval: u64, digest_levels: u32, block: u64) -> DigestBuildIterator { + fn digest_build_iterator(digest_interval: u32, digest_levels: u32, block: u64) -> DigestBuildIterator { super::digest_build_iterator(&Configuration { digest_interval, digest_levels }, block) } - fn digest_build_iterator_basic(digest_interval: u64, digest_levels: u32, block: u64) -> (u64, u64, u64) { + fn digest_build_iterator_basic(digest_interval: u32, digest_levels: u32, block: u64) -> (u64, u32, u32) { let iter = digest_build_iterator(digest_interval, digest_levels, block); (iter.block, iter.digest_interval, iter.max_step) } - fn digest_build_iterator_blocks(digest_interval: u64, digest_levels: u32, block: u64) -> Vec { + fn digest_build_iterator_blocks(digest_interval: u32, digest_levels: u32, block: u64) -> Vec { digest_build_iterator(digest_interval, digest_levels, block).collect() } @@ -122,7 +160,11 @@ mod tests { assert_eq!(digest_build_iterator_basic(4, 16, 2), empty, "digest is not required for this block"); assert_eq!(digest_build_iterator_basic(4, 16, 15), empty, "digest is not required for this block"); assert_eq!(digest_build_iterator_basic(4, 16, 17), empty, "digest is not required for this block"); - assert_eq!(digest_build_iterator_basic(::std::u64::MAX / 2 + 1, 16, ::std::u64::MAX), empty, "digest_interval * 2 is greater than u64::MAX"); + assert_eq!(digest_build_iterator_basic( + ::std::u32::MAX / 2 + 1, + 16, + ::std::u64::MAX, + ), empty, "digest_interval * 2 is greater than u64::MAX"); } #[test] diff --git a/core/state-machine/src/changes_trie/changes_iterator.rs b/core/state-machine/src/changes_trie/changes_iterator.rs index c8d6216926..0e4716ccab 100644 --- a/core/state-machine/src/changes_trie/changes_iterator.rs +++ b/core/state-machine/src/changes_trie/changes_iterator.rs @@ -21,8 +21,9 @@ use std::cell::RefCell; use std::collections::VecDeque; use parity_codec::{Decode, Encode}; use hash_db::{HashDB, Hasher}; +use num_traits::One; use trie::{Recorder, MemoryDB}; -use crate::changes_trie::{AnchorBlockId, Configuration, RootsStorage, Storage}; +use crate::changes_trie::{AnchorBlockId, Configuration, RootsStorage, Storage, BlockNumber}; use crate::changes_trie::input::{DigestIndex, ExtrinsicIndex, DigestIndexValue, ExtrinsicIndexValue}; use crate::changes_trie::storage::{TrieBackendAdapter, InMemoryStorage}; use crate::proving_backend::ProvingBackendEssence; @@ -31,25 +32,25 @@ use crate::trie_backend_essence::{TrieBackendEssence}; /// Return changes of given key at given blocks range. /// `max` is the number of best known block. /// Changes are returned in descending order (i.e. last block comes first). -pub fn key_changes<'a, S: Storage, H: Hasher>( +pub fn key_changes<'a, S: Storage, H: Hasher, Number: BlockNumber>( config: &'a Configuration, storage: &'a S, - begin: u64, - end: &'a AnchorBlockId, - max: u64, + begin: Number, + end: &'a AnchorBlockId, + max: Number, key: &'a [u8], -) -> Result, String> { +) -> Result, String> { // we can't query any roots before root - let max = ::std::cmp::min(max, end.number); + let max = ::std::cmp::min(max.clone(), end.number.clone()); Ok(DrilldownIterator { essence: DrilldownIteratorEssence { key, roots_storage: storage, storage, - begin, + begin: begin.clone(), end, - surface: surface_iterator(config, max, begin, end.number)?, + surface: surface_iterator(config, max, begin, end.number.clone())?, extrinsics: Default::default(), blocks: Default::default(), @@ -61,25 +62,25 @@ pub fn key_changes<'a, S: Storage, H: Hasher>( /// Returns proof of changes of given key at given blocks range. /// `max` is the number of best known block. -pub fn key_changes_proof, H: Hasher>( +pub fn key_changes_proof, H: Hasher, Number: BlockNumber>( config: &Configuration, storage: &S, - begin: u64, - end: &AnchorBlockId, - max: u64, + begin: Number, + end: &AnchorBlockId, + max: Number, key: &[u8], ) -> Result>, String> { // we can't query any roots before root - let max = ::std::cmp::min(max, end.number); + let max = ::std::cmp::min(max.clone(), end.number.clone()); let mut iter = ProvingDrilldownIterator { essence: DrilldownIteratorEssence { key, roots_storage: storage.clone(), storage, - begin, + begin: begin.clone(), end, - surface: surface_iterator(config, max, begin, end.number)?, + surface: surface_iterator(config, max, begin, end.number.clone())?, extrinsics: Default::default(), blocks: Default::default(), @@ -100,17 +101,17 @@ pub fn key_changes_proof, H: Hasher>( /// Check key changes proog and return changes of the key at given blocks range. /// `max` is the number of best known block. /// Changes are returned in descending order (i.e. last block comes first). -pub fn key_changes_proof_check, H: Hasher>( +pub fn key_changes_proof_check, H: Hasher, Number: BlockNumber>( config: &Configuration, roots_storage: &S, proof: Vec>, - begin: u64, - end: &AnchorBlockId, - max: u64, + begin: Number, + end: &AnchorBlockId, + max: Number, key: &[u8] -) -> Result, String> { +) -> Result, String> { // we can't query any roots before root - let max = ::std::cmp::min(max, end.number); + let max = ::std::cmp::min(max.clone(), end.number.clone()); let mut proof_db = MemoryDB::::default(); for item in proof { @@ -123,9 +124,9 @@ pub fn key_changes_proof_check, H: Hasher>( key, roots_storage, storage: &proof_db, - begin, + begin: begin.clone(), end, - surface: surface_iterator(config, max, begin, end.number)?, + surface: surface_iterator(config, max, begin, end.number.clone())?, extrinsics: Default::default(), blocks: Default::default(), @@ -137,36 +138,36 @@ pub fn key_changes_proof_check, H: Hasher>( /// Surface iterator - only traverses top-level digests from given range and tries to find /// all digest changes for the key. -pub struct SurfaceIterator<'a> { +pub struct SurfaceIterator<'a, Number: BlockNumber> { config: &'a Configuration, - begin: u64, - max: u64, - current: Option, - current_begin: u64, - digest_step: u64, + begin: Number, + max: Number, + current: Option, + current_begin: Number, + digest_step: u32, digest_level: u32, } -impl<'a> Iterator for SurfaceIterator<'a> { - type Item = Result<(u64, u32), String>; +impl<'a, Number: BlockNumber> Iterator for SurfaceIterator<'a, Number> { + type Item = Result<(Number, u32), String>; fn next(&mut self) -> Option { - let current = self.current?; + let current = self.current.clone()?; let digest_level = self.digest_level; - if current < self.digest_step { + if current < self.digest_step.into() { self.current = None; } else { - let next = current - self.digest_step; - if next == 0 || next < self.begin { + let next = current.clone() - self.digest_step.into(); + if next.is_zero() || next < self.begin { self.current = None; } else if next > self.current_begin { self.current = Some(next); } else { let (current, current_begin, digest_step, digest_level) = match - lower_bound_max_digest(self.config, self.max, self.begin, next) { + lower_bound_max_digest(self.config, self.max.clone(), self.begin.clone(), next) { Err(err) => return Some(Err(err)), Ok(range) => range, }; @@ -184,22 +185,36 @@ impl<'a> Iterator for SurfaceIterator<'a> { /// Drilldown iterator - receives 'digest points' from surface iterator and explores /// every point until extrinsic is found. -pub struct DrilldownIteratorEssence<'a, RS: 'a + RootsStorage, S: 'a + Storage, H: Hasher> where H::Out: 'a { +pub struct DrilldownIteratorEssence<'a, RS, S, H, Number> + where + RS: 'a + RootsStorage, + S: 'a + Storage, + H: Hasher, + Number: BlockNumber, + H::Out: 'a, +{ key: &'a [u8], roots_storage: &'a RS, storage: &'a S, - begin: u64, - end: &'a AnchorBlockId, - surface: SurfaceIterator<'a>, + begin: Number, + end: &'a AnchorBlockId, + surface: SurfaceIterator<'a, Number>, - extrinsics: VecDeque<(u64, u32)>, - blocks: VecDeque<(u64, u32)>, + extrinsics: VecDeque<(Number, u32)>, + blocks: VecDeque<(Number, u32)>, _hasher: ::std::marker::PhantomData, } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEssence<'a, RS, S, H> { - pub fn next(&mut self, trie_reader: F) -> Option> +impl<'a, RS, S, H, Number> DrilldownIteratorEssence<'a, RS, S, H, Number> + where + RS: 'a + RootsStorage, + S: 'a + Storage, + H: Hasher, + Number: BlockNumber, + H::Out: 'a, +{ + pub fn next(&mut self, trie_reader: F) -> Option> where F: FnMut(&S, H::Out, &[u8]) -> Result>, String>, { @@ -210,7 +225,7 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEs } } - fn do_next(&mut self, mut trie_reader: F) -> Result, String> + fn do_next(&mut self, mut trie_reader: F) -> Result, String> where F: FnMut(&S, H::Out, &[u8]) -> Result>, String>, { @@ -223,33 +238,33 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEs // not having a changes trie root is an error because: // we never query roots for future blocks // AND trie roots for old blocks are known (both on full + light node) - let trie_root = self.roots_storage.root(&self.end, block)? - .ok_or_else(|| format!("Changes trie root for block {} is not found", block))?; + let trie_root = self.roots_storage.root(&self.end, block.clone())? + .ok_or_else(|| format!("Changes trie root for block {} is not found", block.clone()))?; // only return extrinsics for blocks before self.max // 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 { - let extrinsics_key = ExtrinsicIndex { block, key: self.key.to_vec() }.encode(); + let extrinsics_key = ExtrinsicIndex { block: block.clone(), key: self.key.to_vec() }.encode(); let extrinsics = trie_reader(&self.storage, trie_root, &extrinsics_key); if let Some(extrinsics) = extrinsics? { let extrinsics: Option = Decode::decode(&mut &extrinsics[..]); if let Some(extrinsics) = extrinsics { - self.extrinsics.extend(extrinsics.into_iter().rev().map(|e| (block, e))); + self.extrinsics.extend(extrinsics.into_iter().rev().map(|e| (block.clone(), e))); } } } - let blocks_key = DigestIndex { block, key: self.key.to_vec() }.encode(); + let blocks_key = DigestIndex { block: block.clone(), key: self.key.to_vec() }.encode(); let blocks = trie_reader(&self.storage, trie_root, &blocks_key); if let Some(blocks) = blocks? { - let blocks: Option = Decode::decode(&mut &blocks[..]); + let blocks: Option> = Decode::decode(&mut &blocks[..]); if let Some(blocks) = blocks { // filter level0 blocks here because we tend to use digest blocks, // AND digest block changes could also include changes for out-of-range blocks - let begin = self.begin; - let end = self.end.number; + let begin = self.begin.clone(); + let end = self.end.number.clone(); self.blocks.extend(blocks.into_iter() .rev() .filter(|b| level > 1 || (*b >= begin && *b <= end)) @@ -271,14 +286,21 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEs } /// Exploring drilldown operator. -pub struct DrilldownIterator<'a, RS: 'a + RootsStorage, S: 'a + Storage, H: Hasher> where H::Out: 'a { - essence: DrilldownIteratorEssence<'a, RS, S, H>, +pub struct DrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ + essence: DrilldownIteratorEssence<'a, RS, S, H, Number>, } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator - for DrilldownIterator<'a, RS, S, H> +impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher, Number: BlockNumber> Iterator + for DrilldownIterator<'a, RS, S, H, Number> { - type Item = Result<(u64, u32), String>; + type Item = Result<(Number, u32), String>; fn next(&mut self) -> Option { self.essence.next(|storage, root, key| @@ -287,12 +309,26 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator } /// Proving drilldown iterator. -struct ProvingDrilldownIterator<'a, RS: 'a + RootsStorage, S: 'a + Storage, H: Hasher> where H::Out: 'a { - essence: DrilldownIteratorEssence<'a, RS, S, H>, +struct ProvingDrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ + essence: DrilldownIteratorEssence<'a, RS, S, H, Number>, proof_recorder: RefCell>, } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> ProvingDrilldownIterator<'a, RS, S, H> { +impl<'a, RS, S, H, Number> ProvingDrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ /// Consume the iterator, extracting the gathered proof in lexicographical order /// by value. pub fn extract_proof(self) -> Vec> { @@ -303,8 +339,15 @@ 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> { - type Item = Result<(u64, u32), String>; +impl<'a, RS, S, H, Number> Iterator for ProvingDrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ + type Item = Result<(Number, u32), String>; fn next(&mut self) -> Option { let proof_recorder = &mut *self.proof_recorder.try_borrow_mut() @@ -318,8 +361,18 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator for Provin } /// Returns surface iterator for given range of blocks. -fn surface_iterator<'a>(config: &'a Configuration, max: u64, begin: u64, end: u64) -> Result, String> { - let (current, current_begin, digest_step, digest_level) = lower_bound_max_digest(config, max, begin, end)?; +fn surface_iterator<'a, Number: BlockNumber>( + config: &'a Configuration, + max: Number, + begin: Number, + end: Number, +) -> Result, String> { + let (current, current_begin, digest_step, digest_level) = lower_bound_max_digest( + config, + max.clone(), + begin.clone(), + end, + )?; Ok(SurfaceIterator { config, begin, @@ -333,31 +386,32 @@ fn surface_iterator<'a>(config: &'a Configuration, max: u64, begin: u64, end: u6 /// Returns parameters of highest level digest block that includes the end of given range /// and tends to include the whole range. -fn lower_bound_max_digest( +fn lower_bound_max_digest( config: &Configuration, - max: u64, - begin: u64, - end: u64, -) -> Result<(u64, u64, u64, u32), String> { + max: Number, + begin: Number, + end: Number, +) -> Result<(Number, Number, u32, u32), String> { if end > max || begin > end { return Err("invalid changes range".into()); } let mut digest_level = 0u32; - let mut digest_step = 1u64; - let mut digest_interval = 0u64; - let mut current = end; - let mut current_begin = begin; - if begin != end { + let mut digest_step = 1u32; + let mut digest_interval = 0u32; + let mut current = end.clone(); + let mut current_begin = begin.clone(); + if current_begin != current { while digest_level != config.digest_levels { let new_digest_level = digest_level + 1; let new_digest_step = digest_step * config.digest_interval; let new_digest_interval = config.digest_interval * { if digest_interval == 0 { 1 } else { digest_interval } }; - let new_digest_begin = ((current - 1) / new_digest_interval) * new_digest_interval; - let new_digest_end = new_digest_begin + new_digest_interval; - let new_current = new_digest_begin + new_digest_interval; + let new_digest_begin = ((current.clone() - One::one()) + / new_digest_interval.into()) * new_digest_interval.into(); + let new_digest_end = new_digest_begin.clone() + new_digest_interval.into(); + let new_current = new_digest_begin.clone() + new_digest_interval.into(); if new_digest_end > max { if begin < new_digest_begin { @@ -372,7 +426,7 @@ fn lower_bound_max_digest( current = new_current; current_begin = new_digest_begin; - if new_digest_begin <= begin && new_digest_end >= end { + if current_begin <= begin && new_digest_end >= end { break; } } @@ -394,7 +448,7 @@ mod tests { use crate::changes_trie::storage::InMemoryStorage; use super::*; - fn prepare_for_drilldown() -> (Configuration, InMemoryStorage) { + fn prepare_for_drilldown() -> (Configuration, InMemoryStorage) { let config = Configuration { digest_interval: 4, digest_levels: 2 }; let backend = InMemoryStorage::with_inputs(vec![ // digest: 1..4 => [(3, 0)] @@ -436,27 +490,27 @@ mod tests { #[test] fn drilldown_iterator_works() { let (config, storage) = prepare_for_drilldown(); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 16 }, 16, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(8, 2), (8, 1), (6, 3), (3, 0)])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 2 }, 4, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 3 }, 4, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(3, 0)])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 7, &AnchorBlockId { hash: Default::default(), number: 8 }, 8, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(8, 2), (8, 1)])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 5, &AnchorBlockId { hash: Default::default(), number: 7 }, 8, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(6, 3)])); @@ -467,7 +521,7 @@ mod tests { let (config, storage) = prepare_for_drilldown(); storage.clear_storage(); - assert!(key_changes::, Blake2Hasher>( + assert!(key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 100 }, 1000, &[42]) .and_then(|i| i.collect::, _>>()).is_err()); } @@ -475,9 +529,9 @@ mod tests { #[test] fn drilldown_iterator_fails_when_range_is_invalid() { let (config, storage) = prepare_for_drilldown(); - assert!(key_changes::, Blake2Hasher>( + assert!(key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 100 }, 50, &[42]).is_err()); - assert!(key_changes::, Blake2Hasher>( + assert!(key_changes::, Blake2Hasher, u64>( &config, &storage, 20, &AnchorBlockId { hash: Default::default(), number: 10 }, 100, &[42]).is_err()); } @@ -488,7 +542,7 @@ mod tests { // create drilldown iterator that records all trie nodes during drilldown let (remote_config, remote_storage) = prepare_for_drilldown(); - let remote_proof = key_changes_proof::, Blake2Hasher>( + let remote_proof = key_changes_proof::, Blake2Hasher, u64>( &remote_config, &remote_storage, 0, &AnchorBlockId { hash: Default::default(), number: 16 }, 16, &[42]).unwrap(); @@ -497,7 +551,7 @@ mod tests { // create drilldown iterator that works the same, but only depends on trie let (local_config, local_storage) = prepare_for_drilldown(); local_storage.clear_storage(); - let local_result = key_changes_proof_check::, Blake2Hasher>( + let local_result = key_changes_proof_check::, Blake2Hasher, u64>( &local_config, &local_storage, remote_proof, 0, &AnchorBlockId { hash: Default::default(), number: 16 }, 16, &[42]); diff --git a/core/state-machine/src/changes_trie/input.rs b/core/state-machine/src/changes_trie/input.rs index 3154aff715..ae939c028b 100644 --- a/core/state-machine/src/changes_trie/input.rs +++ b/core/state-machine/src/changes_trie/input.rs @@ -17,12 +17,13 @@ //! Different types of changes trie input pairs. use parity_codec::{Decode, Encode, Input, Output}; +use crate::changes_trie::BlockNumber; /// Key of { changed key => set of extrinsic indices } mapping. #[derive(Clone, Debug, PartialEq, Eq)] -pub struct ExtrinsicIndex { +pub struct ExtrinsicIndex { /// Block at which this key has been inserted in the trie. - pub block: u64, + pub block: Number, /// Storage key this node is responsible for. pub key: Vec, } @@ -32,35 +33,35 @@ pub type ExtrinsicIndexValue = Vec; /// Key of { changed key => block/digest block numbers } mapping. #[derive(Clone, Debug, PartialEq, Eq)] -pub struct DigestIndex { +pub struct DigestIndex { /// Block at which this key has been inserted in the trie. - pub block: u64, + pub block: Number, /// Storage key this node is responsible for. pub key: Vec, } /// Value of { changed key => block/digest block numbers } mapping. -pub type DigestIndexValue = Vec; +pub type DigestIndexValue = Vec; /// Single input pair of changes trie. #[derive(Clone, Debug, PartialEq, Eq)] -pub enum InputPair { +pub enum InputPair { /// Element of { key => set of extrinsics where key has been changed } element mapping. - ExtrinsicIndex(ExtrinsicIndex, ExtrinsicIndexValue), + ExtrinsicIndex(ExtrinsicIndex, ExtrinsicIndexValue), /// Element of { key => set of blocks/digest blocks where key has been changed } element mapping. - DigestIndex(DigestIndex, DigestIndexValue), + DigestIndex(DigestIndex, DigestIndexValue), } /// Single input key of changes trie. #[derive(Clone, Debug, PartialEq, Eq)] -pub enum InputKey { +pub enum InputKey { /// Key of { key => set of extrinsics where key has been changed } element mapping. - ExtrinsicIndex(ExtrinsicIndex), + ExtrinsicIndex(ExtrinsicIndex), /// Key of { key => set of blocks/digest blocks where key has been changed } element mapping. - DigestIndex(DigestIndex), + DigestIndex(DigestIndex), } -impl Into<(Vec, Vec)> for InputPair { +impl Into<(Vec, Vec)> for InputPair { fn into(self) -> (Vec, Vec) { match self { InputPair::ExtrinsicIndex(key, value) => (key.encode(), value.encode()), @@ -69,8 +70,8 @@ impl Into<(Vec, Vec)> for InputPair { } } -impl Into for InputPair { - fn into(self) -> InputKey { +impl Into> for InputPair { + fn into(self) -> InputKey { match self { InputPair::ExtrinsicIndex(key, _) => InputKey::ExtrinsicIndex(key), InputPair::DigestIndex(key, _) => InputKey::DigestIndex(key), @@ -78,15 +79,15 @@ impl Into for InputPair { } } -impl ExtrinsicIndex { - pub fn key_neutral_prefix(block: u64) -> Vec { +impl ExtrinsicIndex { + pub fn key_neutral_prefix(block: Number) -> Vec { let mut prefix = vec![1]; prefix.extend(block.encode()); prefix } } -impl Encode for ExtrinsicIndex { +impl Encode for ExtrinsicIndex { fn encode_to(&self, dest: &mut W) { dest.push_byte(1); self.block.encode_to(dest); @@ -94,8 +95,8 @@ impl Encode for ExtrinsicIndex { } } -impl DigestIndex { - pub fn key_neutral_prefix(block: u64) -> Vec { +impl DigestIndex { + pub fn key_neutral_prefix(block: Number) -> Vec { let mut prefix = vec![2]; prefix.extend(block.encode()); prefix @@ -103,7 +104,7 @@ impl DigestIndex { } -impl Encode for DigestIndex { +impl Encode for DigestIndex { fn encode_to(&self, dest: &mut W) { dest.push_byte(2); self.block.encode_to(dest); @@ -111,7 +112,7 @@ impl Encode for DigestIndex { } } -impl Decode for InputKey { +impl Decode for InputKey { fn decode(input: &mut I) -> Option { match input.read_byte()? { 1 => Some(InputKey::ExtrinsicIndex(ExtrinsicIndex { @@ -133,17 +134,17 @@ mod tests { #[test] fn extrinsic_index_serialized_and_deserialized() { - let original = ExtrinsicIndex { block: 777, key: vec![42] }; + let original = ExtrinsicIndex { block: 777u64, key: vec![42] }; let serialized = original.encode(); - let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); + let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); assert_eq!(InputKey::ExtrinsicIndex(original), deserialized); } #[test] fn digest_index_serialized_and_deserialized() { - let original = DigestIndex { block: 777, key: vec![42] }; + let original = DigestIndex { block: 777u64, key: vec![42] }; let serialized = original.encode(); - let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); + let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); assert_eq!(InputKey::DigestIndex(original), deserialized); } } diff --git a/core/state-machine/src/changes_trie/mod.rs b/core/state-machine/src/changes_trie/mod.rs index f82d8b33df..15ea1b474f 100644 --- a/core/state-machine/src/changes_trie/mod.rs +++ b/core/state-machine/src/changes_trie/mod.rs @@ -48,58 +48,116 @@ pub use self::prune::{prune, oldest_non_pruned_trie}; use hash_db::Hasher; use crate::backend::Backend; +use num_traits::{One, Zero}; +use parity_codec::{Decode, Encode}; use primitives; use crate::changes_trie::build::prepare_input; use crate::overlayed_changes::OverlayedChanges; -use crate::trie_backend_essence::TrieBackendStorage; use trie::{DBValue, trie_root}; /// Changes that are made outside of extrinsics are marked with this index; pub const NO_EXTRINSIC_INDEX: u32 = 0xffffffff; +/// Requirements for block number that can be used with changes tries. +pub trait BlockNumber: + Send + Sync + 'static + + ::std::fmt::Display + + Clone + + From + One + Zero + + PartialEq + Ord + + ::std::ops::Add + ::std::ops::Sub + + ::std::ops::Mul + ::std::ops::Div + + ::std::ops::Rem + + ::std::ops::AddAssign + + num_traits::CheckedMul + num_traits::CheckedSub + + Decode + Encode +{} + +impl BlockNumber for T where T: + Send + Sync + 'static + + ::std::fmt::Display + + Clone + + From + One + Zero + + PartialEq + Ord + + ::std::ops::Add + ::std::ops::Sub + + ::std::ops::Mul + ::std::ops::Div + + ::std::ops::Rem + + ::std::ops::AddAssign + + num_traits::CheckedMul + num_traits::CheckedSub + + Decode + Encode, +{} + /// Block identifier that could be used to determine fork of this block. #[derive(Debug)] -pub struct AnchorBlockId { +pub struct AnchorBlockId { /// Hash of this block. pub hash: Hash, /// Number of this block. - pub number: u64, + pub number: Number, } /// Changes trie storage. Provides access to trie roots and trie nodes. -pub trait RootsStorage: Send + Sync { +pub trait RootsStorage: Send + Sync { + /// Resolve hash of the block into anchor. + fn build_anchor(&self, hash: H::Out) -> Result, String>; /// Get changes trie root for the block with given number which is an ancestor (or the block /// itself) of the anchor_block (i.e. anchor_block.number >= block). - fn root(&self, anchor: &AnchorBlockId, block: u64) -> Result, String>; + fn root(&self, anchor: &AnchorBlockId, block: Number) -> Result, String>; } /// Changes trie storage. Provides access to trie roots and trie nodes. -pub trait Storage: RootsStorage { +pub trait Storage: RootsStorage { /// Get a trie node. fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; } +/// Changes trie storage -> trie backend essence adapter. +pub struct TrieBackendStorageAdapter<'a, H: Hasher, Number: BlockNumber>(pub &'a Storage); + +impl<'a, H: Hasher, N: BlockNumber> crate::TrieBackendStorage for TrieBackendStorageAdapter<'a, H, N> { + type Overlay = trie::MemoryDB; + + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + self.0.get(key, prefix) + } +} + /// Changes trie configuration. pub type Configuration = primitives::ChangesTrieConfiguration; /// Compute the changes trie root and transaction for given block. -/// Returns None if there's no data to perform computation. -pub fn compute_changes_trie_root<'a, B: Backend, S: Storage, H: Hasher>( +/// Returns Err(()) if unknown `parent_hash` has been passed. +/// Returns Ok(None) if there's no data to perform computation. +/// Panics if background storage returns an error. +pub fn compute_changes_trie_root<'a, B: Backend, S: Storage, H: Hasher, Number: BlockNumber>( backend: &B, storage: Option<&'a S>, changes: &OverlayedChanges, - parent: &'a AnchorBlockId, -) -> Option<(H::Out, Vec<(Vec, Vec)>)> + parent_hash: H::Out, +) -> Result, Vec)>)>, ()> where - &'a S: TrieBackendStorage, - H::Out: Ord, + H::Out: Ord + 'static, { - let input_pairs = prepare_input::(backend, storage, changes, parent) - .expect("storage is not allowed to fail within runtime")?; - let transaction = input_pairs.into_iter() - .map(Into::into) - .collect::>(); - let root = trie_root::(transaction.iter().map(|(k, v)| (&*k, &*v))); - - Some((root, transaction)) + let (storage, config) = match (storage, changes.changes_trie_config.as_ref()) { + (Some(storage), Some(config)) => (storage, config), + _ => return Ok(None), + }; + + // build_anchor error should not be considered fatal + let parent = storage.build_anchor(parent_hash).map_err(|_| ())?; + + // storage errors are considered fatal (similar to situations when runtime fetches values from storage) + let input_pairs = prepare_input::(backend, storage, config, changes, &parent) + .expect("storage is not allowed to fail within runtime"); + match input_pairs { + Some(input_pairs) => { + let transaction = input_pairs.into_iter() + .map(Into::into) + .collect::>(); + let root = trie_root::(transaction.iter().map(|(k, v)| (&*k, &*v))); + + Ok(Some((root, transaction))) + }, + None => Ok(None), + } } diff --git a/core/state-machine/src/changes_trie/prune.rs b/core/state-machine/src/changes_trie/prune.rs index 09e53315a5..3aedf66f75 100644 --- a/core/state-machine/src/changes_trie/prune.rs +++ b/core/state-machine/src/changes_trie/prune.rs @@ -19,24 +19,26 @@ use hash_db::Hasher; use trie::Recorder; use log::warn; +use num_traits::One; use crate::proving_backend::ProvingBackendEssence; use crate::trie_backend_essence::TrieBackendEssence; -use crate::changes_trie::{AnchorBlockId, Configuration, Storage}; +use crate::changes_trie::{AnchorBlockId, Configuration, Storage, BlockNumber}; use crate::changes_trie::storage::TrieBackendAdapter; /// Get number of oldest block for which changes trie is not pruned /// given changes trie configuration, pruning parameter and number of /// best finalized block. -pub fn oldest_non_pruned_trie( +pub fn oldest_non_pruned_trie( config: &Configuration, - min_blocks_to_keep: u64, - best_finalized_block: u64, -) -> u64 { + min_blocks_to_keep: Number, + best_finalized_block: Number, +) -> Number { let max_digest_interval = config.max_digest_interval(); - let max_digest_block = best_finalized_block - best_finalized_block % max_digest_interval; + let best_finalized_block_rem = best_finalized_block.clone() % max_digest_interval.into(); + let max_digest_block = best_finalized_block - best_finalized_block_rem; match pruning_range(config, min_blocks_to_keep, max_digest_block) { - Some((_, last_pruned_block)) => last_pruned_block + 1, - None => 1, + Some((_, last_pruned_block)) => last_pruned_block + One::one(), + None => One::one(), } } @@ -45,23 +47,32 @@ pub fn oldest_non_pruned_trie( /// `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)>( +pub fn prune, H: Hasher, Number: BlockNumber, F: FnMut(H::Out)>( config: &Configuration, storage: &S, - min_blocks_to_keep: u64, - current_block: &AnchorBlockId, + min_blocks_to_keep: Number, + current_block: &AnchorBlockId, mut remove_trie_node: F, ) { // select range for pruning - let (first, last) = match pruning_range(config, min_blocks_to_keep, current_block.number) { + let (first, last) = match pruning_range(config, min_blocks_to_keep, current_block.number.clone()) { Some((first, last)) => (first, last), None => return, }; // delete changes trie for every block in range // FIXME: limit `max_digest_interval` so that this cycle won't involve huge ranges - for block in first..last+1 { - let root = match storage.root(current_block, block) { + let mut block = first; + loop { + if block >= last.clone() + One::one() { + break; + } + + let prev_block = block.clone(); + block += One::one(); + + let block = prev_block; + let root = match storage.root(current_block, block.clone()) { Ok(Some(root)) => root, Ok(None) => continue, Err(error) => { @@ -91,11 +102,15 @@ pub fn prune, H: Hasher, F: FnMut(H::Out)>( } /// Select blocks range (inclusive from both ends) for pruning changes tries in. -fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> Option<(u64, u64)> { +fn pruning_range( + config: &Configuration, + min_blocks_to_keep: Number, + block: Number, +) -> Option<(Number, Number)> { // compute number of changes tries we actually want to keep let (prune_interval, blocks_to_keep) = if config.is_digest_build_enabled() { // we only CAN prune at block where max-level-digest is created - let max_digest_interval = match config.digest_level_at_block(block) { + let max_digest_interval = match config.digest_level_at_block(block.clone()) { Some((digest_level, digest_interval, _)) if digest_level == config.digest_levels => digest_interval, _ => return None, @@ -107,7 +122,7 @@ fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> // number of blocks BEFORE current block where changes tries are not pruned ( max_digest_interval, - max_digest_intervals_to_keep.checked_mul(max_digest_interval) + max_digest_intervals_to_keep.checked_mul(&max_digest_interval.into()) ) } else { ( @@ -117,11 +132,11 @@ fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> }; // last block for which changes trie is pruned - let last_block_to_prune = blocks_to_keep.and_then(|b| block.checked_sub(b)); - let first_block_to_prune = last_block_to_prune.clone().and_then(|b| b.checked_sub(prune_interval)); + let last_block_to_prune = blocks_to_keep.and_then(|b| block.checked_sub(&b)); + let first_block_to_prune = last_block_to_prune.clone().and_then(|b| b.checked_sub(&prune_interval.into())); last_block_to_prune - .and_then(|last| first_block_to_prune.map(|first| (first + 1, last))) + .and_then(|last| first_block_to_prune.map(|first| (first + One::one(), last))) } /// Select pruning delay for the changes tries. To make sure we could build a changes @@ -132,13 +147,16 @@ fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> /// 0 or 1: means that only last changes trie is guaranteed to exists; /// 2: the last chnages trie + previous changes trie /// ... -fn max_digest_intervals_to_keep(min_blocks_to_keep: u64, max_digest_interval: u64) -> u64 { +fn max_digest_intervals_to_keep( + min_blocks_to_keep: Number, + max_digest_interval: u32, +) -> Number { // config.digest_level_at_block ensures that it is not zero debug_assert!(max_digest_interval != 0); - let max_digest_intervals_to_keep = min_blocks_to_keep / max_digest_interval; - if max_digest_intervals_to_keep == 0 { - 1 + let max_digest_intervals_to_keep = min_blocks_to_keep / max_digest_interval.into(); + if max_digest_intervals_to_keep.is_zero() { + One::one() } else { max_digest_intervals_to_keep } @@ -153,14 +171,14 @@ mod tests { use crate::changes_trie::storage::InMemoryStorage; use super::*; - fn config(interval: u64, levels: u32) -> Configuration { + fn config(interval: u32, levels: u32) -> Configuration { Configuration { digest_interval: interval, digest_levels: levels, } } - fn prune_by_collect, H: Hasher>( + fn prune_by_collect, H: Hasher>( config: &Configuration, storage: &S, min_blocks_to_keep: u64, @@ -174,7 +192,7 @@ mod tests { #[test] fn prune_works() { - fn prepare_storage() -> InMemoryStorage { + fn prepare_storage() -> InMemoryStorage { let mut mdb1 = MemoryDB::::default(); let root1 = insert_into_memory_db::(&mut mdb1, vec![(vec![10], vec![20])]).unwrap(); let mut mdb2 = MemoryDB::::default(); @@ -241,60 +259,60 @@ mod tests { #[test] fn pruning_range_works() { // DIGESTS ARE NOT CREATED + NO TRIES ARE PRUNED - assert_eq!(pruning_range(&config(10, 0), 2, 2), None); + assert_eq!(pruning_range(&config(10, 0), 2u64, 2u64), None); // DIGESTS ARE NOT CREATED + SOME TRIES ARE PRUNED - assert_eq!(pruning_range(&config(10, 0), 100, 110), Some((10, 10))); - assert_eq!(pruning_range(&config(10, 0), 100, 210), Some((110, 110))); + assert_eq!(pruning_range(&config(10, 0), 100u64, 110u64), Some((10, 10))); + assert_eq!(pruning_range(&config(10, 0), 100u64, 210u64), Some((110, 110))); // DIGESTS ARE CREATED + NO TRIES ARE PRUNED - assert_eq!(pruning_range(&config(10, 2), 2, 0), None); - assert_eq!(pruning_range(&config(10, 2), 30, 100), None); - assert_eq!(pruning_range(&config(::std::u64::MAX, 2), 1, 1024), None); - assert_eq!(pruning_range(&config(::std::u64::MAX, 2), ::std::u64::MAX, 1024), None); - assert_eq!(pruning_range(&config(32, 2), 2048, 512), None); - assert_eq!(pruning_range(&config(32, 2), 2048, 1024), None); + assert_eq!(pruning_range(&config(10, 2), 2u64, 0u64), None); + assert_eq!(pruning_range(&config(10, 2), 30u64, 100u64), None); + assert_eq!(pruning_range(&config(::std::u32::MAX, 2), 1u64, 1024u64), None); + assert_eq!(pruning_range(&config(::std::u32::MAX, 2), ::std::u64::MAX, 1024u64), None); + assert_eq!(pruning_range(&config(32, 2), 2048u64, 512u64), None); + assert_eq!(pruning_range(&config(32, 2), 2048u64, 1024u64), None); // DIGESTS ARE CREATED + SOME TRIES ARE PRUNED // when we do not want to keep any highest-level-digests // (system forces to keep at least one) - assert_eq!(pruning_range(&config(4, 2), 0, 32), Some((1, 16))); - assert_eq!(pruning_range(&config(4, 2), 0, 64), Some((33, 48))); + assert_eq!(pruning_range(&config(4, 2), 0u64, 32u64), Some((1, 16))); + assert_eq!(pruning_range(&config(4, 2), 0u64, 64u64), Some((33, 48))); // when we want to keep 1 (last) highest-level-digest - assert_eq!(pruning_range(&config(4, 2), 16, 32), Some((1, 16))); - assert_eq!(pruning_range(&config(4, 2), 16, 64), Some((33, 48))); + assert_eq!(pruning_range(&config(4, 2), 16u64, 32u64), Some((1, 16))); + assert_eq!(pruning_range(&config(4, 2), 16u64, 64u64), Some((33, 48))); // when we want to keep 1 (last) + 1 additional level digests - assert_eq!(pruning_range(&config(32, 2), 4096, 5120), Some((1, 1024))); - assert_eq!(pruning_range(&config(32, 2), 4096, 6144), Some((1025, 2048))); + assert_eq!(pruning_range(&config(32, 2), 4096u64, 5120u64), Some((1, 1024))); + assert_eq!(pruning_range(&config(32, 2), 4096u64, 6144u64), Some((1025, 2048))); } #[test] fn max_digest_intervals_to_keep_works() { - assert_eq!(max_digest_intervals_to_keep(1024, 1025), 1); - assert_eq!(max_digest_intervals_to_keep(1024, 1023), 1); - assert_eq!(max_digest_intervals_to_keep(1024, 512), 2); - assert_eq!(max_digest_intervals_to_keep(1024, 511), 2); - assert_eq!(max_digest_intervals_to_keep(1024, 100), 10); + assert_eq!(max_digest_intervals_to_keep(1024u64, 1025), 1u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 1023), 1u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 512), 2u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 511), 2u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 100), 10u64); } #[test] fn oldest_non_pruned_trie_works() { // when digests are not created at all - assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100, 10), 1); - assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100, 110), 11); + assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100u64, 10u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100u64, 110u64), 11); // when only l1 digests are created - assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100, 50), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100, 110), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100, 210), 101); + assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100u64, 50u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100u64, 110u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100u64, 210u64), 101); // when l2 digests are created - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 50), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 110), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 210), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 10110), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 20110), 10001); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 50u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 110u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 210u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 10110u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 20110u64), 10001); } } diff --git a/core/state-machine/src/changes_trie/storage.rs b/core/state-machine/src/changes_trie/storage.rs index 8363ae4221..8da2052515 100644 --- a/core/state-machine/src/changes_trie/storage.rs +++ b/core/state-machine/src/changes_trie/storage.rs @@ -16,12 +16,12 @@ //! Changes trie storage utilities. -use std::collections::HashMap; +use std::collections::BTreeMap; use hash_db::Hasher; use trie::DBValue; use trie::MemoryDB; use parking_lot::RwLock; -use crate::changes_trie::{AnchorBlockId, RootsStorage, Storage}; +use crate::changes_trie::{RootsStorage, Storage, AnchorBlockId, BlockNumber}; use crate::trie_backend_essence::TrieBackendStorage; #[cfg(test)] @@ -32,27 +32,27 @@ use crate::backend::insert_into_memory_db; use crate::changes_trie::input::InputPair; /// In-memory implementation of changes trie storage. -pub struct InMemoryStorage { - data: RwLock>, +pub struct InMemoryStorage { + data: RwLock>, } /// Adapter for using changes trie storage as a TrieBackendEssence' storage. -pub struct TrieBackendAdapter<'a, H: Hasher, S: 'a + Storage> { +pub struct TrieBackendAdapter<'a, H: Hasher, Number: BlockNumber, S: 'a + Storage> { storage: &'a S, - _hasher: ::std::marker::PhantomData, + _hasher: ::std::marker::PhantomData<(H, Number)>, } -struct InMemoryStorageData { - roots: HashMap, +struct InMemoryStorageData { + roots: BTreeMap, mdb: MemoryDB, } -impl InMemoryStorage { +impl InMemoryStorage { /// Create the storage from given in-memory database. pub fn with_db(mdb: MemoryDB) -> Self { Self { data: RwLock::new(InMemoryStorageData { - roots: HashMap::new(), + roots: BTreeMap::new(), mdb, }), } @@ -63,10 +63,20 @@ impl InMemoryStorage { Self::with_db(Default::default()) } + /// Create the storage with given blocks. + pub fn with_blocks(blocks: Vec<(Number, H::Out)>) -> Self { + Self { + data: RwLock::new(InMemoryStorageData { + roots: blocks.into_iter().collect(), + mdb: MemoryDB::default(), + }), + } + } + #[cfg(test)] - pub fn with_inputs(inputs: Vec<(u64, Vec)>) -> Self { + pub fn with_inputs(inputs: Vec<(Number, Vec>)>) -> Self { let mut mdb = MemoryDB::default(); - let mut roots = HashMap::new(); + let mut roots = BTreeMap::new(); for (block, pairs) in inputs { let root = insert_into_memory_db::(&mut mdb, pairs.into_iter().map(Into::into)); if let Some(root) = root { @@ -101,32 +111,44 @@ impl InMemoryStorage { } /// Insert changes trie for given block. - pub fn insert(&self, block: u64, changes_trie_root: H::Out, trie: MemoryDB) { + pub fn insert(&self, block: Number, changes_trie_root: H::Out, trie: MemoryDB) { let mut data = self.data.write(); data.roots.insert(block, changes_trie_root); data.mdb.consolidate(trie); } } -impl RootsStorage for InMemoryStorage { - fn root(&self, _anchor_block: &AnchorBlockId, block: u64) -> Result, String> { +impl RootsStorage for InMemoryStorage { + fn build_anchor(&self, parent_hash: H::Out) -> Result, String> { + self.data.read().roots.iter() + .find(|(_, v)| **v == parent_hash) + .map(|(k, _)| AnchorBlockId { hash: parent_hash, number: k.clone() }) + .ok_or_else(|| format!("Can't find associated number for block {:?}", parent_hash)) + } + + fn root(&self, _anchor_block: &AnchorBlockId, block: Number) -> Result, String> { Ok(self.data.read().roots.get(&block).cloned()) } } -impl Storage for InMemoryStorage { +impl Storage for InMemoryStorage { fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { MemoryDB::::get(&self.data.read().mdb, key, prefix) } } -impl<'a, H: Hasher, S: 'a + Storage> TrieBackendAdapter<'a, H, S> { +impl<'a, H: Hasher, Number: BlockNumber, S: 'a + Storage> TrieBackendAdapter<'a, H, Number, S> { pub fn new(storage: &'a S) -> Self { Self { storage, _hasher: Default::default() } } } -impl<'a, H: Hasher, S: 'a + Storage> TrieBackendStorage for TrieBackendAdapter<'a, H, S> { +impl<'a, H, Number, S> TrieBackendStorage for TrieBackendAdapter<'a, H, Number, S> + where + S: 'a + Storage, + Number: BlockNumber, + H: Hasher, +{ type Overlay = MemoryDB; fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index b9c035a778..f0638edf65 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -19,7 +19,7 @@ use std::{error, fmt, cmp::Ord}; use log::warn; use crate::backend::Backend; -use crate::changes_trie::{AnchorBlockId, Storage as ChangesTrieStorage, compute_changes_trie_root}; +use crate::changes_trie::{Storage as ChangesTrieStorage, compute_changes_trie_root}; use crate::{Externalities, OverlayedChanges, OffchainExt, ChildStorageKey}; use hash_db::Hasher; use primitives::storage::well_known_keys::is_child_storage_key; @@ -57,10 +57,9 @@ impl error::Error for Error { } /// Wraps a read-only backend, call executor, and current overlayed changes. -pub struct Ext<'a, H, B, T, O> +pub struct Ext<'a, H, N, B, T, O> where H: Hasher, - B: 'a + Backend, { /// The overlayed changes to write to. @@ -78,20 +77,23 @@ where /// This differs from `storage_transaction` behavior, because the moment when /// `storage_changes_root` is called matters + we need to remember additional /// data at this moment (block number). - changes_trie_transaction: Option<(u64, MemoryDB, H::Out)>, + changes_trie_transaction: Option<(MemoryDB, H::Out)>, /// Additional externalities for offchain workers. /// /// If None, some methods from the trait might not supported. offchain_externalities: Option<&'a mut O>, + /// Dummy usage of N arg. + _phantom: ::std::marker::PhantomData, } -impl<'a, H, B, T, O> Ext<'a, H, B, T, O> +impl<'a, H, N, B, T, O> Ext<'a, H, N, B, T, O> where H: Hasher, B: 'a + Backend, - T: 'a + ChangesTrieStorage, + T: 'a + ChangesTrieStorage, O: 'a + OffchainExt, - H::Out: Ord, + H::Out: Ord + 'static, + N: crate::changes_trie::BlockNumber, { /// Create a new `Ext` from overlayed changes and read-only backend pub fn new( @@ -107,6 +109,7 @@ where changes_trie_storage, changes_trie_transaction: None, offchain_externalities, + _phantom: Default::default(), } } @@ -118,7 +121,7 @@ where self.storage_transaction .expect("storage_transaction always set after calling storage root; qed"), self.changes_trie_transaction - .map(|(_, tx, _)| tx), + .map(|(tx, _)| tx), ); ( @@ -137,13 +140,13 @@ where } #[cfg(test)] -impl<'a, H, B, T, O> Ext<'a, H, B, T, O> +impl<'a, H, N, B, T, O> Ext<'a, H, N, B, T, O> where H: Hasher, - B: 'a + Backend, - T: 'a + ChangesTrieStorage, + T: 'a + ChangesTrieStorage, O: 'a + OffchainExt, + N: crate::changes_trie::BlockNumber, { pub fn storage_pairs(&self) -> Vec<(Vec, Vec)> { use std::collections::HashMap; @@ -159,13 +162,14 @@ where } } -impl<'a, B, T, H, O> Externalities for Ext<'a, H, B, T, O> +impl<'a, B, T, H, N, O> Externalities for Ext<'a, H, N, B, T, O> where H: Hasher, B: 'a + Backend, - T: 'a + ChangesTrieStorage, + T: 'a + ChangesTrieStorage, O: 'a + OffchainExt, - H::Out: Ord, + H::Out: Ord + 'static, + N: crate::changes_trie::BlockNumber, { fn storage(&self, key: &[u8]) -> Option> { let _guard = panic_handler::AbortGuard::new(true); @@ -313,14 +317,14 @@ where } } - fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option { + fn storage_changes_root(&mut self, parent_hash: H::Out) -> Result, ()> { let _guard = panic_handler::AbortGuard::new(true); - let root_and_tx = compute_changes_trie_root::<_, T, H>( + let root_and_tx = compute_changes_trie_root::<_, T, H, N>( self.backend, self.changes_trie_storage.clone(), self.overlay, - &AnchorBlockId { hash: parent, number: parent_num }, - ); + parent_hash, + )?; let root_and_tx = root_and_tx.map(|(root, changes)| { let mut calculated_root = Default::default(); let mut mdb = MemoryDB::default(); @@ -331,11 +335,11 @@ where } } - (parent_num + 1, mdb, root) + (mdb, root) }); - let root = root_and_tx.as_ref().map(|(_, _, root)| root.clone()); + let root = root_and_tx.as_ref().map(|(_, root)| root.clone()); self.changes_trie_transaction = root_and_tx; - root + Ok(root) } fn submit_extrinsic(&mut self, extrinsic: Vec) -> Result<(), ()> { @@ -363,8 +367,8 @@ mod tests { use super::*; type TestBackend = InMemory; - type TestChangesTrieStorage = InMemoryChangesTrieStorage; - type TestExt<'a> = Ext<'a, Blake2Hasher, TestBackend, TestChangesTrieStorage, crate::NeverOffchainExt>; + type TestChangesTrieStorage = InMemoryChangesTrieStorage; + type TestExt<'a> = Ext<'a, Blake2Hasher, u64, TestBackend, TestChangesTrieStorage, crate::NeverOffchainExt>; fn prepare_overlay_with_changes() -> OverlayedChanges { OverlayedChanges { @@ -391,26 +395,26 @@ mod tests { let mut overlay = prepare_overlay_with_changes(); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, None, None); - assert_eq!(ext.storage_changes_root(Default::default(), 100), None); + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None); } #[test] fn storage_changes_root_is_none_when_extrinsic_changes_are_none() { let mut overlay = prepare_overlay_with_changes(); overlay.changes_trie_config = None; - let storage = TestChangesTrieStorage::new(); + let storage = TestChangesTrieStorage::with_blocks(vec![(100, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default(), 100), None); + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None); } #[test] fn storage_changes_root_is_some_when_extrinsic_changes_are_non_empty() { let mut overlay = prepare_overlay_with_changes(); - let storage = TestChangesTrieStorage::new(); + let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default(), 99), + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), Some(hex!("5b829920b9c8d554a19ee2a1ba593c4f2ee6fc32822d083e04236d693e8358d5").into())); } @@ -418,10 +422,10 @@ mod tests { fn storage_changes_root_is_some_when_extrinsic_changes_are_empty() { let mut overlay = prepare_overlay_with_changes(); overlay.prospective.top.get_mut(&vec![1]).unwrap().value = None; - let storage = TestChangesTrieStorage::new(); + let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default(), 99), + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), Some(hex!("bcf494e41e29a15c9ae5caa053fe3cb8b446ee3e02a254efbdec7a19235b76e4").into())); } } diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index daf8f915a1..4f51677fff 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -219,7 +219,7 @@ pub trait Externalities { 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; + fn storage_changes_root(&mut self, parent: H::Out) -> Result, ()> where H::Out: Ord; /// Submit extrinsic. /// @@ -338,7 +338,7 @@ pub fn always_wasm() -> ExecutionManager> { } /// Creates new substrate state machine. -pub fn new<'a, H, B, T, O, Exec>( +pub fn new<'a, H, N, B, T, O, Exec>( backend: &'a B, changes_trie_storage: Option<&'a T>, offchain_ext: Option<&'a mut O>, @@ -346,7 +346,7 @@ pub fn new<'a, H, B, T, O, Exec>( exec: &'a Exec, method: &'a str, call_data: &'a [u8], -) -> StateMachine<'a, H, B, T, O, Exec> { +) -> StateMachine<'a, H, N, B, T, O, Exec> { StateMachine { backend, changes_trie_storage, @@ -360,7 +360,7 @@ pub fn new<'a, H, B, T, O, Exec>( } /// The substrate state machine. -pub struct StateMachine<'a, H, B, T, O, Exec> { +pub struct StateMachine<'a, H, N, B, T, O, Exec> { backend: &'a B, changes_trie_storage: Option<&'a T>, offchain_ext: Option<&'a mut O>, @@ -368,16 +368,17 @@ pub struct StateMachine<'a, H, B, T, O, Exec> { exec: &'a Exec, method: &'a str, call_data: &'a [u8], - _hasher: PhantomData, + _hasher: PhantomData<(H, N)>, } -impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where +impl<'a, H, N, B, T, O, Exec> StateMachine<'a, H, N, B, T, O, Exec> where H: Hasher, Exec: CodeExecutor, B: Backend, - T: ChangesTrieStorage, + T: ChangesTrieStorage, O: OffchainExt, - H::Out: Ord, + H::Out: Ord + 'static, + N: crate::changes_trie::BlockNumber, { /// 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 @@ -568,7 +569,7 @@ where B: Backend, H: Hasher, Exec: CodeExecutor, - H::Out: Ord, + H::Out: Ord + 'static, { let trie_backend = backend.try_into_trie_backend() .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; @@ -595,12 +596,12 @@ where S: trie_backend_essence::TrieBackendStorage, H: Hasher, Exec: CodeExecutor, - H::Out: Ord, + H::Out: Ord + 'static, { let proving_backend = proving_backend::ProvingBackend::new(trie_backend); let mut sm = StateMachine { backend: &proving_backend, - changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, + changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, offchain_ext: NeverOffchainExt::new(), overlay, exec, @@ -629,7 +630,7 @@ pub fn execution_proof_check( where H: Hasher, Exec: CodeExecutor, - H::Out: Ord, + H::Out: Ord + 'static, { let trie_backend = create_proof_check_backend::(root.into(), proof)?; execution_proof_check_on_trie_backend(&trie_backend, overlay, exec, method, call_data) @@ -646,11 +647,11 @@ pub fn execution_proof_check_on_trie_backend( where H: Hasher, Exec: CodeExecutor, - H::Out: Ord, + H::Out: Ord + 'static, { let mut sm = StateMachine { backend: trie_backend, - changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, + changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, offchain_ext: NeverOffchainExt::new(), overlay, exec, @@ -892,7 +893,7 @@ mod tests { fn execute_works() { assert_eq!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -913,7 +914,7 @@ mod tests { fn execute_works_with_native_else_wasm() { assert_eq!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -934,7 +935,7 @@ mod tests { let mut consensus_failed = false; assert!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -1003,7 +1004,7 @@ mod tests { }; { - let changes_trie_storage = InMemoryChangesTrieStorage::new(); + let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut ext = Ext::new(&mut overlay, &backend, Some(&changes_trie_storage), NeverOffchainExt::new()); ext.clear_prefix(b"ab"); } @@ -1026,7 +1027,7 @@ mod tests { #[test] fn set_child_storage_works() { let backend = InMemory::::default().try_into_trie_backend().unwrap(); - let changes_trie_storage = InMemoryChangesTrieStorage::new(); + let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut overlay = OverlayedChanges::default(); let mut ext = Ext::new( &mut overlay, @@ -1106,7 +1107,7 @@ mod tests { fn cannot_change_changes_trie_config() { assert!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -1126,7 +1127,7 @@ mod tests { fn cannot_change_changes_trie_config_with_native_else_wasm() { assert!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index e595cff0e4..663e4ff72e 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -361,7 +361,7 @@ mod tests { ..Default::default() }; - let changes_trie_storage = InMemoryChangesTrieStorage::new(); + let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut ext = Ext::new( &mut overlay, &backend, diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index 03909f384c..52d208142d 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -18,12 +18,12 @@ use std::collections::{HashMap, BTreeMap}; use std::iter::FromIterator; -use std::marker::PhantomData; use hash_db::Hasher; 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 + compute_changes_trie_root, InMemoryStorage as ChangesTrieInMemoryStorage, + BlockNumber as ChangesTrieBlockNumber, }; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; use parity_codec::Encode; @@ -32,14 +32,13 @@ 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 { +pub struct TestExternalities { overlay: OverlayedChanges, backend: InMemory, - changes_trie_storage: ChangesTrieInMemoryStorage, - _hasher: PhantomData, + changes_trie_storage: ChangesTrieInMemoryStorage, } -impl TestExternalities { +impl TestExternalities { /// Create a new instance of `TestExternalities` pub fn new(inner: HashMap, Vec>) -> Self { Self::new_with_code(&[], inner) @@ -62,7 +61,6 @@ impl TestExternalities { overlay, changes_trie_storage: ChangesTrieInMemoryStorage::new(), backend: inner.into(), - _hasher: Default::default(), } } @@ -81,23 +79,28 @@ impl TestExternalities { .into_iter() .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) } + + /// Get mutable reference to changes trie storage. + pub fn changes_trie_storage(&mut self) -> &mut ChangesTrieInMemoryStorage { + &mut self.changes_trie_storage + } } -impl ::std::fmt::Debug for TestExternalities { +impl ::std::fmt::Debug for TestExternalities { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, "overlay: {:?}\nbackend: {:?}", self.overlay, self.backend.pairs()) } } -impl PartialEq for TestExternalities { +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 { + fn eq(&self, other: &TestExternalities) -> bool { self.iter_pairs_in_order().eq(other.iter_pairs_in_order()) } } -impl FromIterator<(Vec, Vec)> for TestExternalities { +impl FromIterator<(Vec, Vec)> for TestExternalities { fn from_iter, Vec)>>(iter: I) -> Self { let mut t = Self::new(Default::default()); t.backend = t.backend.update(iter.into_iter().map(|(k, v)| (None, k, Some(v))).collect()); @@ -105,23 +108,28 @@ impl FromIterator<(Vec, Vec)> for TestExternalities { } } -impl Default for TestExternalities { +impl Default for TestExternalities { fn default() -> Self { Self::new(Default::default()) } } -impl From> for HashMap, Vec> { - fn from(tex: TestExternalities) -> Self { +impl From> for HashMap, Vec> { + fn from(tex: TestExternalities) -> Self { tex.iter_pairs_in_order().collect() } } -impl From< HashMap, Vec> > for TestExternalities { +impl From< HashMap, Vec> > for TestExternalities { fn from(hashmap: HashMap, Vec>) -> Self { Self::from_iter(hashmap) } } -impl Externalities for TestExternalities where H::Out: Ord { +impl Externalities for TestExternalities + where + H: Hasher, + N: ChangesTrieBlockNumber, + H::Out: Ord + 'static +{ fn storage(&self, key: &[u8]) -> Option> { 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)) @@ -209,13 +217,13 @@ impl Externalities for TestExternalities where H::Out: Ord { root } - fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option { - compute_changes_trie_root::<_, ChangesTrieInMemoryStorage, H>( + fn storage_changes_root(&mut self, parent: H::Out) -> Result, ()> { + Ok(compute_changes_trie_root::<_, _, H, N>( &self.backend, Some(&self.changes_trie_storage), &self.overlay, - &AnchorBlockId { hash: parent, number: parent_num }, - ).map(|(root, _)| root.clone()) + parent, + )?.map(|(root, _)| root.clone())) } fn submit_extrinsic(&mut self, _extrinsic: Vec) -> Result<(), ()> { @@ -231,7 +239,7 @@ mod tests { #[test] fn commit_should_work() { - let mut ext = TestExternalities::::default(); + let mut ext = TestExternalities::::default(); 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()); @@ -241,7 +249,7 @@ mod tests { #[test] fn set_and_retrieve_code() { - let mut ext = TestExternalities::::default(); + let mut ext = TestExternalities::::default(); let code = vec![1, 2, 3]; ext.set_storage(CODE.to_vec(), code.clone()); diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index dfb6cae08c..89a5b42a84 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -22,7 +22,6 @@ use std::sync::Arc; use log::{debug, warn}; use hash_db::{self, Hasher}; 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; /// Patricia trie-based storage trait. @@ -300,12 +299,3 @@ impl TrieBackendStorage for MemoryDB { Ok(hash_db::HashDB::get(self, key, prefix)) } } - -// This implementation is used by changes trie clients. -impl<'a, S, H: Hasher> TrieBackendStorage for &'a S where S: ChangesTrieStorage { - type Overlay = MemoryDB; - - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { - ChangesTrieStorage::::get(*self, key, prefix) - } -} diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 5345dc0cdb..804d5411d6 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -100,7 +100,7 @@ pub fn polish_block(block: &mut Block) { // check digest let mut digest = Digest::default(); - if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into(), header.number - 1) { + if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into()) { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); } if let Some(new_authorities) = ::take() { @@ -133,7 +133,7 @@ pub fn execute_block(block: Block) { // check digest let mut digest = Digest::default(); - if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into(), header.number - 1) { + if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into()) { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); } if let Some(new_authorities) = ::take() { @@ -213,7 +213,7 @@ pub fn finalize_block() -> Header { 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); + let storage_changes_root = BlakeTwo256::storage_changes_root(parent_hash); let mut digest = Digest::default(); if let Some(storage_changes_root) = storage_changes_root { diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index c6903529c4..8813850bbd 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -33,7 +33,7 @@ mod tests { use parity_codec::{Encode, Decode, Joiner}; use keyring::{AuthorityKeyring, AccountKeyring}; use runtime_support::{Hashable, StorageValue, StorageMap, traits::Currency}; - use state_machine::{CodeExecutor, Externalities, TestExternalities}; + use state_machine::{CodeExecutor, Externalities, TestExternalities as CoreTestExternalities}; use primitives::{twox_128, blake2_256, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, NativeOrEncoded}; use node_primitives::{Hash, BlockNumber, AccountId}; @@ -52,6 +52,8 @@ mod tests { const COMPACT_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm"); const GENESIS_HASH: [u8; 32] = [69u8; 32]; + type TestExternalities = CoreTestExternalities; + fn alice() -> AccountId { AccountKeyring::Alice.into() } @@ -258,7 +260,7 @@ mod tests { fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { let three = AccountId::from_raw([3u8; 32]); - TestExternalities::new_with_code(code, GenesisConfig { + let mut ext = TestExternalities::new_with_code(code, GenesisConfig { consensus: Some(Default::default()), system: Some(SystemConfig { changes_trie_config: if support_changes_trie { Some(ChangesTrieConfiguration { @@ -322,7 +324,9 @@ mod tests { grandpa: Some(GrandpaConfig { authorities: vec![], }), - }.build_storage().unwrap().0) + }.build_storage().unwrap().0); + ext.changes_trie_storage().insert(0, GENESIS_HASH.into(), Default::default()); + ext } fn construct_block( @@ -879,7 +883,7 @@ mod tests { None, ).0.unwrap(); - assert!(t.storage_changes_root(Default::default(), 0).is_some()); + assert!(t.storage_changes_root(GENESIS_HASH.into()).unwrap().is_some()); } #[test] @@ -889,7 +893,7 @@ mod tests { let mut t = new_test_ext(COMPACT_CODE, true); WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); - assert!(t.storage_changes_root(Default::default(), 0).is_some()); + assert!(t.storage_changes_root(GENESIS_HASH.into()).unwrap().is_some()); } #[cfg(feature = "benchmarks")] diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 0ec44093b4..bb066b1b98 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,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: 81, - impl_version: 83, + spec_version: 82, + impl_version: 82, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index 9018b109e8..cf5f473bdc 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -78,7 +78,7 @@ use rstd::prelude::*; use rstd::map; use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, One, Bounded, Lookup, Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, CurrentHeight, BlockNumberToHash, - MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, SaturatedConversion + MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, }; #[cfg(any(feature = "std", test))] use primitives::traits::Zero; @@ -493,8 +493,7 @@ impl Module { let mut digest = >::take(); let extrinsics_root = >::take(); let storage_root = T::Hashing::storage_root(); - let number_u64 = number.saturated_into::(); - let storage_changes_root = T::Hashing::storage_changes_root(parent_hash, number_u64 - 1); + let storage_changes_root = T::Hashing::storage_changes_root(parent_hash); // we can't compute changes trie root earlier && put it to the Digest // because it will include all currently existing temporaries. -- GitLab From d796de17f08d29372e34b2e432e6148295dcf94f Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 28 May 2019 16:07:35 +0300 Subject: [PATCH 030/140] Synchronous import queue + fix async inport queue shutdown (#2701) * sync implementation of ImportQueue * fix import queue shutdown * never clone import queue --- Cargo.lock | 1 + core/consensus/common/Cargo.toml | 1 + core/consensus/common/src/import_queue.rs | 582 ++++++++++++++-------- core/network/src/service.rs | 22 +- 4 files changed, 394 insertions(+), 212 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a40f588d29..5d32c8882b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3999,6 +3999,7 @@ dependencies = [ "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)", + "parking_lot 0.7.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", diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index 5e55d555dd..a64ae120f4 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -18,6 +18,7 @@ runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } tokio-timer = "0.2" parity-codec = { version = "3.3", features = ["derive"] } +parking_lot = "0.7.1" [dev-dependencies] test_client = { package = "substrate-test-client", path = "../../test-client" } diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index 4d64d799b1..26ae181b51 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -31,6 +31,7 @@ use crate::block_import::{ }; use crossbeam_channel::{self as channel, Receiver, Sender}; use parity_codec::Encode; +use parking_lot::Mutex; use std::sync::Arc; use std::thread; @@ -97,7 +98,7 @@ pub trait Verifier: Send + Sync { } /// Blocks import queue API. -pub trait ImportQueue: Send + Sync + ImportQueueClone { +pub trait ImportQueue: Send + Sync { /// Start background work for the queue as necessary. /// /// This is called automatically by the network service when synchronization @@ -105,8 +106,6 @@ pub trait ImportQueue: Send + Sync + ImportQueueClone { fn start(&self, _link: Box>) -> Result<(), std::io::Error> { Ok(()) } - /// Clears the import queue and stops importing. - fn stop(&self); /// Import bunch of blocks. fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>); /// Import a block justification. @@ -115,13 +114,96 @@ pub trait ImportQueue: Send + Sync + ImportQueueClone { fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec); } -pub trait ImportQueueClone { - fn clone_box(&self) -> Box>; +/// Basic block import queue that performs import in the caller thread. +pub struct BasicSyncQueue> { + data: Arc>, } -impl Clone for Box> { - fn clone(&self) -> Box> { - self.clone_box() +struct BasicSyncQueueData> { + link: Mutex>>>, + block_import: SharedBlockImport, + verifier: Arc, + justification_import: Option>, + finality_proof_import: Option>, +} + +impl> BasicSyncQueue { + pub fn new( + block_import: SharedBlockImport, + verifier: Arc, + justification_import: Option>, + finality_proof_import: Option>, + ) -> Self { + BasicSyncQueue { + data: Arc::new(BasicSyncQueueData { + link: Mutex::new(None), + block_import, + verifier, + justification_import, + finality_proof_import, + }), + } + } +} + +impl> ImportQueue for BasicSyncQueue { + fn start(&self, link: Box>) -> Result<(), std::io::Error> { + if let Some(justification_import) = self.data.justification_import.as_ref() { + justification_import.on_start(&*link); + } + *self.data.link.lock() = Some(link); + Ok(()) + } + + fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>) { + if blocks.is_empty() { + return; + } + + let (imported, count, results) = import_many_blocks( + &*self.data.block_import, + origin, + blocks, + self.data.verifier.clone(), + ); + + let link_ref = self.data.link.lock(); + let link = match link_ref.as_ref() { + Some(link) => link, + None => { + trace!(target: "sync", "Trying to import blocks before starting import queue"); + return; + }, + }; + + process_import_results(&**link, results); + + trace!(target: "sync", "Imported {} of {}", imported, count); + } + + fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification) { + import_single_justification( + &*self.data.link.lock(), + &self.data.justification_import, + who, + hash, + number, + justification, + ) + } + + fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { + let result = import_single_finality_proof( + &self.data.finality_proof_import, + &*self.data.verifier, + &who, + hash, + number, + finality_proof, + ); + if let Some(link) = self.data.link.lock().as_ref() { + link.finality_proof_imported(who, (hash, number), result); + } } } @@ -129,16 +211,20 @@ impl Clone for Box> { /// sequentially in a separate thread, with pluggable verification. #[derive(Clone)] pub struct BasicQueue { - sender: Sender>, + sender: Option>>, } -impl ImportQueueClone for BasicQueue { - fn clone_box(&self) -> Box> { - Box::new(self.clone()) +impl Drop for BasicQueue { + fn drop(&mut self) { + if let Some(sender) = self.sender.take() { + let (shutdown_sender, shutdown_receiver) = channel::unbounded(); + if sender.send(BlockImportMsg::Shutdown(shutdown_sender)).is_ok() { + let _ = shutdown_receiver.recv(); + } + } } } - /// "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. @@ -184,7 +270,7 @@ impl BasicQueue { ); Self { - sender: importer_sender, + sender: Some(importer_sender), } } @@ -194,52 +280,47 @@ impl BasicQueue { /// 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"); + if let Some(ref sender) = self.sender { + let _ = sender.send(BlockImportMsg::Synchronize); + } } } impl ImportQueue for BasicQueue { fn start(&self, link: Box>) -> Result<(), std::io::Error> { - let (sender, port) = channel::unbounded(); - let _ = self - .sender - .send(BlockImportMsg::Start(link, sender)) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); - port.recv().expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed") - } - - fn stop(&self) { - let _ = self - .sender - .send(BlockImportMsg::Stop) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + let connect_err = || Err(std::io::Error::new( + std::io::ErrorKind::Other, + "Failed to connect import queue threads", + )); + if let Some(ref sender) = self.sender { + let (start_sender, start_port) = channel::unbounded(); + let _ = sender.send(BlockImportMsg::Start(link, start_sender)); + start_port.recv().unwrap_or_else(|_| connect_err()) + } else { + connect_err() + } } fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>) { if blocks.is_empty() { return; } - let _ = self - .sender - .send(BlockImportMsg::ImportBlocks(origin, blocks)) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + + if let Some(ref sender) = self.sender { + let _ = sender.send(BlockImportMsg::ImportBlocks(origin, blocks)); + } } fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification) { - let _ = self - .sender - .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"); + if let Some(ref sender) = self.sender { + let _ = sender.send(BlockImportMsg::ImportJustification(who.clone(), hash, number, justification)); + } } 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"); + if let Some(ref sender) = self.sender { + let _ = sender.send(BlockImportMsg::ImportFinalityProof(who, hash, number, finality_proof)); + } } } @@ -248,12 +329,12 @@ pub enum BlockImportMsg { ImportJustification(Origin, B::Hash, NumberFor, Justification), ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), Start(Box>, Sender>), - Stop, + Shutdown(Sender<()>), #[cfg(any(test, feature = "test-helpers"))] Synchronize, } -#[cfg_attr(test, derive(Debug, PartialEq))] +#[cfg_attr(test, derive(Debug))] pub enum BlockImportWorkerMsg { ImportBlocks(BlockOrigin, Vec>), ImportedBlocks( @@ -264,6 +345,7 @@ pub enum BlockImportWorkerMsg { ), ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), ImportedFinalityProof(Origin, (B::Hash, NumberFor), Result<(B::Hash, NumberFor), ()>), + Shutdown(Sender<()>), #[cfg(any(test, feature = "test-helpers"))] Synchronize, } @@ -276,7 +358,7 @@ enum ImportMsgType { struct BlockImporter { port: Receiver>, result_port: Receiver>, - worker_sender: Sender>, + worker_sender: Option>>, link: Option>>, verifier: Arc>, justification_import: Option>, @@ -301,7 +383,7 @@ impl BlockImporter { let mut importer = BlockImporter { port, result_port, - worker_sender, + worker_sender: Some(worker_sender), link: None, verifier, justification_import, @@ -345,7 +427,14 @@ impl BlockImporter { self.handle_import_blocks(origin, incoming_blocks) }, BlockImportMsg::ImportJustification(who, hash, number, justification) => { - self.handle_import_justification(who, hash, number, justification) + import_single_justification( + &self.link, + &self.justification_import, + who, + hash, + number, + justification, + ); }, BlockImportMsg::ImportFinalityProof(who, hash, number, finality_proof) => { self.handle_import_finality_proof(who, hash, number, finality_proof) @@ -363,13 +452,24 @@ impl BlockImporter { self.link = Some(link); let _ = sender.send(Ok(())); }, - BlockImportMsg::Stop => return false, + BlockImportMsg::Shutdown(result_sender) => { + // stop worker thread + if let Some(worker_sender) = self.worker_sender.take() { + let (sender, receiver) = channel::unbounded(); + if worker_sender.send(BlockImportWorkerMsg::Shutdown(sender)).is_ok() { + let _ = receiver.recv(); + } + } + // send shutdown notification + let _ = result_sender.send(()); + 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"); + if let Some(ref worker_sender) = self.worker_sender { + let _ = worker_sender.send(BlockImportWorkerMsg::Synchronize); + } }, } true @@ -398,106 +498,26 @@ impl BlockImporter { }, BlockImportWorkerMsg::ImportBlocks(_, _) | BlockImportWorkerMsg::ImportFinalityProof(_, _, _, _) - => unreachable!("Import Worker does not send Import* message; qed"), + | BlockImportWorkerMsg::Shutdown(_) + => unreachable!("Import Worker does not send Import*/Shutdown messages; qed"), }; - let mut has_error = false; - let mut hashes = vec![]; - for (result, hash) in results { - hashes.push(hash); - - if has_error { - continue; - } - - if result.is_err() { - has_error = true; - } - - match result { - Ok(BlockImportResult::ImportedKnown(number)) => link.block_imported(&hash, number), - Ok(BlockImportResult::ImportedUnknown(number, aux, who)) => { - link.block_imported(&hash, number); - - if aux.clear_justification_requests { - trace!(target: "sync", "Block imported clears all pending justification requests {}: {:?}", number, hash); - link.clear_justification_requests(); - } - - if aux.needs_justification { - trace!(target: "sync", "Block imported but requires justification {}: {:?}", number, hash); - link.request_justification(&hash, number); - } - - if aux.bad_justification { - if let Some(peer) = who { - 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 { - 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 { - 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 { - info!("Bad block"); - link.report_peer(peer, BAD_BLOCK_REPUTATION_CHANGE); - link.restart(); - } - }, - Err(BlockImportError::UnknownParent) | Err(BlockImportError::Error) => { - link.restart(); - }, - }; - } - if let Some(link) = self.link.as_ref() { - link.blocks_processed(hashes, has_error); - } + process_import_results(&**link, results); true } - fn handle_import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification) { - let success = self.justification_import.as_ref().map(|justification_import| { - justification_import.import_justification(hash, number, justification) - .map_err(|e| { - debug!(target: "sync", "Justification import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}", e, hash, number, who); - e - }).is_ok() - }).unwrap_or(false); - - if let Some(link) = self.link.as_ref() { - link.justification_imported(who, &hash, number, success); - } - } - 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"); + if let Some(ref worker_sender) = self.worker_sender { + trace!(target: "sync", "Scheduling finality proof of {}/{} for import", number, hash); + let _ = worker_sender.send(BlockImportWorkerMsg::ImportFinalityProof(who, hash, number, finality_proof)); + } } fn handle_import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) { - trace!(target: "sync", "Scheduling {} blocks for import", blocks.len()); - self.worker_sender - .send(BlockImportWorkerMsg::ImportBlocks(origin, blocks)) - .expect("1. This is holding a sender to the worker, 2. the worker should not quit while a sender is still held; qed"); + if let Some(ref worker_sender) = self.worker_sender { + trace!(target: "sync", "Scheduling {} blocks for import", blocks.len()); + let _ = worker_sender.send(BlockImportWorkerMsg::ImportBlocks(origin, blocks)); + } } } @@ -534,6 +554,10 @@ impl> BlockImportWorker { BlockImportWorkerMsg::ImportFinalityProof(who, hash, number, proof) => { worker.import_finality_proof(who, hash, number, proof); }, + BlockImportWorkerMsg::Shutdown(result_sender) => { + let _ = result_sender.send(()); + break; + }, #[cfg(any(test, feature = "test-helpers"))] BlockImportWorkerMsg::Synchronize => { trace!(target: "sync", "Sending sync message"); @@ -550,44 +574,12 @@ impl> BlockImportWorker { } fn import_a_batch_of_blocks(&self, origin: BlockOrigin, blocks: Vec>) { - let count = blocks.len(); - let mut imported = 0; - - let blocks_range = match ( - blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), - 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", "Starting import of {} blocks {}", count, blocks_range); - - let mut results = vec![]; - - let mut has_error = false; - - // Blocks in the response/drain should be in ascending order. - for block in blocks { - let import_result = if has_error { - Err(BlockImportError::Error) - } else { - import_single_block( - &*self.block_import, - origin.clone(), - block.clone(), - self.verifier.clone(), - ) - }; - let was_ok = import_result.is_ok(); - results.push((import_result, block.hash)); - if was_ok { - imported += 1; - } else { - has_error = true; - } - } + let (imported, count, results) = import_many_blocks( + &*self.block_import, + origin, + blocks, + self.verifier.clone(), + ); let _ = self .result_sender @@ -597,24 +589,18 @@ impl> BlockImportWorker { } 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 result = import_single_finality_proof( + &self.finality_proof_import, + &*self.verifier, + &who, + hash, + number, + finality_proof, + ); let _ = self .result_sender .send(BlockImportWorkerMsg::ImportedFinalityProof(who, (hash, number), result)); - - trace!(target: "sync", "Imported finality proof for {}/{}", number, hash); } } @@ -679,6 +665,193 @@ pub enum BlockImportError { Error, } +/// Imports single notification and send notification to the link (if provided). +fn import_single_justification( + link: &Option>>, + justification_import: &Option>, + who: Origin, + hash: B::Hash, + number: NumberFor, + justification: Justification, +) { + let success = justification_import.as_ref().map(|justification_import| { + justification_import.import_justification(hash, number, justification) + .map_err(|e| { + debug!( + target: "sync", + "Justification import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}", + e, + hash, + number, + who, + ); + e + }).is_ok() + }).unwrap_or(false); + + if let Some(ref link) = link { + link.justification_imported(who, &hash, number, success); + } +} + +/// Imports single finality_proof. +fn import_single_finality_proof>( + finality_proof_import: &Option>, + verifier: &V, + who: &Origin, + hash: B::Hash, + number: NumberFor, + finality_proof: Vec, +) -> Result<(B::Hash, NumberFor), ()> { + let result = finality_proof_import.as_ref().map(|finality_proof_import| { + finality_proof_import.import_finality_proof(hash, number, finality_proof, verifier) + .map_err(|e| { + debug!( + "Finality proof import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}", + e, + hash, + number, + who, + ); + }) + }).unwrap_or(Err(())); + + trace!(target: "sync", "Imported finality proof for {}/{}", number, hash); + + result +} + +/// Process result of block(s) import. +fn process_import_results( + link: &Link, + results: Vec<( + Result>, BlockImportError>, + B::Hash, + )>, +) +{ + let mut has_error = false; + let mut hashes = vec![]; + for (result, hash) in results { + hashes.push(hash); + + if has_error { + continue; + } + + if result.is_err() { + has_error = true; + } + + match result { + Ok(BlockImportResult::ImportedKnown(number)) => link.block_imported(&hash, number), + Ok(BlockImportResult::ImportedUnknown(number, aux, who)) => { + link.block_imported(&hash, number); + + if aux.clear_justification_requests { + trace!(target: "sync", "Block imported clears all pending justification requests {}: {:?}", number, hash); + link.clear_justification_requests(); + } + + if aux.needs_justification { + trace!(target: "sync", "Block imported but requires justification {}: {:?}", number, hash); + link.request_justification(&hash, number); + } + + if aux.bad_justification { + if let Some(peer) = who { + 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 { + 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 { + 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 { + info!("Bad block"); + link.report_peer(peer, BAD_BLOCK_REPUTATION_CHANGE); + link.restart(); + } + }, + Err(BlockImportError::UnknownParent) | Err(BlockImportError::Error) => { + link.restart(); + }, + }; + } + link.blocks_processed(hashes, has_error); +} + +/// Import several blocks at once, returning import result for each block. +fn import_many_blocks>( + import_handle: &BlockImport, + blocks_origin: BlockOrigin, + blocks: Vec>, + verifier: Arc, +) -> (usize, usize, Vec<( + Result>, BlockImportError>, + B::Hash, +)>) { + let count = blocks.len(); + let mut imported = 0; + + let blocks_range = match ( + blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), + 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", "Starting import of {} blocks {}", count, blocks_range); + + let mut results = vec![]; + + let mut has_error = false; + + // Blocks in the response/drain should be in ascending order. + for block in blocks { + let block_hash = block.hash; + let import_result = if has_error { + Err(BlockImportError::Error) + } else { + import_single_block( + import_handle, + blocks_origin.clone(), + block, + verifier.clone(), + ) + }; + let was_ok = import_result.is_ok(); + results.push((import_result, block_hash)); + if was_ok { + imported += 1; + } else { + has_error = true; + } + } + + (imported, count, results) +} + /// Single block import function. pub fn import_single_block>( import_handle: &BlockImport, @@ -909,12 +1082,19 @@ mod tests { )).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], - ))); + match worker_receiver.recv().unwrap() { + BlockImportWorkerMsg::ImportFinalityProof( + cwho, + chash, + 1, + cproof, + ) => { + assert_eq!(cwho, who); + assert_eq!(chash, Default::default()); + assert_eq!(cproof, vec![42]); + }, + _ => unreachable!("Unexpected work request received"), + } // Send ack of proof import from BlockImportWorker to BlockImporter result_sender.send(BlockImportWorkerMsg::ImportedFinalityProof( diff --git a/core/network/src/service.rs b/core/network/src/service.rs index b2e56a83bd..c8679c96f7 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -211,6 +211,14 @@ impl> Service { let (network_chan, network_port) = mpsc::unbounded(); let (protocol_sender, protocol_rx) = mpsc::unbounded(); let status_sinks = Arc::new(Mutex::new(Vec::new())); + + // connect the import-queue to the network service. + let link = NetworkLink { + protocol_sender: protocol_sender.clone(), + network_sender: network_chan.clone(), + }; + import_queue.start(Box::new(link))?; + // 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)); @@ -229,7 +237,7 @@ impl> Service { is_major_syncing.clone(), protocol, peers.clone(), - import_queue.clone(), + import_queue, params.transaction_pool, params.finality_proof_provider, network_port, @@ -244,22 +252,14 @@ impl> Service { status_sinks, is_offline, is_major_syncing, - network_chan: network_chan.clone(), + network_chan, peers, peerset, network, - protocol_sender: protocol_sender.clone(), + protocol_sender, bg_thread: Some(thread), }); - // connect the import-queue to the network service. - let link = NetworkLink { - protocol_sender, - network_sender: network_chan, - }; - - import_queue.start(Box::new(link))?; - Ok(service) } -- GitLab From 752a22247c03f75ce3cfbb2229821c972e04e54d Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 28 May 2019 15:07:55 +0200 Subject: [PATCH 031/140] Deprecate NetworkSpecialization::on_abort (#2697) --- core/network/src/specialization.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/core/network/src/specialization.rs b/core/network/src/specialization.rs index 58a63bb7a3..41d6c2edc8 100644 --- a/core/network/src/specialization.rs +++ b/core/network/src/specialization.rs @@ -35,6 +35,7 @@ pub trait NetworkSpecialization: Send + Sync + 'static { fn on_message(&mut self, ctx: &mut Context, who: PeerId, message: &mut Option>); /// Called on abort. + #[deprecated(note = "This method is never called; aborting corresponds to dropping the object")] fn on_abort(&mut self) { } /// Called periodically to maintain peers and handle timeouts. -- GitLab From 20f82748f40c95c4a9d0b188961abffe28729e07 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Tue, 28 May 2019 15:10:19 +0200 Subject: [PATCH 032/140] Update docs on `Imbalance` in the Balances module (#2704) * Update docs on `Imbalance` in the Balances module * Update lib.rs --- srml/balances/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 9fe93a9d4a..e205fa0aaa 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -51,7 +51,8 @@ //! deleted, then the account is said to be dead. //! - **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. +//! return an object of the `Imbalance` trait that can be managed within your runtime logic. (If an imbalance is +//! simply dropped, it should automatically maintain any book-keeping such as total issuance.) //! - **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 -- GitLab From 8412fef0585c8ec5cf3c0b1e019a2e74e309551e Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 28 May 2019 15:12:55 +0200 Subject: [PATCH 033/140] Make RocksDB optional in client-db (#2686) --- core/client/db/Cargo.toml | 7 +++---- core/client/db/src/lib.rs | 15 +++++++++++++-- core/client/db/src/light.rs | 16 +++++++++++++--- core/client/db/src/utils.rs | 2 ++ core/service/Cargo.toml | 2 +- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 3fea4fd812..77512ec269 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -9,8 +9,8 @@ parking_lot = "0.7.1" log = "0.4" kvdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } # FIXME replace with release as soon as our rocksdb changes are released upstream https://github.com/paritytech/parity-common/issues/88 -kvdb-rocksdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } -kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d", optional = true } +kvdb-rocksdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d", optional = true } +kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } lru-cache = "0.1.1" hash-db = { version = "0.12" } primitives = { package = "substrate-primitives", path = "../../primitives" } @@ -24,11 +24,10 @@ trie = { package = "substrate-trie", path = "../../trie" } consensus_common = { package = "substrate-consensus-common", path = "../../consensus/common" } [dev-dependencies] -kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } substrate-keyring = { path = "../../keyring" } test-client = { package = "substrate-test-client", path = "../../test-client" } env_logger = { version = "0.6" } [features] default = [] -test-helpers = ["kvdb-memorydb"] +test-helpers = [] diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index e9e9a61a76..82d570567b 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -54,7 +54,7 @@ use runtime_primitives::BuildStorage; use state_machine::backend::Backend as StateBackend; use executor::RuntimeInfo; use state_machine::{CodeExecutor, DBValue}; -use crate::utils::{Meta, db_err, meta_keys, open_database, read_db, block_id_to_lookup_key, read_meta}; +use crate::utils::{Meta, db_err, meta_keys, read_db, block_id_to_lookup_key, read_meta}; use client::leaves::{LeafSet, FinalizationDisplaced}; use client::children; use state_db::StateDb; @@ -572,8 +572,19 @@ impl> Backend { /// /// The pruning window is how old a block must be before the state is pruned. pub fn new(config: DatabaseSettings, canonicalization_delay: u64) -> Result { - let db = open_database(&config, columns::META, "full")?; + Self::new_inner(config, canonicalization_delay) + } + + #[cfg(feature = "kvdb-rocksdb")] + fn new_inner(config: DatabaseSettings, canonicalization_delay: u64) -> Result { + let db = crate::utils::open_database(&config, columns::META, "full")?; + Backend::from_kvdb(db as Arc<_>, config.pruning, canonicalization_delay, config.state_cache_size) + } + #[cfg(not(feature = "kvdb-rocksdb"))] + fn new_inner(config: DatabaseSettings, canonicalization_delay: u64) -> Result { + log::warn!("Running without the RocksDB feature. The database will NOT be saved."); + let db = Arc::new(kvdb_memorydb::create(crate::utils::NUM_COLUMNS)); Backend::from_kvdb(db as Arc<_>, config.pruning, canonicalization_delay, config.state_cache_size) } diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index cbac1b730e..e145e63cb7 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -38,8 +38,7 @@ use runtime_primitives::traits::{ }; use consensus_common::well_known_cache_keys; 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::utils::{self, meta_keys, Meta, db_err, read_db, block_id_to_lookup_key, read_meta}; use crate::DatabaseSettings; use log::{trace, warn, debug}; @@ -72,8 +71,19 @@ impl LightStorage { /// Create new storage with given settings. pub fn new(config: DatabaseSettings) -> ClientResult { - let db = open_database(&config, columns::META, "light")?; + Self::new_inner(config) + } + + #[cfg(feature = "kvdb-rocksdb")] + fn new_inner(config: DatabaseSettings) -> ClientResult { + let db = crate::utils::open_database(&config, columns::META, "light")?; + Self::from_kvdb(db as Arc<_>) + } + #[cfg(not(feature = "kvdb-rocksdb"))] + fn new_inner(_config: DatabaseSettings) -> ClientResult { + log::warn!("Running without the RocksDB feature. The database will NOT be saved."); + let db = Arc::new(kvdb_memorydb::create(crate::utils::NUM_COLUMNS)); Self::from_kvdb(db as Arc<_>) } diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index 43c559b349..846bf05f3c 100644 --- a/core/client/db/src/utils.rs +++ b/core/client/db/src/utils.rs @@ -22,6 +22,7 @@ use std::io; use std::convert::TryInto; use kvdb::{KeyValueDB, DBTransaction}; +#[cfg(feature = "kvdb-rocksdb")] use kvdb_rocksdb::{Database, DatabaseConfig}; use log::debug; @@ -195,6 +196,7 @@ pub fn db_err(err: io::Error) -> client::error::Error { } /// Open RocksDB database. +#[cfg(feature = "kvdb-rocksdb")] 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; diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index e27c2d61b3..bf13a51fac 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -24,7 +24,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } network = { package = "substrate-network", path = "../../core/network" } client = { package = "substrate-client", path = "../../core/client" } -client_db = { package = "substrate-client-db", path = "../../core/client/db" } +client_db = { package = "substrate-client-db", path = "../../core/client/db", features = ["kvdb-rocksdb"] } parity-codec = "3.3" substrate-executor = { path = "../../core/executor" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } -- GitLab From c21002acec970cd8d67006ca640eb05ed2289bd6 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 28 May 2019 16:50:36 +0200 Subject: [PATCH 034/140] The network configuration now makes more sense (#2706) * The network configuration now makes more sense * Reexport ProtocolConfig --- core/network/src/config.rs | 27 +++++++++------------------ core/network/src/protocol.rs | 17 ++++++++++++++++- core/network/src/service.rs | 19 +++++++------------ core/network/src/test/mod.rs | 4 ++-- core/service/src/lib.rs | 24 +++++++++++++----------- 5 files changed, 47 insertions(+), 44 deletions(-) diff --git a/core/network/src/config.rs b/core/network/src/config.rs index a2a34780bf..e6c1a4ddd5 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -16,9 +16,11 @@ //! Configuration for the networking layer of Substrate. -pub use network_libp2p::{NonReservedPeerMode, NetworkConfiguration, NodeKeyConfig, Secret}; +pub use crate::protocol::ProtocolConfig; +pub use network_libp2p::{NonReservedPeerMode, NetworkConfiguration, NodeKeyConfig, ProtocolId, Secret}; use bitflags::bitflags; +use consensus::import_queue::ImportQueue; use crate::chain::{Client, FinalityProofProvider}; use parity_codec; use crate::on_demand_layer::OnDemand; @@ -28,8 +30,8 @@ use std::sync::Arc; /// Service initialization parameters. pub struct Params { - /// Configuration. - pub config: ProtocolConfig, + /// Assigned roles for our node. + pub roles: Roles, /// Network layer configuration. pub network_config: NetworkConfiguration, /// Substrate relay chain access point. @@ -40,25 +42,14 @@ pub struct Params { pub on_demand: Option>>, /// Transaction pool. pub transaction_pool: Arc>, + /// Name of the protocol to use on the wire. Should be different for each chain. + pub protocol_id: ProtocolId, + /// Import queue to use. + pub import_queue: Box>, /// Protocol specialization. pub specialization: S, } -/// Configuration for the Substrate-specific part of the networking layer. -#[derive(Clone)] -pub struct ProtocolConfig { - /// Assigned roles. - pub roles: Roles, -} - -impl Default for ProtocolConfig { - fn default() -> ProtocolConfig { - ProtocolConfig { - roles: Roles::FULL, - } - } -} - bitflags! { /// Bitmask of the roles that a node fulfills. pub struct Roles: u8 { diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index b3102e588e..2fafc9e756 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -34,7 +34,7 @@ use crate::on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; use crate::specialization::NetworkSpecialization; use crate::sync::{ChainSync, Context as SyncContext, Status as SyncStatus, SyncState}; use crate::service::{TransactionPool, ExHashT}; -use crate::config::{ProtocolConfig, Roles}; +use crate::config::Roles; use rustc_hex::ToHex; use std::collections::{BTreeMap, HashMap}; use std::sync::Arc; @@ -273,6 +273,21 @@ struct ContextData { pub chain: Arc>, } +/// Configuration for the Substrate-specific part of the networking layer. +#[derive(Clone)] +pub struct ProtocolConfig { + /// Assigned roles. + pub roles: Roles, +} + +impl Default for ProtocolConfig { + fn default() -> ProtocolConfig { + ProtocolConfig { + roles: Roles::FULL, + } + } +} + impl, H: ExHashT> Protocol { /// Create a new instance. pub fn new( diff --git a/core/network/src/service.rs b/core/network/src/service.rs index c8679c96f7..805fb55ddb 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -22,9 +22,8 @@ use std::{io, thread, time::Duration}; 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}; use network_libp2p::{start_service, parse_str_addr, Service as NetworkService, ServiceEvent as NetworkServiceEvent}; -use network_libp2p::{RegisteredProtocol, NetworkState}; +use network_libp2p::{NetworkConfiguration, RegisteredProtocol, NetworkState}; use peerset::PeersetHandle; use consensus::import_queue::{ImportQueue, Link, SharedFinalityProofRequestBuilder}; use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; @@ -205,8 +204,6 @@ impl> Service { /// Creates and register protocol with the network service pub fn new( params: Params, - protocol_id: ProtocolId, - import_queue: Box>, ) -> Result>, Error> { let (network_chan, network_port) = mpsc::unbounded(); let (protocol_sender, protocol_rx) = mpsc::unbounded(); @@ -217,27 +214,27 @@ impl> Service { protocol_sender: protocol_sender.clone(), network_sender: network_chan.clone(), }; - import_queue.start(Box::new(link))?; + params.import_queue.start(Box::new(link))?; // 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 = Protocol::new( - params.config, + protocol::ProtocolConfig { roles: params.roles }, params.chain, params.on_demand.as_ref().map(|od| od.checker().clone()) .unwrap_or(Arc::new(AlwaysBadChecker)), params.specialization, )?; let versions: Vec<_> = ((protocol::MIN_VERSION as u8)..=(protocol::CURRENT_VERSION as u8)).collect(); - let registered = RegisteredProtocol::new(protocol_id, &versions); + let registered = RegisteredProtocol::new(params.protocol_id, &versions); let (thread, network, peerset) = start_thread( is_offline.clone(), is_major_syncing.clone(), protocol, peers.clone(), - import_queue, + params.import_queue, params.transaction_pool, params.finality_proof_provider, network_port, @@ -248,7 +245,7 @@ impl> Service { params.on_demand.and_then(|od| od.extract_receiver()), )?; - let service = Arc::new(Service { + Ok(Arc::new(Service { status_sinks, is_offline, is_major_syncing, @@ -258,9 +255,7 @@ impl> Service { network, protocol_sender, bg_thread: Some(thread), - }); - - Ok(service) + })) } /// Returns the downloaded bytes per second averaged over the past few seconds. diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 301f5653f1..9e2059fd61 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -31,7 +31,7 @@ use client::{self, ClientInfo, BlockchainEvents, FinalityNotifications}; use client::{in_mem::Backend as InMemoryBackend, error::Result as ClientResult}; use client::block_builder::BlockBuilder; use client::backend::AuxStore; -use crate::config::{ProtocolConfig, Roles}; +use crate::config::Roles; use consensus::import_queue::{BasicQueue, ImportQueue, IncomingBlock}; use consensus::import_queue::{ Link, SharedBlockImport, SharedJustificationImport, Verifier, SharedFinalityProofImport, @@ -45,7 +45,7 @@ use crate::message::Message; use network_libp2p::PeerId; use parking_lot::{Mutex, RwLock}; use primitives::{H256, sr25519::Public as AuthorityId, Blake2Hasher}; -use crate::protocol::{Context, Protocol, ProtocolStatus, CustomMessageOutcome, NetworkOut}; +use crate::protocol::{Context, Protocol, ProtocolConfig, 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}; diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 2a69dc83c7..d2b4a66c5b 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -177,16 +177,6 @@ impl Service { client: client.clone(), }); - let network_params = network::config::Params { - config: network::config::ProtocolConfig { roles: config.roles }, - network_config: config.network.clone(), - chain: client.clone(), - finality_proof_provider, - on_demand, - transaction_pool: transaction_pool_adapter.clone() as _, - specialization: network_protocol, - }; - let protocol_id = { let protocol_id_full = match config.chain_spec.protocol_id() { Some(pid) => pid, @@ -200,8 +190,20 @@ impl Service { network::ProtocolId::from(protocol_id_full) }; + let network_params = network::config::Params { + roles: config.roles, + network_config: config.network.clone(), + chain: client.clone(), + finality_proof_provider, + on_demand, + transaction_pool: transaction_pool_adapter.clone() as _, + import_queue, + protocol_id, + specialization: network_protocol, + }; + let has_bootnodes = !network_params.network_config.boot_nodes.is_empty(); - let network = network::Service::new(network_params, protocol_id, import_queue)?; + let network = network::Service::new(network_params)?; let inherents_pool = Arc::new(InherentsPool::default()); let offchain_workers = if config.offchain_worker { -- GitLab From ae37cb869c217c9a2167660509472f388281a5b6 Mon Sep 17 00:00:00 2001 From: Jordan Beauchamp Date: Wed, 29 May 2019 02:51:10 +1200 Subject: [PATCH 035/140] Pass through authority key with --dev (#2603) --- core/cli/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index e629788e80..c8df07ad1f 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -465,7 +465,7 @@ where config.keys.push(key); } - if cli.shared_params.dev { + if cli.shared_params.dev && cli.keyring.account.is_none() { config.keys.push("//Alice".into()); } -- GitLab From 2416e360ca5b51ac9d155dce1229213029ebd469 Mon Sep 17 00:00:00 2001 From: Luke Schoen Date: Wed, 29 May 2019 00:58:31 +1000 Subject: [PATCH 036/140] Fix typo in block_builder.rs (#2674) * Fix typo in block_builder.rs * Fix the typo fix again in block_builder.rs Co-Authored-By: Gavin Wood --- core/client/src/block_builder/block_builder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/client/src/block_builder/block_builder.rs b/core/client/src/block_builder/block_builder.rs index 4d40bed9b0..995b303699 100644 --- a/core/client/src/block_builder/block_builder.rs +++ b/core/client/src/block_builder/block_builder.rs @@ -52,7 +52,7 @@ where /// 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 + /// These recorded trie nodes can be used by a third party to prove the /// output of this block builder without having access to the full storage. pub fn at_block( block_id: &BlockId, -- GitLab From 1e580a5c090d630986cc64801862f22b5f1c1b52 Mon Sep 17 00:00:00 2001 From: Luke Schoen Date: Wed, 29 May 2019 00:59:09 +1000 Subject: [PATCH 037/140] docs: Try fix typo (#2677) --- core/sr-primitives/src/transaction_validity.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sr-primitives/src/transaction_validity.rs b/core/sr-primitives/src/transaction_validity.rs index d927bd74e4..29d2a82a24 100644 --- a/core/sr-primitives/src/transaction_validity.rs +++ b/core/sr-primitives/src/transaction_validity.rs @@ -51,7 +51,7 @@ pub enum TransactionValidity { /// /// 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 + /// Provided and required tags allow Substrate to build a dependency graph of transactions /// and import them in the right (linear) order. provides: Vec, /// Transaction longevity -- GitLab From 7e7185cefdaa38c6439655365cfda2eca7d7c8ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Tue, 28 May 2019 17:01:43 +0200 Subject: [PATCH 038/140] Transaction factory (#2481) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix typos * Add transaction factory `cargo run -- purge-chain -y --chain dev && cargo run -- --dev --transaction-factory 10` * Fix comment and remove build deps * Move crate to test-utils * Switch from flag to subcommand `cargo run -- factory --dev --num 5` * Decouple factory from node specifics * Introduce different manufacturing modes * Remove unrelated changes * Update Cargo.lock * Use SelectChain to fetch best block * Improve expect proof * Panic if factory executed with unsupported chain spec * Link ToDo comments to follow-up ticket * Address comments and improve style * Remove unused dependencies * Fix indent level * Replace naked unwrap * Update node/cli/src/factory_impl.rs * Fix typo * Use inherent_extrinsics instead of timestamp * Generalize factory and remove saturated conversions * Format imports * Make it clearer that database needs to be empty * Ensure factory settings * Apply suggestions from code review Co-Authored-By: Bastian Köcher * Update test-utils/transaction-factory/src/lib.rs Co-Authored-By: Bastian Köcher * Fix match guard syntax * Simplify import, remove empty line * Update node/cli/Cargo.toml * Update lockfile --- Cargo.lock | 20 ++ core/cli/src/lib.rs | 9 +- core/cli/src/traits.rs | 2 +- core/consensus/common/src/lib.rs | 2 +- core/inherents/src/lib.rs | 2 +- core/sr-primitives/src/generic/mod.rs | 2 +- node/cli/Cargo.toml | 7 + node/cli/src/factory_impl.rs | 259 ++++++++++++++++++ node/cli/src/lib.rs | 103 ++++++- test-utils/transaction-factory/Cargo.toml | 22 ++ .../transaction-factory/src/complex_mode.rs | 156 +++++++++++ test-utils/transaction-factory/src/lib.rs | 179 ++++++++++++ test-utils/transaction-factory/src/modes.rs | 41 +++ .../transaction-factory/src/simple_modes.rs | 106 +++++++ 14 files changed, 898 insertions(+), 12 deletions(-) create mode 100644 node/cli/src/factory_impl.rs create mode 100644 test-utils/transaction-factory/Cargo.toml create mode 100644 test-utils/transaction-factory/src/complex_mode.rs create mode 100644 test-utils/transaction-factory/src/lib.rs create mode 100644 test-utils/transaction-factory/src/modes.rs create mode 100644 test-utils/transaction-factory/src/simple_modes.rs diff --git a/Cargo.lock b/Cargo.lock index 5d32c8882b..ac6f721d81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2020,8 +2020,12 @@ dependencies = [ "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)", "sr-io 2.0.0", "sr-primitives 2.0.0", + "srml-finality-tracker 2.0.0", + "srml-indices 2.0.0", + "srml-timestamp 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", @@ -2029,6 +2033,7 @@ dependencies = [ "substrate-consensus-aura 2.0.0", "substrate-finality-grandpa 2.0.0", "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", @@ -2037,6 +2042,7 @@ dependencies = [ "substrate-telemetry 2.0.0", "substrate-transaction-pool 2.0.0", "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "transaction-factory 0.0.1", ] [[package]] @@ -4918,6 +4924,20 @@ name = "traitobject" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "transaction-factory" +version = "0.0.1" +dependencies = [ + "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", + "substrate-cli 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", +] + [[package]] name = "trie-bench" version = "0.12.2" diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index c8df07ad1f..101151ea0d 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -49,10 +49,10 @@ use structopt::{StructOpt, clap::AppSettings}; pub use structopt::clap::App; use params::{ RunCmd, PurgeChainCmd, RevertCmd, ImportBlocksCmd, ExportBlocksCmd, BuildSpecCmd, - NetworkConfigurationParams, SharedParams, MergeParameters, TransactionPoolParams, + NetworkConfigurationParams, MergeParameters, TransactionPoolParams, NodeKeyParams, NodeKeyType }; -pub use params::{NoCustom, CoreParams}; +pub use params::{NoCustom, CoreParams, SharedParams}; pub use traits::{GetLogFilter, AugmentClap}; use app_dirs::{AppInfo, AppDataType}; use log::info; @@ -178,7 +178,7 @@ fn is_node_name_valid(_name: &str) -> Result<(), &str> { /// /// `CC` is a custom subcommand. This needs to be an `enum`! If no custom subcommand is required, /// `NoCustom` can be used as type here. -/// `RP` is are custom parameters for the run command. This needs to be a `struct`! The custom +/// `RP` are custom parameters for the run command. This needs to be a `struct`! The custom /// parameters are visible to the user as if they were normal run command parameters. If no custom /// parameters are required, `NoCustom` can be used as type here. pub fn parse_and_execute<'a, F, CC, RP, S, RS, E, I, T>( @@ -582,7 +582,8 @@ where Ok(()) } -fn create_config_with_db_path( +/// Creates a configuration including the database path. +pub fn create_config_with_db_path( spec_factory: S, cli: &SharedParams, version: &VersionInfo, ) -> error::Result> where diff --git a/core/cli/src/traits.rs b/core/cli/src/traits.rs index ddb389e454..0f8d247e49 100644 --- a/core/cli/src/traits.rs +++ b/core/cli/src/traits.rs @@ -16,7 +16,7 @@ use structopt::{StructOpt, clap::App}; -/// Something that can augment a clapp app with further parameters. +/// Something that can augment a clap app with further parameters. /// `derive(StructOpt)` is implementing this function by default, so a macro `impl_augment_clap!` /// is provided to simplify the implementation of this trait. pub trait AugmentClap: StructOpt { diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index d28864a0cc..2d6c53d164 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -39,7 +39,7 @@ pub use inherents::InherentData; pub mod offline_tracker; pub mod error; -mod block_import; +pub mod block_import; mod select_chain; pub mod import_queue; pub mod evaluation; diff --git a/core/inherents/src/lib.rs b/core/inherents/src/lib.rs index 87fa39fe06..62b6f655cf 100644 --- a/core/inherents/src/lib.rs +++ b/core/inherents/src/lib.rs @@ -69,7 +69,7 @@ impl InherentData { /// /// # Return /// - /// Returns `Ok(())` if the data could be inserted an no data for an inherent with the same + /// Returns `Ok(())` if the data could be inserted and no data for an inherent with the same /// identifier existed, otherwise an error is returned. /// /// Inherent identifiers need to be unique, otherwise decoding of these values will not work! diff --git a/core/sr-primitives/src/generic/mod.rs b/core/sr-primitives/src/generic/mod.rs index b0f86f959f..3d7682407e 100644 --- a/core/sr-primitives/src/generic/mod.rs +++ b/core/sr-primitives/src/generic/mod.rs @@ -32,7 +32,7 @@ mod tests; pub use self::unchecked_extrinsic::UncheckedExtrinsic; pub use self::unchecked_mortal_extrinsic::UncheckedMortalExtrinsic; pub use self::unchecked_mortal_compact_extrinsic::UncheckedMortalCompactExtrinsic; -pub use self::era::Era; +pub use self::era::{Era, Phase}; pub use self::checked_extrinsic::CheckedExtrinsic; pub use self::header::Header; pub use self::block::{Block, SignedBlock, BlockId}; diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index 38cf49c35f..3c46f48f3f 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -30,6 +30,13 @@ sr-primitives = { path = "../../core/sr-primitives" } node-executor = { path = "../executor" } substrate-keystore = { path = "../../core/keystore" } substrate-telemetry = { package = "substrate-telemetry", path = "../../core/telemetry" } +structopt = "0.2" +transaction-factory = { path = "../../test-utils/transaction-factory" } +keyring = { package = "substrate-keyring", path = "../../core/keyring" } +indices = { package = "srml-indices", path = "../../srml/indices" } +timestamp = { package = "srml-timestamp", path = "../../srml/timestamp", default-features = false } +rand = "0.6" +finality_tracker = { package = "srml-finality-tracker", path = "../../srml/finality-tracker", default-features = false } [dev-dependencies] service-test = { package = "substrate-service-test", path = "../../core/service/test" } diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs new file mode 100644 index 0000000000..a2ac6f5b29 --- /dev/null +++ b/node/cli/src/factory_impl.rs @@ -0,0 +1,259 @@ +// 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 . + +//! Implementation of the transaction factory trait, which enables +//! using the cli to manufacture transactions and distribute them +//! to accounts. + +use rand::{Rng, SeedableRng}; +use rand::rngs::StdRng; + +use parity_codec::Decode; +use keyring::sr25519::Keyring; +use node_primitives::Hash; +use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, BalancesCall}; +use primitives::sr25519; +use primitives::crypto::Pair; +use parity_codec::Encode; +use sr_primitives::generic::Era; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT}; +use substrate_service::ServiceFactory; +use transaction_factory::RuntimeAdapter; +use transaction_factory::modes::Mode; +use crate::service; +use inherents::InherentData; +use timestamp; +use finality_tracker; + +// TODO get via api: >::minimum_period(). See #2587. +const MINIMUM_PERIOD: u64 = 99; + +pub struct FactoryState { + block_no: N, + + mode: Mode, + start_number: u64, + rounds: u64, + round: u64, + block_in_round: u64, + num: u64, +} + +type Number = <::Header as HeaderT>::Number; + +impl RuntimeAdapter for FactoryState { + type AccountId = node_primitives::AccountId; + type Balance = node_primitives::Balance; + type Block = node_primitives::Block; + type Phase = sr_primitives::generic::Phase; + type Secret = sr25519::Pair; + type Index = node_primitives::Index; + + type Number = Number; + + fn new( + mode: Mode, + num: u64, + rounds: u64, + ) -> FactoryState { + FactoryState { + mode, + num: num, + round: 0, + rounds, + block_in_round: 0, + block_no: 0, + start_number: 0, + } + } + + fn block_no(&self) -> Self::Number { + self.block_no + } + + fn block_in_round(&self) -> Self::Number { + self.block_in_round + } + + fn rounds(&self) -> Self::Number { + self.rounds + } + + fn num(&self) -> Self::Number { + self.num + } + + fn round(&self) -> Self::Number { + self.round + } + + fn start_number(&self) -> Self::Number { + self.start_number + } + + fn mode(&self) -> &Mode { + &self.mode + } + + fn set_block_no(&mut self, val: Self::Number) { + self.block_no = val; + } + + fn set_block_in_round(&mut self, val: Self::Number) { + self.block_in_round = val; + } + + fn set_round(&mut self, val: Self::Number) { + self.round = val; + } + + fn transfer_extrinsic( + &self, + sender: &Self::AccountId, + key: &Self::Secret, + destination: &Self::AccountId, + amount: &Self::Number, + prior_block_hash: &::Hash, + ) -> ::Extrinsic { + let index = self.extract_index(&sender, prior_block_hash); + let phase = self.extract_phase(*prior_block_hash); + + sign::(CheckedExtrinsic { + signed: Some((sender.clone(), index)), + function: Call::Balances( + BalancesCall::transfer( + indices::address::Address::Id( + destination.clone().into() + ), + (*amount).into() + ) + ) + }, key, &prior_block_hash, phase) + } + + fn inherent_extrinsics(&self) -> InherentData { + let timestamp = self.block_no * MINIMUM_PERIOD; + + let mut inherent = InherentData::new(); + inherent.put_data(timestamp::INHERENT_IDENTIFIER, ×tamp) + .expect("Failed putting timestamp inherent"); + inherent.put_data(finality_tracker::INHERENT_IDENTIFIER, &self.block_no) + .expect("Failed putting finalized number inherent"); + inherent + } + + fn minimum_balance() -> Self::Number { + // TODO get correct amount via api. See #2587. + 1337 + } + + fn master_account_id() -> Self::AccountId { + Keyring::Alice.pair().public() + } + + fn master_account_secret() -> Self::Secret { + Keyring::Alice.pair() + } + + /// Generates a random `AccountId` from `seed`. + fn gen_random_account_id(seed: &Self::Number) -> Self::AccountId { + let pair: sr25519::Pair = sr25519::Pair::from_seed(gen_seed_bytes(*seed)); + pair.public().into() + } + + /// Generates a random `Secret` from `seed`. + fn gen_random_account_secret(seed: &Self::Number) -> Self::Secret { + let pair: sr25519::Pair = sr25519::Pair::from_seed(gen_seed_bytes(*seed)); + pair + } + + fn extract_index( + &self, + _account_id: &Self::AccountId, + _block_hash: &::Hash, + ) -> Self::Index { + // TODO get correct index for account via api. See #2587. + // This currently prevents the factory from being used + // without a preceding purge of the database. + if self.mode == Mode::MasterToN || self.mode == Mode::MasterTo1 { + self.block_no() + } else { + match self.round() { + 0 => + // if round is 0 all transactions will be done with master as a sender + self.block_no(), + _ => + // if round is e.g. 1 every sender account will be new and not yet have + // any transactions done + 0 + } + } + } + + fn extract_phase( + &self, + _block_hash: ::Hash + ) -> Self::Phase { + // TODO get correct phase via api. See #2587. + // This currently prevents the factory from being used + // without a preceding purge of the database. + self.block_no + } +} + +fn gen_seed_bytes(seed: u64) -> [u8; 32] { + let mut rng: StdRng = SeedableRng::seed_from_u64(seed); + + let mut seed_bytes = [0u8; 32]; + for i in 0..32 { + seed_bytes[i] = rng.gen::(); + } + seed_bytes +} + +/// Creates an `UncheckedExtrinsic` containing the appropriate signature for +/// a `CheckedExtrinsics`. +fn sign( + xt: CheckedExtrinsic, + key: &sr25519::Pair, + prior_block_hash: &Hash, + phase: u64, +) -> ::Extrinsic { + let s = match xt.signed { + Some((signed, index)) => { + let era = Era::mortal(256, phase); + let payload = (index.into(), xt.function, era, prior_block_hash); + let signature = payload.using_encoded(|b| { + if b.len() > 256 { + key.sign(&sr_io::blake2_256(b)) + } else { + key.sign(b) + } + }).into(); + UncheckedExtrinsic { + signature: Some((indices::address::Address::Id(signed), signature, payload.0, era)), + function: payload.1, + } + } + None => UncheckedExtrinsic { + signature: None, + function: xt.function, + }, + }; + + let e = Encode::encode(&s); + Decode::decode(&mut &e[..]).expect("Failed to decode signed unchecked extrinsic") +} diff --git a/node/cli/src/lib.rs b/node/cli/src/lib.rs index 886c6eef77..ab1fd03ae7 100644 --- a/node/cli/src/lib.rs +++ b/node/cli/src/lib.rs @@ -22,16 +22,21 @@ pub use cli::error; pub mod chain_spec; mod service; +mod factory_impl; use tokio::prelude::Future; use tokio::runtime::{Builder as RuntimeBuilder, Runtime}; -pub use cli::{VersionInfo, IntoExit, NoCustom}; +pub use cli::{VersionInfo, IntoExit, NoCustom, SharedParams}; use substrate_service::{ServiceFactory, Roles as ServiceRoles}; use std::ops::Deref; use log::info; +use structopt::{StructOpt, clap::App}; +use cli::{AugmentClap, GetLogFilter}; +use crate::factory_impl::FactoryState; +use transaction_factory::RuntimeAdapter; /// The chain specification option. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub enum ChainSpec { /// Whatever the current runtime is, with just Alice as an auth. Development, @@ -43,6 +48,68 @@ pub enum ChainSpec { StagingTestnet, } +/// Custom subcommands. +#[derive(Clone, Debug, StructOpt)] +pub enum CustomSubcommands { + /// The custom factory subcommmand for manufacturing transactions. + #[structopt( + name = "factory", + about = "Manufactures num transactions from Alice to random accounts. \ + Only supported for development or local testnet." + )] + Factory(FactoryCmd), +} + +impl GetLogFilter for CustomSubcommands { + fn get_log_filter(&self) -> Option { + None + } +} + +/// The `factory` command used to generate transactions. +/// Please note: this command currently only works on an empty database! +#[derive(Debug, StructOpt, Clone)] +pub struct FactoryCmd { + /// How often to repeat. This option only has an effect in mode `MasterToNToM`. + #[structopt(long="rounds", default_value = "1")] + pub rounds: u64, + + /// MasterToN: Manufacture `num` transactions from the master account + /// to `num` randomly created accounts, one each. + /// + /// MasterTo1: Manufacture `num` transactions from the master account + /// to exactly one other randomly created account. + /// + /// MasterToNToM: Manufacture `num` transactions from the master account + /// to `num` randomly created accounts. + /// From each of these randomly created accounts manufacture + /// a transaction to another randomly created account. + /// Repeat this `rounds` times. If `rounds` = 1 the behavior + /// is the same as `MasterToN`.{n} + /// A -> B, A -> C, A -> D, ... x `num`{n} + /// B -> E, C -> F, D -> G, ...{n} + /// ... x `rounds` + /// + /// These three modes control manufacturing. + #[structopt(long="mode", default_value = "MasterToN")] + pub mode: transaction_factory::Mode, + + /// Number of transactions to generate. In mode `MasterNToNToM` this is + /// the number of transactions per round. + #[structopt(long="num", default_value = "8")] + pub num: u64, + + #[allow(missing_docs)] + #[structopt(flatten)] + pub shared_params: SharedParams, +} + +impl AugmentClap for FactoryCmd { + fn augment_clap<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { + FactoryCmd::augment_clap(app) + } +} + /// Get a chain config from a spec setting. impl ChainSpec { pub(crate) fn load(self) -> Result { @@ -78,7 +145,7 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul T: Into + Clone, E: IntoExit, { - cli::parse_and_execute::( + let ret = cli::parse_and_execute::( load_spec, &version, "substrate-node", args, exit, |exit, _cli_args, _custom_args, config| { info!("{}", version.name); @@ -103,7 +170,35 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul ), }.map_err(|e| format!("{:?}", e)) } - ).map_err(Into::into).map(|_| ()) + ); + + match &ret { + Ok(Some(CustomSubcommands::Factory(cli_args))) => { + let config = cli::create_config_with_db_path::( + load_spec, + &cli_args.shared_params, + &version, + )?; + + match ChainSpec::from(config.chain_spec.id()) { + Some(ref c) if c == &ChainSpec::Development || c == &ChainSpec::LocalTestnet => {}, + _ => panic!("Factory is only supported for development and local testnet."), + } + + let factory_state = FactoryState::new( + cli_args.mode.clone(), + cli_args.num, + cli_args.rounds, + ); + transaction_factory::factory::>( + factory_state, + config, + ).map_err(|e| format!("Error in transaction factory: {}", e))?; + + Ok(()) + }, + _ => ret.map_err(Into::into).map(|_| ()) + } } fn run_until_exit( diff --git a/test-utils/transaction-factory/Cargo.toml b/test-utils/transaction-factory/Cargo.toml new file mode 100644 index 0000000000..66faaf6b34 --- /dev/null +++ b/test-utils/transaction-factory/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "transaction-factory" +version = "0.0.1" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +cli = { package = "substrate-cli", path = "../../core/cli" } +client = { package = "substrate-client", path = "../../core/client" } +consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } +log = "0.4" +parity-codec = { version = "3.3", default-features = false, features = ["derive"] } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } +sr_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +substrate-service = { path = "../../core/service" } + +[features] +default = ["std"] +std = [ + "parity-codec/std", + "primitives/std", +] diff --git a/test-utils/transaction-factory/src/complex_mode.rs b/test-utils/transaction-factory/src/complex_mode.rs new file mode 100644 index 0000000000..6200affaea --- /dev/null +++ b/test-utils/transaction-factory/src/complex_mode.rs @@ -0,0 +1,156 @@ +// 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 . + +/// This module implements the `MasterToNToM` mode: +/// +/// Manufacture `num` transactions from the master account to `num` +/// randomly created accounts. From each of these randomly created +/// accounts manufacture a transaction to another randomly created +/// account. +/// Repeat this round `rounds` times. If `rounds` = 1 the behavior +/// is the same as `MasterToN`. +/// +/// A -> B +/// A -> C +/// A -> D +/// ... x `num` +/// +/// B -> E +/// C -> F +/// D -> G +/// ... +/// E -> H +/// F -> I +/// G -> J +/// ... +/// ... x `rounds` + +use std::sync::Arc; + +use log::info; +use client::block_builder::api::BlockBuilder; +use client::runtime_api::ConstructRuntimeApi; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{Block as BlockT, ProvideRuntimeApi, One, Zero}; +use substrate_service::{ + FactoryBlock, FullClient, ServiceFactory, ComponentClient, FullComponents +}; + +use crate::{RuntimeAdapter, create_block}; + +pub fn next( + factory_state: &mut RA, + client: &Arc>>, + prior_block_hash: ::Hash, + prior_block_id: BlockId, +) -> Option<::Block> +where + F: ServiceFactory, + F::RuntimeApi: ConstructRuntimeApi, FullClient>, + FullClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilder>, + RA: RuntimeAdapter, +{ + let total = factory_state.start_number() + factory_state.num() * factory_state.rounds(); + + if factory_state.block_no() >= total || factory_state.round() >= factory_state.rounds() { + return None; + } + + info!( + "Round {}: Creating {} transactions in total, {} per round. {} rounds in total.", + factory_state.round() + RA::Number::one(), + factory_state.num() * factory_state.rounds(), + factory_state.num(), + factory_state.rounds(), + ); + + let from = from::(factory_state); + + let seed = factory_state.start_number() + factory_state.block_no(); + let to = RA::gen_random_account_id(&seed); + + let mut amount; + if factory_state.round() == RA::Number::zero() { + amount = RA::minimum_balance() * factory_state.rounds(); + } else { + let rounds_left = factory_state.rounds() - factory_state.round(); + amount = RA::minimum_balance() * rounds_left; + }; + + let transfer = factory_state.transfer_extrinsic( + &from.0, + &from.1, + &to, + &amount, + &prior_block_hash, + ); + + let inherents = factory_state.inherent_extrinsics(); + let inherents = client.runtime_api().inherent_extrinsics(&prior_block_id, inherents) + .expect("Failed to create inherent extrinsics"); + + let block = create_block::(&client, transfer, inherents); + info!( + "Created block {} with hash {}. Transferring {} from {} to {}.", + factory_state.block_no() + RA::Number::one(), + prior_block_hash, + amount, + from.0, + to + ); + + factory_state.set_block_no(factory_state.block_no() + RA::Number::one()); + + let new_round = factory_state.block_no() > RA::Number::zero() + && factory_state.block_no() % factory_state.num() == RA::Number::zero(); + if new_round { + factory_state.set_round(factory_state.round() + RA::Number::one()); + factory_state.set_block_in_round(RA::Number::zero()); + } else { + factory_state.set_block_in_round(factory_state.block_in_round() + RA::Number::one()); + } + + Some(block) +} + +/// Return the account which received tokens at this point in the previous round. +fn from( + factory_state: &mut RA +) -> (::AccountId, ::Secret) +where RA: RuntimeAdapter +{ + let is_first_round = factory_state.round() == RA::Number::zero(); + match is_first_round { + true => { + // first round always uses master account + (RA::master_account_id(), RA::master_account_secret()) + }, + _ => { + // the account to which was sent in the last round + let is_round_one = factory_state.round() == RA::Number::one(); + let seed = match is_round_one { + true => factory_state.start_number() + factory_state.block_in_round(), + _ => { + let block_no_in_prior_round = + factory_state.num() * (factory_state.round() - RA::Number::one()) + factory_state.block_in_round(); + factory_state.start_number() + block_no_in_prior_round + } + }; + (RA::gen_random_account_id(&seed), RA::gen_random_account_secret(&seed)) + }, + } +} diff --git a/test-utils/transaction-factory/src/lib.rs b/test-utils/transaction-factory/src/lib.rs new file mode 100644 index 0000000000..02772daf18 --- /dev/null +++ b/test-utils/transaction-factory/src/lib.rs @@ -0,0 +1,179 @@ +// 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 . + +//! Simple transaction factory which distributes tokens from a master +//! account to a specified number of newly created accounts. +//! +//! The factory currently only works on an empty database! + +use std::collections::HashMap; +use std::sync::Arc; +use std::ops::Mul; +use std::cmp::PartialOrd; +use std::fmt::Display; + +use log::info; + +use client::block_builder::api::BlockBuilder; +use client::runtime_api::ConstructRuntimeApi; +use consensus_common::{ + BlockOrigin, ImportBlock, InherentData, ForkChoiceStrategy, + SelectChain +}; +use consensus_common::block_import::BlockImport; +use parity_codec::{Decode, Encode}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ + Block as BlockT, Header as HeaderT, ProvideRuntimeApi, SimpleArithmetic, + One, Zero, +}; +use substrate_service::{ + FactoryBlock, FactoryFullConfiguration, FullClient, new_client, + ServiceFactory, ComponentClient, FullComponents}; +pub use crate::modes::Mode; + +pub mod modes; +mod complex_mode; +mod simple_modes; + +pub trait RuntimeAdapter { + type AccountId: Display; + type Balance: Display + Mul; + type Block: BlockT; + type Index: Copy; + type Number: Display + PartialOrd + SimpleArithmetic + Zero + One; + type Phase: Copy; + type Secret; + + fn new(mode: Mode, rounds: u64, start_number: u64) -> Self; + + fn block_no(&self) -> Self::Number; + fn block_in_round(&self) -> Self::Number; + fn mode(&self) -> &Mode; + fn num(&self) -> Self::Number; + fn rounds(&self) -> Self::Number; + fn round(&self) -> Self::Number; + fn start_number(&self) -> Self::Number; + + fn set_block_in_round(&mut self, val: Self::Number); + fn set_block_no(&mut self, val: Self::Number); + fn set_round(&mut self, val: Self::Number); + + fn transfer_extrinsic( + &self, + sender: &Self::AccountId, + key: &Self::Secret, + destination: &Self::AccountId, + amount: &Self::Number, + prior_block_hash: &::Hash, + ) -> ::Extrinsic; + + fn inherent_extrinsics(&self) -> InherentData; + + fn minimum_balance() -> Self::Number; + fn master_account_id() -> Self::AccountId; + fn master_account_secret() -> Self::Secret; + fn extract_index(&self, account_id: &Self::AccountId, block_hash: &::Hash) -> Self::Index; + fn extract_phase(&self, block_hash: ::Hash) -> Self::Phase; + fn gen_random_account_id(seed: &Self::Number) -> Self::AccountId; + fn gen_random_account_secret(seed: &Self::Number) -> Self::Secret; +} + +/// Manufactures transactions. The exact amount depends on +/// `mode`, `num` and `rounds`. +pub fn factory( + mut factory_state: RA, + mut config: FactoryFullConfiguration, +) -> cli::error::Result<()> +where + F: ServiceFactory, + F::RuntimeApi: ConstructRuntimeApi, FullClient>, + FullClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilder>, + RA: RuntimeAdapter, + <::Block as BlockT>::Hash: From, +{ + if *factory_state.mode() != Mode::MasterToNToM && factory_state.rounds() > RA::Number::one() { + return Err("The factory can only be used with rounds set to 1 in this mode.".into()); + } + + let client = new_client::(&config)?; + + let select_chain = F::build_select_chain(&mut config, client.clone())?; + + let best_header: Result<::Header, cli::error::Error> = + select_chain.best_chain().map_err(|e| format!("{:?}", e).into()); + let mut best_hash = best_header?.hash(); + let best_block_id = BlockId::::hash(best_hash); + + while let Some(block) = match factory_state.mode() { + Mode::MasterToNToM => + complex_mode::next::(&mut factory_state, &client, best_hash.into(), best_block_id), + _ => + simple_modes::next::(&mut factory_state, &client, best_hash.into(), best_block_id) + } { + best_hash = block.header().hash(); + import_block::(&client, block); + + info!("Imported block at {}", factory_state.block_no()); + } + + Ok(()) +} + +/// Create a baked block from a transfer extrinsic and timestamp inherent. +pub fn create_block( + client: &Arc>>, + transfer: ::Extrinsic, + inherent_extrinsics: Vec<::Extrinsic>, +) -> ::Block +where + F: ServiceFactory, + FullClient: ProvideRuntimeApi, + F::RuntimeApi: ConstructRuntimeApi, FullClient>, + as ProvideRuntimeApi>::Api: BlockBuilder>, + RA: RuntimeAdapter, +{ + let mut block = client.new_block().expect("Failed to create new block"); + block.push( + Decode::decode(&mut &transfer.encode()[..]) + .expect("Failed to decode transfer extrinsic") + ).expect("Failed to push transfer extrinsic into block"); + + for inherent in inherent_extrinsics { + block.push(inherent).expect("Failed ..."); + } + + block.bake().expect("Failed to bake block") +} + +fn import_block( + client: &Arc>>, + block: ::Block +) -> () where F: ServiceFactory +{ + let import = ImportBlock { + origin: BlockOrigin::File, + header: block.header().clone(), + post_digests: Vec::new(), + body: Some(block.extrinsics().to_vec()), + finalized: false, + justification: None, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + client.import_block(import, HashMap::new()).expect("Failed to import block"); +} diff --git a/test-utils/transaction-factory/src/modes.rs b/test-utils/transaction-factory/src/modes.rs new file mode 100644 index 0000000000..f3d278bbbf --- /dev/null +++ b/test-utils/transaction-factory/src/modes.rs @@ -0,0 +1,41 @@ +// 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 . + +//! The transaction factory can operate in different modes. See +//! the `simple_mode` and `complex_mode` modules for details. + +use std::str::FromStr; + +/// Token distribution modes. +#[derive(Debug, Clone, PartialEq)] +pub enum Mode { + MasterToN, + MasterTo1, + MasterToNToM +} + +impl FromStr for Mode { + type Err = String; + fn from_str(mode: &str) -> Result { + match mode { + "MasterToN" => Ok(Mode::MasterToN), + "MasterTo1" => Ok(Mode::MasterTo1), + "MasterToNToM" => Ok(Mode::MasterToNToM), + _ => Err(format!("Invalid mode: {}", mode)), + } + } +} + diff --git a/test-utils/transaction-factory/src/simple_modes.rs b/test-utils/transaction-factory/src/simple_modes.rs new file mode 100644 index 0000000000..4ce7b47e6f --- /dev/null +++ b/test-utils/transaction-factory/src/simple_modes.rs @@ -0,0 +1,106 @@ +// 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 . + +/// This module implements two manufacturing modes: +/// +/// # MasterToN +/// Manufacture `num` transactions from the master account +/// to `num` randomly created accounts, one each. +/// +/// A -> B +/// A -> C +/// ... x `num` +/// +/// +/// # MasterTo1 +/// Manufacture `num` transactions from the master account +/// to exactly one other randomly created account. +/// +/// A -> B +/// A -> B +/// ... x `num` + +use std::sync::Arc; + +use log::info; +use client::block_builder::api::BlockBuilder; +use client::runtime_api::ConstructRuntimeApi; +use sr_primitives::traits::{Block as BlockT, ProvideRuntimeApi, One}; +use sr_primitives::generic::BlockId; +use substrate_service::{ + FactoryBlock, FullClient, ServiceFactory, ComponentClient, FullComponents +}; + +use crate::{Mode, RuntimeAdapter, create_block}; + +pub fn next( + factory_state: &mut RA, + client: &Arc>>, + prior_block_hash: ::Hash, + prior_block_id: BlockId, +) -> Option<::Block> +where + F: ServiceFactory, + F::RuntimeApi: ConstructRuntimeApi, FullClient>, + FullClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilder>, + RA: RuntimeAdapter, +{ + if factory_state.block_no() >= factory_state.num() { + return None; + } + + let from = (RA::master_account_id(), RA::master_account_secret()); + + let seed = match factory_state.mode() { + // choose the same receiver for all transactions + Mode::MasterTo1 => factory_state.start_number(), + + // different receiver for each transaction + Mode::MasterToN => factory_state.start_number() + factory_state.block_no(), + _ => unreachable!("Mode not covered!"), + }; + let to = RA::gen_random_account_id(&seed); + + let amount = RA::minimum_balance(); + + let transfer = factory_state.transfer_extrinsic( + &from.0, + &from.1, + &to, + &amount, + &prior_block_hash, + ); + + let inherents = RA::inherent_extrinsics(&factory_state); + let inherents = client.runtime_api().inherent_extrinsics(&prior_block_id, inherents) + .expect("Failed to create inherent extrinsics"); + + let block = create_block::(&client, transfer, inherents); + + factory_state.set_block_no(factory_state.block_no() + RA::Number::one()); + + info!( + "Created block {} with hash {}. Transferring {} from {} to {}.", + factory_state.block_no(), + prior_block_hash, + amount, + from.0, + to + ); + + Some(block) +} -- GitLab From f29c764b704d988daf1a4dd4eacb7d94d052b84d Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 28 May 2019 17:13:54 +0200 Subject: [PATCH 039/140] Split the send_request method in multiple requests (#2696) --- core/network/src/on_demand.rs | 155 +++++++++++++++++++++++----------- core/network/src/protocol.rs | 98 ++++++++++++++++++++- 2 files changed, 204 insertions(+), 49 deletions(-) diff --git a/core/network/src/on_demand.rs b/core/network/src/on_demand.rs index f77b50dac6..9ce75c4749 100644 --- a/core/network/src/on_demand.rs +++ b/core/network/src/on_demand.rs @@ -26,7 +26,7 @@ use client::error::Error as ClientError; use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof, RemoteReadChildRequest, RemoteBodyRequest}; -use crate::message; +use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; use network_libp2p::PeerId; use crate::config::Roles; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; @@ -46,8 +46,55 @@ pub trait OnDemandNetwork { /// Disconnect from the given peer. Used in case of misbehaviour. fn disconnect_peer(&mut self, who: &PeerId); - /// Send a request to a peer. - fn send_request(&mut self, who: &PeerId, message: message::Message); + /// Send to `who` a request for a header. + fn send_header_request(&mut self, who: &PeerId, id: RequestId, block: <::Header as HeaderT>::Number); + + /// Send to `who` a read request. + fn send_read_request(&mut self, who: &PeerId, id: RequestId, block: ::Hash, key: Vec); + + /// Send to `who` a child read request. + fn send_read_child_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + storage_key: Vec, + key: Vec + ); + + /// Send to `who` a call request. + fn send_call_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + method: String, + data: Vec + ); + + /// Send to `who` a changes request. + fn send_changes_request( + &mut self, + who: &PeerId, + id: RequestId, + first: ::Hash, + last: ::Hash, + min: ::Hash, + max: ::Hash, + key: Vec + ); + + /// Send to `who` a body request. + fn send_body_request( + &mut self, + who: &PeerId, + id: RequestId, + fields: BlockAttributes, + from: FromBlock<::Hash, <::Header as HeaderT>::Number>, + to: Option, + direction: Direction, + max: Option + ); } /// On-demand requests service. Dispatches requests to appropriate peers. @@ -495,7 +542,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); - network.send_request(&peer, request.message()); + request.send_to(&mut network, &peer); self.active_peers.insert(peer, request); } @@ -515,53 +562,57 @@ impl Request { } } - fn message(&self) -> message::Message { + fn send_to(&self, out: &mut impl OnDemandNetwork, peer: &PeerId) { match self.data { RequestData::RemoteHeader(ref data, _) => - message::generic::Message::RemoteHeaderRequest(message::RemoteHeaderRequest { - id: self.id, - block: data.block, - }), + out.send_header_request( + peer, + self.id, + data.block, + ), RequestData::RemoteRead(ref data, _) => - message::generic::Message::RemoteReadRequest(message::RemoteReadRequest { - id: self.id, - block: data.block, - key: data.key.clone(), - }), + out.send_read_request( + peer, + self.id, + data.block, + 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(), - }), + out.send_read_child_request( + peer, + self.id, + data.block, + data.storage_key.clone(), + data.key.clone(), + ), RequestData::RemoteCall(ref data, _) => - message::generic::Message::RemoteCallRequest(message::RemoteCallRequest { - id: self.id, - block: data.block, - method: data.method.clone(), - data: data.call_data.clone(), - }), + out.send_call_request( + peer, + self.id, + data.block, + data.method.clone(), + data.call_data.clone(), + ), RequestData::RemoteChanges(ref data, _) => - message::generic::Message::RemoteChangesRequest(message::RemoteChangesRequest { - id: self.id, - first: data.first_block.1.clone(), - last: data.last_block.1.clone(), - min: data.tries_roots.1.clone(), - 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), - }) - } + out.send_changes_request( + peer, + self.id, + data.first_block.1.clone(), + data.last_block.1.clone(), + data.tries_roots.1.clone(), + data.max_block.1.clone(), + data.key.clone(), + ), + RequestData::RemoteBody(ref data, _) => + out.send_body_request( + peer, + self.id, + message::BlockAttributes::BODY, + message::FromBlock::Hash(data.header.hash()), + None, + message::Direction::Ascending, + Some(1) + ), } } } @@ -586,13 +637,13 @@ pub mod tests { use std::sync::Arc; use std::time::Instant; use futures::{Future, sync::oneshot}; - use runtime_primitives::traits::{Block as BlockT, NumberFor}; + use runtime_primitives::traits::{Block as BlockT, NumberFor, Header as HeaderT}; 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 crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; use network_libp2p::PeerId; use super::{REQUEST_TIMEOUT, OnDemandCore, OnDemandNetwork, RequestData}; use test_client::runtime::{changes_trie_config, Block, Extrinsic, Header}; @@ -700,7 +751,15 @@ pub mod tests { fn disconnect_peer(&mut self, who: &PeerId) { self.disconnected_peers.insert(who.clone()); } - fn send_request(&mut self, _: &PeerId, _: message::Message) {} + fn send_header_request(&mut self, _: &PeerId, _: RequestId, _: <::Header as HeaderT>::Number) {} + fn send_read_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: Vec) {} + fn send_read_child_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: Vec, + _: Vec) {} + fn send_call_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: String, _: Vec) {} + fn send_changes_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: ::Hash, + _: ::Hash, _: ::Hash, _: Vec) {} + fn send_body_request(&mut self, _: &PeerId, _: RequestId, _: BlockAttributes, _: FromBlock<::Hash, + <::Header as HeaderT>::Number>, _: Option, _: Direction, _: Option) {} } fn assert_disconnected_peer(dummy: &DummyNetwork) { diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 2fafc9e756..d0b14bada7 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -28,6 +28,7 @@ use crate::message::{ self, BlockRequest as BlockRequestMessage, FinalityProofRequest as FinalityProofRequestMessage, Message, }; +use crate::message::{BlockAttributes, Direction, FromBlock, RequestId}; use crate::message::generic::{Message as GenericMessage, ConsensusMessage}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; use crate::on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; @@ -169,7 +170,102 @@ impl<'a, 'b, B: BlockT> OnDemandNetwork for &'a mut &'b mut dyn NetworkOut NetworkOut::disconnect_peer(**self, who.clone()) } - fn send_request(&mut self, who: &PeerId, message: Message) { + fn send_header_request(&mut self, who: &PeerId, id: RequestId, block: <::Header as HeaderT>::Number) { + let message = message::generic::Message::RemoteHeaderRequest(message::RemoteHeaderRequest { + id, + block, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_read_request(&mut self, who: &PeerId, id: RequestId, block: ::Hash, key: Vec) { + let message = message::generic::Message::RemoteReadRequest(message::RemoteReadRequest { + id, + block, + key, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_read_child_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + storage_key: Vec, + key: Vec + ) { + let message = message::generic::Message::RemoteReadChildRequest(message::RemoteReadChildRequest { + id, + block, + storage_key, + key, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_call_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + method: String, + data: Vec + ) { + let message = message::generic::Message::RemoteCallRequest(message::RemoteCallRequest { + id, + block, + method, + data, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_changes_request( + &mut self, + who: &PeerId, + id: RequestId, + first: ::Hash, + last: ::Hash, + min: ::Hash, + max: ::Hash, + key: Vec + ) { + let message = message::generic::Message::RemoteChangesRequest(message::RemoteChangesRequest { + id, + first, + last, + min, + max, + key, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_body_request( + &mut self, + who: &PeerId, + id: RequestId, + fields: BlockAttributes, + from: FromBlock<::Hash, <::Header as HeaderT>::Number>, + to: Option<::Hash>, + direction: Direction, + max: Option + ) { + let message = message::generic::Message::BlockRequest(message::BlockRequest:: { + id, + fields, + from, + to, + direction, + max, + }); + NetworkOut::send_message(**self, who.clone(), message) } } -- GitLab From 8037b2528121fda8ad338cb343fed8b491d9e674 Mon Sep 17 00:00:00 2001 From: Stanislav Tkach Date: Tue, 28 May 2019 18:14:48 +0300 Subject: [PATCH 040/140] Use $crate inside of native_executor_instance and parameter_types macros (#2702) * Use inside of native_executor_instance macro * Same for the parameter_types macro --- core/executor/src/native_executor.rs | 2 +- srml/support/src/traits.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index 0a6f50d001..729346cbee 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -272,7 +272,7 @@ macro_rules! native_executor_instance { ( $pub:vis $name:ident, $dispatcher:path, $version:path, $code:expr) => { /// A unit struct which implements `NativeExecutionDispatch` feeding in the hard-coded runtime. $pub struct $name; - native_executor_instance!(IMPL $name, $dispatcher, $version, $code); + $crate::native_executor_instance!(IMPL $name, $dispatcher, $version, $code); }; (IMPL $name:ident, $dispatcher:path, $version:path, $code:expr) => { impl $crate::NativeExecutionDispatch for $name { diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index a8db5a946e..dd4398844c 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -47,13 +47,13 @@ pub trait Get { 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 )* } + $crate::parameter_types!{IMPL $name , $type , $value} + $crate::parameter_types!{ $( $rest )* } ); (const $name:ident: $type:ty = $value:expr; $( $rest:tt )*) => ( struct $name; - parameter_types!{IMPL $name , $type , $value} - parameter_types!{ $( $rest )* } + $crate::parameter_types!{IMPL $name , $type , $value} + $crate::parameter_types!{ $( $rest )* } ); () => (); (IMPL $name:ident , $type:ty , $value:expr) => { -- GitLab From 76e03c7df457982295782f62eaee12c9d5a07dbf Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 28 May 2019 18:01:20 +0200 Subject: [PATCH 041/140] Fix compilation (#2708) --- test-utils/transaction-factory/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test-utils/transaction-factory/src/lib.rs b/test-utils/transaction-factory/src/lib.rs index 02772daf18..b046cf74c9 100644 --- a/test-utils/transaction-factory/src/lib.rs +++ b/test-utils/transaction-factory/src/lib.rs @@ -107,7 +107,8 @@ where <::Block as BlockT>::Hash: From, { if *factory_state.mode() != Mode::MasterToNToM && factory_state.rounds() > RA::Number::one() { - return Err("The factory can only be used with rounds set to 1 in this mode.".into()); + let msg = "The factory can only be used with rounds set to 1 in this mode.".into(); + return Err(cli::error::Error::Input(msg)); } let client = new_client::(&config)?; -- GitLab From b003878652dc0102137438bc5f802b34d31d6fdb Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 29 May 2019 11:58:02 +0200 Subject: [PATCH 042/140] Rewrite sync and network layers to use futures (#2683) * Remove background thread from network * Primarily use tokio-timer instead of tokio * Minor style fix * Reintroduce tokio as an optional dependency * Renames * Line width * Ctxt -> Context * Merge NetworkWorker and NetworkService --- Cargo.lock | 17 +- .../finality-grandpa/src/communication/mod.rs | 2 +- core/network/Cargo.toml | 6 +- core/network/src/lib.rs | 4 +- core/network/src/protocol.rs | 8 +- core/network/src/service.rs | 327 ++++++++---------- core/service/src/components.rs | 3 +- core/service/src/lib.rs | 8 +- 8 files changed, 171 insertions(+), 204 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac6f721d81..32bcf235ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -57,7 +57,7 @@ dependencies = [ "parking_lot 0.5.5 (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)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1180,7 +1180,7 @@ dependencies = [ "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.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-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4012,7 +4012,7 @@ dependencies = [ "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)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4180,6 +4180,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-test-client 2.0.0", "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4206,7 +4207,7 @@ dependencies = [ "tempdir 0.3.7 (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)", + "tokio-timer 0.2.11 (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)", @@ -4722,7 +4723,7 @@ dependencies = [ "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.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-timer 0.2.11 (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)", @@ -4845,7 +4846,7 @@ dependencies = [ [[package]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" 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)", @@ -5272,7 +5273,7 @@ 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)", + "tokio-timer 0.2.11 (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)", ] @@ -5838,7 +5839,7 @@ dependencies = [ "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-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" "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" diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index e4343352d9..05033c2c41 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -39,7 +39,7 @@ 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}; -use network::{consensus_gossip as network_gossip, Service as NetworkService}; +use network::{consensus_gossip as network_gossip, NetworkService}; use network_gossip::ConsensusMessage; use crate::{Error, Message, SignedMessage, Commit, CompactCommit}; diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index d3b7a71f03..6576ccabbf 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -27,7 +27,8 @@ runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitiv parity-codec = { version = "3.3", features = ["derive"] } network_libp2p = { package = "substrate-network-libp2p", path = "../../core/network-libp2p" } peerset = { package = "substrate-peerset", path = "../../core/peerset" } -tokio = "0.1.11" +tokio-timer = "0.2.11" +tokio = { version = "0.1.11", optional = true } keyring = { package = "substrate-keyring", path = "../../core/keyring", optional = true } test_client = { package = "substrate-test-client", path = "../../core/test-client", optional = true } void = "1.0" @@ -37,7 +38,8 @@ 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"] } +tokio = "0.1.11" [features] default = [] -test-helpers = ["keyring", "test_client", "consensus/test-helpers"] +test-helpers = ["keyring", "test_client", "consensus/test-helpers", "tokio"] diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index e3ed56d5ad..e2def15425 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -43,8 +43,8 @@ pub mod test; pub use chain::{Client as ClientHandle, FinalityProofProvider}; pub use service::{ - Service, FetchFuture, TransactionPool, ManageNetwork, NetworkMsg, - SyncProvider, ExHashT, ReportHandle, + NetworkService, NetworkWorker, FetchFuture, TransactionPool, ManageNetwork, + NetworkMsg, SyncProvider, ExHashT, ReportHandle, }; pub use protocol::{ProtocolStatus, PeerInfo, Context}; pub use sync::{Status as SyncStatus, SyncState}; diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index d0b14bada7..2d7799b5bb 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -80,9 +80,9 @@ const RPC_FAILED_REPUTATION_CHANGE: i32 = -(1 << 12); // Lock must always be taken in order declared here. pub struct Protocol, H: ExHashT> { /// Interval at which we call `tick`. - tick_timeout: tokio::timer::Interval, + tick_timeout: tokio_timer::Interval, /// Interval at which we call `propagate_extrinsics`. - propagate_timeout: tokio::timer::Interval, + propagate_timeout: tokio_timer::Interval, config: ProtocolConfig, /// Handler for on-demand requests. on_demand_core: OnDemandCore, @@ -395,8 +395,8 @@ impl, H: ExHashT> Protocol { let info = chain.info()?; 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), + 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(), diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 805fb55ddb..c7a32d472f 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -15,15 +15,16 @@ // along with Substrate. If not, see . use std::collections::HashMap; +use std::io; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; -use std::{io, thread, time::Duration}; +use std::time::Duration; use log::{warn, debug, error, info}; -use futures::{Async, Future, Stream, sync::oneshot, sync::mpsc}; +use futures::{prelude::*, sync::oneshot, sync::mpsc}; use parking_lot::{Mutex, RwLock}; -use network_libp2p::{start_service, parse_str_addr, Service as NetworkService, ServiceEvent as NetworkServiceEvent}; -use network_libp2p::{NetworkConfiguration, RegisteredProtocol, NetworkState}; +use network_libp2p::{start_service, parse_str_addr, Service as Libp2pNetService, ServiceEvent as Libp2pNetServiceEvent}; +use network_libp2p::{RegisteredProtocol, NetworkState}; use peerset::PeersetHandle; use consensus::import_queue::{ImportQueue, Link, SharedFinalityProofRequestBuilder}; use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; @@ -39,8 +40,6 @@ use crate::config::Params; use crate::error::Error; use crate::specialization::NetworkSpecialization; -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. @@ -176,7 +175,7 @@ impl ReportHandle { } /// Substrate network service. Handles network IO and manages connectivity. -pub struct Service> { +pub struct NetworkService> { /// Sinks to propagate status updates. status_sinks: Arc>>>>, /// Are we connected to any peer? @@ -188,23 +187,23 @@ pub struct Service> { /// Channel for networking messages processed by the background thread. network_chan: mpsc::UnboundedSender>, /// Network service - network: Arc>>>, + 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: 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. - bg_thread: Option<(oneshot::Sender<()>, thread::JoinHandle<()>)>, } -impl> Service { - /// Creates and register protocol with the network service - pub fn new( +impl, H: ExHashT> NetworkWorker { + /// Creates the network service. + /// + /// Returns a `NetworkWorker` that implements `Future` and must be regularly polled in order + /// for the network processing to advance. From it, you can extract a `NetworkService` using + /// `worker.service()`. The `NetworkService` can be shared through the codebase. + pub fn new( params: Params, - ) -> Result>, Error> { + ) -> 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())); @@ -229,35 +228,55 @@ impl> Service { )?; let versions: Vec<_> = ((protocol::MIN_VERSION as u8)..=(protocol::CURRENT_VERSION as u8)).collect(); let registered = RegisteredProtocol::new(params.protocol_id, &versions); - let (thread, network, peerset) = start_thread( - is_offline.clone(), - is_major_syncing.clone(), - protocol, - peers.clone(), - params.import_queue, - 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()), - )?; - Ok(Arc::new(Service { - status_sinks, + // Start the main service. + let (network, peerset) = match start_service(params.network_config, registered) { + Ok((network, peerset)) => (Arc::new(Mutex::new(network)), peerset), + Err(err) => { + warn!("Error starting network: {}", err); + return Err(err.into()) + }, + }; + + let service = Arc::new(NetworkService { + status_sinks: status_sinks.clone(), + is_offline: is_offline.clone(), + is_major_syncing: is_major_syncing.clone(), + network_chan, + peers: peers.clone(), + peerset: peerset.clone(), + network: network.clone(), + protocol_sender: protocol_sender.clone(), + }); + + Ok(NetworkWorker { is_offline, is_major_syncing, - network_chan, - peers, + network_service: network, peerset, - network, - protocol_sender, - bg_thread: Some(thread), - })) + service, + protocol, + peers, + import_queue: params.import_queue, + transaction_pool: params.transaction_pool, + finality_proof_provider: params.finality_proof_provider, + network_port, + protocol_rx, + status_sinks, + on_demand_in: params.on_demand.and_then(|od| od.extract_receiver()), + status_interval: tokio_timer::Interval::new_interval(STATUS_INTERVAL), + connected_peers_interval: tokio_timer::Interval::new_interval(CONNECTED_PEERS_INTERVAL), + }) } + /// Return a `NetworkService` that can be shared through the code base and can be used to + /// manipulate the worker. + pub fn service(&self) -> &Arc> { + &self.service + } +} + +impl> NetworkService { /// Returns the downloaded bytes per second averaged over the past few seconds. #[inline] pub fn average_download_per_sec(&self) -> u64 { @@ -362,7 +381,7 @@ impl> Service { } } -impl> ::consensus::SyncOracle for Service { +impl> ::consensus::SyncOracle for NetworkService { fn is_major_syncing(&self) -> bool { self.is_major_syncing() } @@ -372,18 +391,7 @@ impl> ::consensus::SyncOracle f } } -impl> Drop for Service { - fn drop(&mut self) { - if let Some((sender, join)) = self.bg_thread.take() { - let _ = sender.send(()); - if let Err(e) = join.join() { - error!("Error while waiting on background thread: {:?}", e); - } - } - } -} - -impl> SyncProvider for Service { +impl> SyncProvider for NetworkService { fn is_major_syncing(&self) -> bool { self.is_major_syncing() } @@ -417,7 +425,7 @@ pub trait ManageNetwork { fn add_reserved_peer(&self, peer: String) -> Result<(), String>; } -impl> ManageNetwork for Service { +impl> ManageNetwork for NetworkService { fn accept_unreserved_peers(&self) { self.peerset.set_reserved_only(false); } @@ -438,7 +446,7 @@ impl> ManageNetwork for Service } } -/// Messages to be handled by NetworkService. +/// Messages to be handled by Libp2pNetService. #[derive(Debug)] pub enum NetworkMsg { /// Send an outgoing custom message. @@ -516,11 +524,16 @@ impl, &mut Context)> GossipTask< } } -/// Starts the background thread that handles the networking. -fn start_thread, H: ExHashT>( +/// Future tied to the `Network` service and that must be polled in order for the network to +/// advance. +#[must_use = "The NetworkWorker must be polled in order for the network to work"] +pub struct NetworkWorker, H: ExHashT> { is_offline: Arc, is_major_syncing: Arc, protocol: Protocol, + /// The network service that can be extracted and shared through the codebase. + service: Arc>, + network_service: Arc>>>, peers: Arc>>>, import_queue: Box>, transaction_pool: Arc>, @@ -528,124 +541,68 @@ fn start_thread, H: ExHashT>( network_port: mpsc::UnboundedReceiver>, protocol_rx: mpsc::UnboundedReceiver>, status_sinks: Arc>>>>, - config: NetworkConfiguration, - registered: RegisteredProtocol>, + peerset: PeersetHandle, on_demand_in: Option>>, -) -> Result<((oneshot::Sender<()>, thread::JoinHandle<()>), Arc>>>, PeersetHandle), Error> { - // Start the main service. - let (service, peerset) = match start_service(config, registered) { - Ok((service, peerset)) => (Arc::new(Mutex::new(service)), peerset), - Err(err) => { - warn!("Error starting network: {}", err); - return Err(err.into()) - }, - }; - - let (close_tx, close_rx) = oneshot::channel(); - let service_clone = service.clone(); - 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( - 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); - - // Note that we use `block_on` and not `block_on_all` because we want to kill the thread - // instantly if `close_rx` receives something. - match runtime.block_on(fut) { - Ok(()) => debug!(target: "sub-libp2p", "Networking thread finished"), - Err(err) => error!(target: "sub-libp2p", "Error while running libp2p: {:?}", err), - }; - })?; - Ok(((close_tx, thread), service, peerset)) + /// Interval at which we send status updates on the `status_sinks`. + status_interval: tokio_timer::Interval, + /// Interval at which we update the `connected_peers` Arc. + connected_peers_interval: tokio_timer::Interval, } -/// Runs the background thread that handles the networking. -fn run_thread, H: ExHashT>( - is_offline: Arc, - is_major_syncing: Arc, - mut protocol: Protocol, - network_service: Arc>>>, - 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) - } - } +impl, H: ExHashT> Future for NetworkWorker { + type Item = (); + type Error = io::Error; - // 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); + fn poll(&mut self) -> Poll { + // Implementation of `protocol::NetworkOut` using the available local variables. + struct Context<'a, B: BlockT>(&'a mut Libp2pNetService>, &'a PeersetHandle); + impl<'a, B: BlockT> NetworkOut for Context<'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) + } + } - 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()); + while let Ok(Async::Ready(_)) = self.status_interval.poll() { + let status = self.protocol.status(); + self.status_sinks.lock().retain(|sink| sink.unbounded_send(status.clone()).is_ok()); } - while let Ok(Async::Ready(_)) = connected_peers_interval.poll() { - let infos = protocol.peers_info().map(|(id, info)| { + while let Ok(Async::Ready(_)) = self.connected_peers_interval.poll() { + let infos = self.protocol.peers_info().map(|(id, info)| { (id.clone(), ConnectedPeer { peer_info: info.clone() }) }).collect(); - *peers.write() = infos; + *self.peers.write() = infos; } - match protocol.poll(&mut Ctxt(&mut network_service.lock(), &peerset), &*transaction_pool) { + match self.protocol.poll(&mut Context(&mut self.network_service.lock(), &self.peerset), &*self.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() { + if let Some(on_demand_in) = self.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); + self.protocol.add_on_demand_request(&mut Context(&mut self.network_service.lock(), &self.peerset), rq); } } loop { - match network_port.poll() { + match self.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), + self.network_service.lock().send_custom_message(&who, outgoing_message), Ok(Async::Ready(Some(NetworkMsg::ReportPeer(who, reputation)))) => - peerset.report_peer(who, reputation), + self.peerset.report_peer(who, reputation), Ok(Async::Ready(Some(NetworkMsg::DisconnectPeer(who)))) => - network_service.lock().drop_node(&who), + self.network_service.lock().drop_node(&who), #[cfg(any(test, feature = "test-helpers"))] Ok(Async::Ready(Some(NetworkMsg::Synchronized))) => {} @@ -655,91 +612,91 @@ fn run_thread, H: ExHashT>( } loop { - let msg = match protocol_rx.poll() { + let msg = match self.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); + let mut network_service = self.network_service.lock(); + let mut network_out = Context(&mut network_service, &self.peerset); match msg { ProtocolMsg::BlockImported(hash, header) => - protocol.on_block_imported(&mut network_out, hash, &header), + self.protocol.on_block_imported(&mut network_out, hash, &header), ProtocolMsg::BlockFinalized(hash, header) => - protocol.on_block_finalized(&mut network_out, hash, &header), + self.protocol.on_block_finalized(&mut network_out, hash, &header), ProtocolMsg::ExecuteWithSpec(task) => { - let (mut context, spec) = protocol.specialization_lock(&mut network_out); + let (mut context, spec) = self.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); + let (mut context, gossip) = self.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), + self.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), + self.protocol.blocks_processed(&mut network_out, hashes, has_error), ProtocolMsg::RestartSync => - protocol.restart(&mut network_out), + self.protocol.restart(&mut network_out), ProtocolMsg::AnnounceBlock(hash) => - protocol.announce_block(&mut network_out, hash), + self.protocol.announce_block(&mut network_out, hash), ProtocolMsg::BlockImportedSync(hash, number) => - protocol.block_imported(&hash, number), + self.protocol.block_imported(&hash, number), ProtocolMsg::ClearJustificationRequests => - protocol.clear_justification_requests(), + self.protocol.clear_justification_requests(), ProtocolMsg::RequestJustification(hash, number) => - protocol.request_justification(&mut network_out, &hash, number), + self.protocol.request_justification(&mut network_out, &hash, number), ProtocolMsg::JustificationImportResult(hash, number, success) => - protocol.justification_import_result(hash, number, success), + self.protocol.justification_import_result(hash, number, success), ProtocolMsg::SetFinalityProofRequestBuilder(builder) => - protocol.set_finality_proof_request_builder(builder), + self.protocol.set_finality_proof_request_builder(builder), ProtocolMsg::RequestFinalityProof(hash, number) => - protocol.request_finality_proof(&mut network_out, &hash, number), + self.protocol.request_finality_proof(&mut network_out, &hash, number), ProtocolMsg::FinalityProofImportResult(requested_block, finalziation_result) => - protocol.finality_proof_import_result(requested_block, finalziation_result), + self.protocol.finality_proof_import_result(requested_block, finalziation_result), ProtocolMsg::PropagateExtrinsics => - protocol.propagate_extrinsics(&mut network_out, &*transaction_pool), + self.protocol.propagate_extrinsics(&mut network_out, &*self.transaction_pool), #[cfg(any(test, feature = "test-helpers"))] - ProtocolMsg::Tick => protocol.tick(&mut network_out), + ProtocolMsg::Tick => self.protocol.tick(&mut network_out), #[cfg(any(test, feature = "test-helpers"))] ProtocolMsg::Synchronize => {}, } } loop { - let mut network_service = network_service.lock(); + let mut network_service = self.network_service.lock(); let poll_value = network_service.poll(); - let mut network_out = Ctxt(&mut network_service, &peerset); + let mut network_out = Context(&mut network_service, &self.peerset); let outcome = match poll_value { Ok(Async::NotReady) => break, - Ok(Async::Ready(Some(NetworkServiceEvent::OpenedCustomProtocol { peer_id, version, debug_info, .. }))) => { + Ok(Async::Ready(Some(Libp2pNetServiceEvent::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); + self.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); + Ok(Async::Ready(Some(Libp2pNetServiceEvent::ClosedCustomProtocol { peer_id, debug_info, .. }))) => { + self.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( + Ok(Async::Ready(Some(Libp2pNetServiceEvent::CustomMessage { peer_id, message, .. }))) => + self.protocol.on_custom_message( &mut network_out, - &*transaction_pool, + &*self.transaction_pool, peer_id, message, - finality_proof_provider.as_ref().map(|p| &**p) + self.finality_proof_provider.as_ref().map(|p| &**p) ), - Ok(Async::Ready(Some(NetworkServiceEvent::Clogged { peer_id, messages, .. }))) => { + Ok(Async::Ready(Some(Libp2pNetServiceEvent::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)); + self.protocol.on_clogged_peer(&mut network_out, peer_id.clone(), Some(msg)); } CustomMessageOutcome::None } @@ -752,18 +709,18 @@ fn run_thread, H: ExHashT>( match outcome { CustomMessageOutcome::BlockImport(origin, blocks) => - import_queue.import_blocks(origin, blocks), + self.import_queue.import_blocks(origin, blocks), CustomMessageOutcome::JustificationImport(origin, hash, nb, justification) => - import_queue.import_justification(origin, hash, nb, justification), + self.import_queue.import_justification(origin, hash, nb, justification), CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) => - import_queue.import_finality_proof(origin, hash, nb, proof), + self.import_queue.import_finality_proof(origin, hash, nb, proof), CustomMessageOutcome::None => {} } } - is_offline.store(protocol.is_offline(), Ordering::Relaxed); - is_major_syncing.store(protocol.is_major_syncing(), Ordering::Relaxed); + self.is_offline.store(self.protocol.is_offline(), Ordering::Relaxed); + self.is_major_syncing.store(self.protocol.is_major_syncing(), Ordering::Relaxed); Ok(Async::NotReady) - }) + } } diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 202bd15b2a..238d84b522 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -38,7 +38,8 @@ use parking_lot::Mutex; // Type aliases. // These exist mainly to avoid typing `::Foo` all over the code. /// Network service type for a factory. -pub type NetworkService = network::Service<::Block, ::NetworkProtocol>; +pub type NetworkService = + network::NetworkService<::Block, ::NetworkProtocol>; /// Code executor type for a factory. pub type CodeExecutor = NativeExecutor<::RuntimeDispatch>; diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index d2b4a66c5b..1eb59872ce 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -203,7 +203,13 @@ impl Service { }; let has_bootnodes = !network_params.network_config.boot_nodes.is_empty(); - let network = network::Service::new(network_params)?; + let network_mut = network::NetworkWorker::new(network_params)?; + let network = network_mut.service().clone(); + + task_executor.spawn(network_mut + .map_err(|_| ()) + .select(exit.clone()) + .then(|_| Ok(()))); let inherents_pool = Arc::new(InherentsPool::default()); let offchain_workers = if config.offchain_worker { -- GitLab From 6e253c899e67ce4e29b70e5eca3a3763fa42233f Mon Sep 17 00:00:00 2001 From: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> Date: Wed, 29 May 2019 08:13:38 -0400 Subject: [PATCH 043/140] Introduce inherent digests (#2466) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Introduce inherent digests * Implement inherent digests * fix silly error * Implementation of inherent digests in BABE All tests pass. There are still limitations: 1. The runtime strips out inherent digests, so BABE must re-add them. 2. The test runtime checks that it can re-compute all digests. It can’t, so I had to comment out that test. * Fix compilation and seal import Seals were not imported correctly: the pre-digest was imported twice, instead of both it and the seal being imported. Also, other parts of the code did not compile due to incomplete refactoring. * Remove bogus assertion * Fix testsuite compilation * Remove unused import * Fix compiler diagnostics * Add inherent digest parameters to block constructors This enforces that inherent digests are added first. * Fixup Cargo.lock * Fix build errors * Re-add an incorrectly removed import * Bump primitive-types version * Update Cargo.lock * Refactoring * Use inherent digests for AuRa They do reach the runtime, but get stripped. I have not figured out where. * Fix compilation errors * Fix compilation errors due to incorrect types * Fix whitespace Suggested-by: Tomasz Drwiega * Add preamble Suggested-by: Tomasz Drwiega * Fix silly compile error * Refactor pre-digest finding code into a separate function * Remove unwanted assertion It is too likely to bring down the entire blockchain. Suggested-by: Tomasz Drwiega * Use `find_pre_digest` after runtime, too Also, use `Member` trait rather than rolling our own requirements. Suggested-by: Tomasz Drwiega * Fix various warnings mostly due to upgrading the dependency on `error_chain`. * Pre-digests nearly complete This nearly completes the implementation of pre-runtime digests. * `Seal2` → `Seal` and fix test suite * Try to fix the storage error * Try to fix storage (again) * Fix tests * Hopefully finish pre-runtime digests The key is to pass *only* the pre-runtime digests to the runtime. The others must be stripped out by `initialize_block`. * Fix silly typo * Fix another silly mistake * Remove unnecessary filtering of BABE pre-digests We no longer get duplicate BABE pre-digests, so if they appear, the header should be rejected outright. * Update Cargo.lock files * Reformatting * Fix silly typo in inherent digest code Also, revert `error.rs` files that contained calls to the `error_chain!` macro. * Try to keep the runtime from stripping pre-digests Currently runs into the “Storage root must match that calculated” assertion. * Don’t compute storage root until storage changes are done. Also, fix a compilation error. * Fix compile-time error * Fix compilation errors * Fix more compile errors * Hopefully it compiles this time… * Fix compilation and add docs * Prevent BABE from adding duplicate pre-runtime digests Found by comparing with the AuRa code. I also did some refactoring. * Respond to review and fix some warnings * Delete some dead code introduced earlier * More dead code goes away * `ref mut` → `&mut` * Respond to review and fix some warnings * Fix compilation error * Remove unneeded `HashT` type parameter Suggested-by: Robert Habermeier * Remove spurious #[allow(deprecated)] * Document inherent digest parameter to `build_block` * Delete `Simple` trait It wasn’t needed * delete wrongly added files * Fix trait bounds * Digest serialization tests I also did some reformatting and cleanup. * Apply suggestions from code review Reformatting Co-Authored-By: André Silva * Swap two arguments to `propose` and `propose_with` Also, remove some needless unsafe code. * Remove bogus `#![allow(deprecated)]` annotations With the removal of the deprecated `Seal` variant, these are not needed. * Add a missing `#[allow(deprecated)]` in the AuRa tests * Fix silly compile error * Fix silly compiler error RLS did not tell me that I hadn’t fixed `babe/lib.rs`, so I missed it. * Fixes made automatically by Cargo --- .gitlab-ci.yml | 4 +- Cargo.lock | 25 +- Dockerfile | 4 +- core/basic-authorship/src/basic_authorship.rs | 38 +- core/client/db/src/light.rs | 2 +- .../client/src/block_builder/block_builder.rs | 16 +- core/client/src/client.rs | 90 +-- core/client/src/light/call_executor.rs | 4 +- core/client/src/light/fetcher.rs | 2 +- core/consensus/aura/src/digest.rs | 67 +++ core/consensus/aura/src/lib.rs | 449 ++++++--------- core/consensus/babe/primitives/src/lib.rs | 2 +- core/consensus/babe/src/digest.rs | 149 +++++ core/consensus/babe/src/lib.rs | 531 ++++++++---------- core/consensus/common/src/import_queue.rs | 4 +- core/consensus/common/src/lib.rs | 9 +- core/consensus/common/src/select_chain.rs | 6 +- core/consensus/slots/src/aux_schema.rs | 2 +- core/executor/src/allocator.rs | 3 +- core/executor/src/wasm_executor.rs | 6 +- core/executor/wasm/Cargo.lock | 12 +- core/finality-grandpa/src/finality_proof.rs | 2 +- core/finality-grandpa/src/import.rs | 2 +- core/finality-grandpa/src/tests.rs | 6 +- core/network/src/on_demand.rs | 4 +- core/network/src/test/block_import.rs | 9 +- core/network/src/test/mod.rs | 3 +- core/primitives/Cargo.toml | 2 +- core/rpc/src/chain/tests.rs | 10 +- core/rpc/src/state/tests.rs | 6 +- core/service/src/components.rs | 2 +- core/sr-api-macros/tests/runtime_calls.rs | 2 +- .../tests/ui/invalid_api_version_2.rs | 1 - core/sr-primitives/src/generic/digest.rs | 89 ++- core/sr-primitives/src/generic/header.rs | 18 +- core/sr-primitives/src/lib.rs | 4 + core/sr-primitives/src/testing.rs | 7 +- core/sr-primitives/src/traits.rs | 9 +- core/test-client/src/trait_tests.rs | 60 +- core/test-runtime/src/system.rs | 21 +- core/test-runtime/wasm/Cargo.lock | 12 +- node-template/runtime/wasm/Cargo.lock | 12 +- node/executor/src/lib.rs | 4 +- node/runtime/src/lib.rs | 4 +- node/runtime/wasm/Cargo.lock | 26 +- scripts/flamingfir-deploy.sh | 6 +- srml/aura/src/tests.rs | 4 +- srml/consensus/src/tests.rs | 12 +- srml/contract/src/tests.rs | 24 +- srml/executive/src/lib.rs | 13 +- srml/finality-tracker/src/lib.rs | 4 +- srml/grandpa/src/tests.rs | 24 +- srml/system/src/lib.rs | 76 ++- test-utils/transaction-factory/src/lib.rs | 2 +- test-utils/transaction-factory/src/modes.rs | 1 - 55 files changed, 1033 insertions(+), 873 deletions(-) create mode 100644 core/consensus/aura/src/digest.rs create mode 100644 core/consensus/babe/src/digest.rs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c11d5ccfc2..55c83328d4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -218,7 +218,7 @@ publish-docker-release: - docker build --build-arg VCS_REF="${CI_COMMIT_SHA}" --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" - --tag $CONTAINER_IMAGE:$VERSION + --tag $CONTAINER_IMAGE:$VERSION --tag $CONTAINER_IMAGE:latest . - docker push $CONTAINER_IMAGE:$VERSION - docker push $CONTAINER_IMAGE:latest @@ -272,7 +272,7 @@ publish-s3-doc: --human-readable --summarize .deploy-template: &deploy - stage: kubernetes + stage: kubernetes when: manual retry: 1 image: parity/kubetools:latest diff --git a/Cargo.lock b/Cargo.lock index 32bcf235ab..83a85c4d69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1211,6 +1211,14 @@ dependencies = [ "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "impl-serde" +version = "0.2.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 = "indexmap" version = "1.0.2" @@ -2514,13 +2522,13 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3196,7 +3204,7 @@ dependencies = [ "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.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)", + "primitive-types 0.2.4 (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)", "sr-io 2.0.0", @@ -4279,7 +4287,7 @@ dependencies = [ "num-traits 0.2.6 (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)", + "primitive-types 0.2.4 (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.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5037,7 +5045,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.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)", @@ -5617,6 +5625,7 @@ dependencies = [ "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 impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" @@ -5722,7 +5731,7 @@ dependencies = [ "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 primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" "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.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6a9bed9ebc40cf53e3a76d7486c54d05002eae6485b2711ab9104476fb2eb8bc" @@ -5858,7 +5867,7 @@ dependencies = [ "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 uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "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" diff --git a/Dockerfile b/Dockerfile index df39db5abb..c5944dbab6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,8 +20,8 @@ RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ 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 && \ + ./scripts/build.sh && \ + rustup default stable && \ cargo build --$PROFILE # ===== SECOND STAGE ====== diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 9f0db708da..62aad4c9c7 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -30,7 +30,8 @@ use codec::Decode; use consensus_common::{self, evaluation}; use primitives::{H256, Blake2Hasher, ExecutionContext}; use runtime_primitives::traits::{ - Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, AuthorityIdFor + Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, + AuthorityIdFor, DigestFor, }; use runtime_primitives::generic::BlockId; use runtime_primitives::ApplyError; @@ -53,11 +54,13 @@ pub trait AuthoringApi: Send + Sync + ProvideRuntimeApi where /// The error used by this API type. type Error: std::error::Error; - /// Build a block on top of the given, with inherent extrinsics pre-pushed. + /// Build a block on top of the given block, with inherent extrinsics and + /// inherent digests pre-pushed. fn build_block) -> ()>( &self, at: &BlockId, inherent_data: InherentData, + inherent_digests: DigestFor, build_ctx: F, ) -> Result; } @@ -92,9 +95,11 @@ impl AuthoringApi for SubstrateClient where &self, at: &BlockId, inherent_data: InherentData, + inherent_digests: DigestFor, mut build_ctx: F, ) -> Result { - let mut block_builder = self.new_block_at(at)?; + + let mut block_builder = self.new_block_at(at, inherent_digests)?; let runtime_api = self.runtime_api(); // We don't check the API versions any further here since the dispatch compatibility @@ -174,12 +179,16 @@ impl consensus_common::Proposer<::Block> for Pro type Create = Result<::Block, error::Error>; type Error = error::Error; - fn propose(&self, inherent_data: InherentData, max_duration: time::Duration) - -> Result<::Block, error::Error> + fn propose( + &self, + inherent_data: InherentData, + inherent_digests: DigestFor, + max_duration: time::Duration, + ) -> Result<::Block, error::Error> { // leave some time for evaluation and block finalization (33%) let deadline = (self.now)() + max_duration - max_duration / 3; - self.propose_with(inherent_data, deadline) + self.propose_with(inherent_data, inherent_digests, deadline) } } @@ -190,8 +199,12 @@ impl Proposer where A: txpool::ChainApi, client::error::Error: From<::Error>, { - fn propose_with(&self, inherent_data: InherentData, deadline: time::Instant) - -> Result<::Block, error::Error> + fn propose_with( + &self, + inherent_data: InherentData, + inherent_digests: DigestFor, + deadline: time::Instant, + ) -> Result<::Block, error::Error> { use runtime_primitives::traits::BlakeTwo256; @@ -203,17 +216,16 @@ impl Proposer where let block = self.client.build_block( &self.parent_id, inherent_data, + inherent_digests.clone(), |block_builder| { // Add inherents from the internal pool - let inherents = self.inherents_pool.drain(); - debug!("Pushing {} queued inherents.", inherents.len()); + debug!("Pushing {} queued inherent extrinsics.", inherents.len()); for i in inherents { if let Err(e) = block_builder.push_extrinsic(i) { warn!("Error while pushing inherent extrinsic from the pool: {:?}", e); } } - // proceed with transactions let mut is_first = true; let mut skipped = 0; @@ -331,7 +343,7 @@ mod tests { cell.replace(new) }); let deadline = time::Duration::from_secs(3); - let block = proposer.propose(Default::default(), deadline).unwrap(); + let block = proposer.propose(Default::default(), Default::default(), deadline).unwrap(); // then // block should have some extrinsics although we have some more in the pool. @@ -362,7 +374,7 @@ mod tests { // when let deadline = time::Duration::from_secs(3); - let block = proposer.propose(Default::default(), deadline).unwrap(); + let block = proposer.propose(Default::default(), Default::default(), deadline).unwrap(); // then assert_eq!(block.extrinsics().len(), 1); diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index e145e63cb7..16b0fc616a 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -708,7 +708,7 @@ pub(crate) mod tests { let mut prev_hash = insert_final_block(&db, HashMap::new(), || header_producer(&Default::default(), 0)); // insert SIZE blocks && ensure that nothing is pruned - + for number in 0..cht::size() { prev_hash = insert_block(&db, HashMap::new(), || header_producer(&prev_hash, 1 + number)); } diff --git a/core/client/src/block_builder/block_builder.rs b/core/client/src/block_builder/block_builder.rs index 995b303699..eb7d81f978 100644 --- a/core/client/src/block_builder/block_builder.rs +++ b/core/client/src/block_builder/block_builder.rs @@ -20,7 +20,7 @@ use parity_codec::Encode; use runtime_primitives::ApplyOutcome; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ - Header as HeaderT, Hash, Block as BlockT, One, HashFor, ProvideRuntimeApi, ApiRef + Header as HeaderT, Hash, Block as BlockT, One, HashFor, ProvideRuntimeApi, ApiRef, DigestFor, }; use primitives::{H256, ExecutionContext}; use crate::blockchain::HeaderBackend; @@ -41,10 +41,11 @@ where A: ProvideRuntimeApi + HeaderBackend + 'a, A::Api: BlockBuilderApi, { - /// Create a new instance of builder from the given client, building on the latest block. - pub fn new(api: &'a A) -> error::Result { + /// Create a new instance of builder from the given client, building on the + /// latest block. + pub fn new(api: &'a A, inherent_digests: DigestFor) -> error::Result { api.info().and_then(|i| - Self::at_block(&BlockId::Hash(i.best_hash), api, false) + Self::at_block(&BlockId::Hash(i.best_hash), api, false, inherent_digests) ) } @@ -57,7 +58,8 @@ where pub fn at_block( block_id: &BlockId, api: &'a A, - proof_recording: bool + proof_recording: bool, + inherent_digests: DigestFor, ) -> error::Result { let number = api.block_number_from_id(block_id)? .ok_or_else(|| error::Error::UnknownBlock(format!("{}", block_id)))? @@ -70,7 +72,7 @@ where Default::default(), Default::default(), parent_hash, - Default::default() + inherent_digests, ); let mut api = api.runtime_api(); @@ -80,7 +82,7 @@ where } api.initialize_block_with_context( - block_id, ExecutionContext::BlockConstruction, &header + block_id, ExecutionContext::BlockConstruction, &header, )?; Ok(BlockBuilder { diff --git a/core/client/src/client.rs b/core/client/src/client.rs index f36992a14e..874cf7636b 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -37,7 +37,7 @@ use consensus::{ use runtime_primitives::traits::{ Block as BlockT, Header as HeaderT, Zero, NumberFor, CurrentHeight, BlockNumberToHash, ApiRef, ProvideRuntimeApi, Digest, DigestItem, - SaturatedConversion, One + SaturatedConversion, One, DigestFor, }; use runtime_primitives::BuildStorage; use crate::runtime_api::{ @@ -695,26 +695,29 @@ impl Client where /// Create a new block, built on the head of the chain. pub fn new_block( - &self + &self, + inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, RA: Send + Sync, Self: ProvideRuntimeApi, ::Api: BlockBuilderAPI { - block_builder::BlockBuilder::new(self) + block_builder::BlockBuilder::new(self, inherent_digests) } /// Create a new block, built on top of `parent`. pub fn new_block_at( - &self, parent: &BlockId + &self, + parent: &BlockId, + inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, RA: Send + Sync, Self: ProvideRuntimeApi, ::Api: BlockBuilderAPI { - block_builder::BlockBuilder::at_block(parent, &self, false) + block_builder::BlockBuilder::at_block(parent, &self, false, inherent_digests) } /// Create a new block, built on top of `parent` with proof recording enabled. @@ -723,14 +726,16 @@ impl Client where /// 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 + &self, + parent: &BlockId, + inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, RA: Send + Sync, Self: ProvideRuntimeApi, ::Api: BlockBuilderAPI { - block_builder::BlockBuilder::at_block(parent, &self, true) + block_builder::BlockBuilder::at_block(parent, &self, true, inherent_digests) } /// Lock the import lock, and run operations inside. @@ -1272,11 +1277,12 @@ impl Client where /// Prepare in-memory header that is used in execution environment. fn prepare_environment_block(&self, parent: &BlockId) -> error::Result { + let parent_header = self.backend().blockchain().expect_header(*parent)?; Ok(<::Header as HeaderT>::new( self.backend.blockchain().expect_block_number_from_id(parent)? + One::one(), Default::default(), Default::default(), - self.backend.blockchain().expect_block_hash_from_id(&parent)?, + parent_header.hash(), Default::default(), )) } @@ -1753,7 +1759,7 @@ pub(crate) mod tests { let remote_client = test_client::new_with_changes_trie(); let mut nonces: HashMap<_, u64> = Default::default(); for (i, block_transfers) in blocks_transfers.into_iter().enumerate() { - let mut builder = remote_client.new_block().unwrap(); + let mut builder = remote_client.new_block(Default::default()).unwrap(); for (from, to) in block_transfers { builder.push_transfer(Transfer { from: from.into(), @@ -1828,7 +1834,7 @@ pub(crate) mod tests { fn block_builder_works_with_no_transactions() { let client = test_client::new(); - let builder = client.new_block().unwrap(); + let builder = client.new_block(Default::default()).unwrap(); client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); @@ -1839,7 +1845,7 @@ pub(crate) mod tests { fn block_builder_works_with_transactions() { let client = test_client::new(); - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1872,7 +1878,7 @@ pub(crate) mod tests { fn block_builder_does_not_include_invalid() { let client = test_client::new(); - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1921,7 +1927,7 @@ pub(crate) mod tests { let client = test_client::new(); - let uninserted_block = client.new_block().unwrap().bake().unwrap(); + let uninserted_block = client.new_block(Default::default()).unwrap().bake().unwrap(); #[allow(deprecated)] let backend = client.backend().as_in_memory(); #[allow(deprecated)] @@ -1940,11 +1946,11 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block().unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); let v: Vec = Vec::new(); assert_eq!(v, client.uncles(a2.hash(), 3).unwrap()); @@ -1960,27 +1966,27 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1992,15 +1998,15 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -2012,7 +2018,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -2052,11 +2058,11 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block().unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); let genesis_hash = client.info().unwrap().chain.genesis_hash; @@ -2083,27 +2089,27 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -2115,15 +2121,15 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -2135,7 +2141,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -2372,11 +2378,11 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block().unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); let genesis_hash = client.info().unwrap().chain.genesis_hash; @@ -2412,16 +2418,16 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 let justification = vec![1, 2, 3]; - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import_justified(BlockOrigin::Own, a3.clone(), justification.clone()).unwrap(); #[allow(deprecated)] diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 982f106f2a..9959d29a1b 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -448,7 +448,7 @@ pub fn check_execution_proof( Default::default(), Default::default(), request.header.hash(), - Default::default(), + request.header.digest().clone(), ); execution_proof_check_on_trie_backend::( &trie_backend, @@ -525,7 +525,7 @@ mod tests { for _ in 1..3 { remote_client.import_justified( BlockOrigin::Own, - remote_client.new_block().unwrap().bake().unwrap(), + remote_client.new_block(Default::default()).unwrap().bake().unwrap(), Default::default(), ).unwrap(); } diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index 39563aa83c..0a8a05b850 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -588,7 +588,7 @@ pub mod tests { let remote_client = test_client::new(); let mut local_headers_hashes = Vec::new(); for i in 0..4 { - let builder = remote_client.new_block().unwrap(); + let builder = remote_client.new_block(Default::default()).unwrap(); remote_client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); local_headers_hashes.push(remote_client.block_hash(i + 1) .map_err(|_| ClientError::Backend("TestError".into()))); diff --git a/core/consensus/aura/src/digest.rs b/core/consensus/aura/src/digest.rs new file mode 100644 index 0000000000..fe85c5807e --- /dev/null +++ b/core/consensus/aura/src/digest.rs @@ -0,0 +1,67 @@ +// 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 . + +//! Aura (Authority-Round) digests +//! +//! This implements the digests for AuRa, to allow the private +//! `CompatibleDigestItem` trait to appear in public interfaces. +use primitives::Pair; +use aura_primitives::AURA_ENGINE_ID; +use runtime_primitives::generic::DigestItem; +use parity_codec::{Encode, Decode}; + +type Signature

=

::Signature; + +/// A digest item which is usable with aura consensus. +pub trait CompatibleDigestItem: Sized { + /// Construct a digest item which contains a signature on the hash. + fn aura_seal(signature: Signature) -> Self; + + /// If this item is an Aura seal, return the signature. + fn as_aura_seal(&self) -> Option<&Signature>; + + /// Construct a digest item which contains the slot number + fn aura_pre_digest(slot_num: u64) -> Self; + + /// If this item is an AuRa pre-digest, return the slot number + fn as_aura_pre_digest(&self) -> Option; +} + +impl CompatibleDigestItem

for DigestItem + where P: Pair, P::Signature: Clone + Encode + Decode, +{ + fn aura_seal(signature: Signature

) -> Self { + DigestItem::Seal(AURA_ENGINE_ID, signature) + } + + fn as_aura_seal(&self) -> Option<&Signature

> { + match self { + DigestItem::Seal(AURA_ENGINE_ID, ref sig) => Some(sig), + _ => None, + } + } + + fn aura_pre_digest(slot_num: u64) -> Self { + DigestItem::PreRuntime(AURA_ENGINE_ID, slot_num.encode()) + } + + fn as_aura_pre_digest(&self) -> Option { + match self { + DigestItem::PreRuntime(AURA_ENGINE_ID, ref buffer) => Decode::decode(&mut &buffer[..]), + _ => None, + } + } +} diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 554a63de94..e3ab9e31cf 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -44,18 +44,20 @@ use client::{ error::Result as CResult, backend::AuxStore, }; -use aura_primitives::AURA_ENGINE_ID; -use runtime_primitives::{generic, generic::BlockId, Justification}; + +use runtime_primitives::{generic::{self, BlockId}, Justification}; use runtime_primitives::traits::{ - Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, Zero, + Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, + Zero, Member, }; + use primitives::Pair; use inherents::{InherentDataProviders, InherentData}; use authorities::AuthoritiesApi; -use futures::{Future, IntoFuture, future, stream::Stream}; +use futures::{Future, IntoFuture, future}; use tokio::timer::Timeout; -use log::{warn, debug, info, trace}; +use log::{error, warn, debug, info, trace}; use srml_aura::{ InherentType as AuraInherent, AuraInherentData, @@ -68,24 +70,10 @@ use slots::{CheckedHeader, SlotWorker, SlotInfo, SlotCompatible, slot_now, check pub use aura_primitives::*; pub use consensus_common::{SyncOracle, ExtraVerification}; -type AuthorityId

=

::Public; -type Signature

=

::Signature; +mod digest; +use digest::CompatibleDigestItem; -/// 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`. -#[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=()>; - - /// Send a message at a specific round out. - fn send_message(&self, slot: u64, message: Vec); -} +type AuthorityId

=

::Public; /// A slot duration. Create with `get_or_compute`. #[derive(Clone, Copy, Debug, Encode, Decode, Hash, PartialOrd, Ord, PartialEq, Eq)] @@ -122,48 +110,6 @@ fn slot_author(slot_num: u64, authorities: &[AuthorityId

]) -> Option Some(current_author) } -/// 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 - /// hash. - fn aura_seal(slot_num: u64, signature: Signature) -> Self; - - /// If this item is an Aura seal, return the slot number and signature. - fn as_aura_seal(&self) -> Option<(u64, Signature)>; - - /// Return `true` if this seal type is deprecated. Otherwise, return - /// `false`. - fn is_deprecated(&self) -> bool; -} - -impl CompatibleDigestItem

for generic::DigestItem - where P: Pair, P::Signature: Clone + Encode + Decode, -{ - /// Construct a digest item which is a slot number and a signature on the - /// hash. - fn aura_seal(slot_number: u64, signature: Signature

) -> Self { - generic::DigestItem::Consensus(AURA_ENGINE_ID, (slot_number, signature).encode()) - } - - /// If this item is an Aura seal, return the slot number and signature. - #[allow(deprecated)] - fn as_aura_seal(&self) -> Option<(u64, Signature

)> { - match self { - generic::DigestItem::Seal(slot, ref sig) => Some((*slot, (*sig).clone())), - generic::DigestItem::Consensus(AURA_ENGINE_ID, seal) => Decode::decode(&mut &seal[..]), - _ => None, - } - } - - #[allow(deprecated)] - fn is_deprecated(&self) -> bool { - match self { - generic::DigestItem::Seal(_, _) => true, - _ => false, - } - } -} - #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] struct AuraSlotCompatible; @@ -178,60 +124,8 @@ impl SlotCompatible for AuraSlotCompatible { } } -/// Start the aura worker in a separate 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, - on_exit: OnExit, - inherent_data_providers: InherentDataProviders, - force_authoring: bool, -) -> Result<(), consensus_common::Error> where - B: Block + '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, - I: BlockImport + Send + Sync + 'static, - Error: From + 'static, - P: Pair + Send + Sync + 'static, - P::Public: Encode + Decode + Eq + Clone + Debug + Hash + Send + Sync + 'static, - P::Signature: Encode, - SO: SyncOracle + Send + Sync + Clone + 'static, - OnExit: Future + Send + 'static, - DigestItemFor: CompatibleDigestItem

+ DigestItem> + 'static, - Error: ::std::error::Error + Send + From<::consensus_common::Error> + 'static, -{ - let worker = AuraWorker { - client: client.clone(), - block_import, - env, - local_key, - inherent_data_providers: inherent_data_providers.clone(), - sync_oracle: sync_oracle.clone(), - force_authoring, - }; - - #[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, - inherent_data_providers - ) -} - /// 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, @@ -243,20 +137,25 @@ pub fn start_aura( inherent_data_providers: InherentDataProviders, force_authoring: bool, ) -> Result, consensus_common::Error> where - B: Block, - C: ProvideRuntimeApi + ProvideCache + AuxStore, + B: Block, + C: ProvideRuntimeApi + ProvideCache + AuxStore + Send + Sync, C::Api: AuthoritiesApi, - SC: SelectChain + Clone, - E: Environment, + SC: SelectChain, + generic::DigestItem: DigestItem, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, - I: BlockImport + Send + Sync + 'static, P: Pair + Send + Sync + 'static, - P::Public: Hash + Eq + Send + Sync + Clone + Debug + Encode + Decode + 'static, - P::Signature: Encode, - SO: SyncOracle + Send + Sync + Clone, + P::Public: Hash + Member + Encode + Decode, + P::Signature: Hash + Member + Encode + Decode, DigestItemFor: CompatibleDigestItem

+ DigestItem>, + H: Header< + Digest=generic::Digest>, + Hash=B::Hash, + >, + E: Environment, + I: BlockImport + Send + Sync + 'static, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, + SO: SyncOracle + Send + Sync + Clone, OnExit: Future, { let worker = AuraWorker { @@ -288,18 +187,23 @@ struct AuraWorker { force_authoring: bool, } -impl SlotWorker for AuraWorker where - C: ProvideRuntimeApi + ProvideCache + AuxStore, +impl SlotWorker for AuraWorker where + B: Block, + C: ProvideRuntimeApi + ProvideCache + Sync, C::Api: AuthoritiesApi, E: Environment, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, + H: Header< + Digest=generic::Digest>, + Hash=B::Hash, + >, I: BlockImport + Send + Sync + 'static, P: Pair + Send + Sync + 'static, - P::Public: Hash + Eq + Send + Sync + Clone + Debug + Encode + Decode + 'static, - P::Signature: Encode, + P::Public: Member + Encode + Decode + Hash, + P::Signature: Member + Encode + Decode + Hash + Debug, SO: SyncOracle + Send + Clone, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, + DigestItemFor: CompatibleDigestItem

+ DigestItem, Hash=B::Hash>, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { type OnSlot = Box + Send>; @@ -376,7 +280,15 @@ impl SlotWorker for AuraWorker as CompatibleDigestItem

>::aura_pre_digest(slot_num), + ], + }, + remaining_duration, + ).into_future(), remaining_duration, ) } else { @@ -384,72 +296,98 @@ impl SlotWorker for AuraWorker slot_num - ); - return - } + 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!( + "Discarding proposal for slot {}; block production took too long", + slot_num + ); + telemetry!(CONSENSUS_INFO; "aura.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(); + let (header, body) = b.deconstruct(); + let pre_digest: Result = find_pre_digest::(&header); + if let Err(e) = pre_digest { + error!(target: "aura", "FATAL ERROR: Invalid pre-digest: {}!", e); + return + } else { + trace!(target: "aura", "Got correct number of seals. Good!") + }; + + let header_num = header.number().clone(); + let parent_hash = header.parent_hash().clone(); + + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let header_hash = header.hash(); + let signature = pair.sign(header_hash.as_ref()); + let signature_digest_item = as CompatibleDigestItem

>::aura_seal(signature); + + let import_block: ImportBlock = ImportBlock { + origin: BlockOrigin::Own, + header, + justification: None, + post_digests: vec![signature_digest_item], + body: Some(body), + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + + info!("Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", + header_num, + import_block.post_header().hash(), + header_hash + ); + telemetry!(CONSENSUS_INFO; "aura.pre_sealed_block"; + "header_num" => ?header_num, + "hash_now" => ?import_block.post_header().hash(), + "hash_previously" => ?header_hash + ); - // sign the pre-sealed hash of the block and then - // add it to a digest item. - let to_sign = (slot_num, pre_hash).encode(); - let signature = pair.sign(&to_sign[..]); - let item = as CompatibleDigestItem

>::aura_seal( - slot_num, - signature, - ); + if let Err(e) = block_import.import_block(import_block, Default::default()) { + warn!(target: "aura", "Error with block built on {:?}: {:?}", + parent_hash, e); + telemetry!(CONSENSUS_WARN; "aura.err_with_block_built_on"; + "hash" => ?parent_hash, "err" => ?e + ); + } + }).map_err(|e| consensus_common::Error::ClientImport(format!("{:?}", e)).into())) + } +} - 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!("Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", - header_num, - import_block.post_header().hash(), - pre_hash - ); - telemetry!(CONSENSUS_INFO; "aura.pre_sealed_block"; - "header_num" => ?header_num, - "hash_now" => ?import_block.post_header().hash(), - "hash_previously" => ?pre_hash - ); +macro_rules! aura_err { + ($($i: expr),+) => { + { debug!(target: "aura", $($i),+) + ; format!($($i),+) + } + }; +} - if let Err(e) = block_import.import_block(import_block, Default::default()) { - warn!(target: "aura", "Error with block built on {:?}: {:?}", - parent_hash, e); - telemetry!(CONSENSUS_WARN; "aura.err_with_block_built_on"; - "hash" => ?parent_hash, "err" => ?e - ); - } - }) - .map_err(|e| consensus_common::Error::ClientImport(format!("{:?}", e)).into()) - ) +fn find_pre_digest(header: &B::Header) -> Result + where DigestItemFor: CompatibleDigestItem

, + P::Signature: Decode, + P::Public: Encode + Decode + PartialEq + Clone, +{ + let mut pre_digest: Option = None; + for log in header.digest().logs() { + trace!(target: "aura", "Checking log {:?}", log); + match (log.as_aura_pre_digest(), pre_digest.is_some()) { + (Some(_), true) => Err(aura_err!("Multiple AuRa pre-runtime headers, rejecting!"))?, + (None, _) => trace!(target: "aura", "Ignoring digest not meant for us"), + (s, false) => pre_digest = s, + } } + pre_digest.ok_or_else(|| aura_err!("No AuRa pre-runtime digest found")) } + /// 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 it's successful, returns the pre-header and the digest item containing the seal. /// @@ -462,30 +400,25 @@ fn check_header( mut header: B::Header, hash: B::Hash, authorities: &[AuthorityId

], - allow_old_seals: bool, -) -> Result>, String> - where DigestItemFor: CompatibleDigestItem

, - P::Signature: Decode, - C: client::backend::AuxStore, - P::Public: AsRef + Encode + Decode + PartialEq + Clone, +) -> Result)>, String> where + DigestItemFor: CompatibleDigestItem

, + P::Signature: Decode, + C: client::backend::AuxStore, + P::Public: AsRef + Encode + Decode + PartialEq + Clone, { - let digest_item = match header.digest_mut().pop() { + let seal = match header.digest_mut().pop() { Some(x) => x, None => return Err(format!("Header {:?} is unsealed", hash)), }; - if !allow_old_seals && digest_item.is_deprecated() { - debug!(target: "aura", "Header {:?} uses old seal format, rejecting", hash); - return Err(format!("Header {:?} uses old seal format, rejecting", hash)) - } - - let (slot_num, sig) = digest_item.as_aura_seal().ok_or_else(|| { - debug!(target: "aura", "Header {:?} is unsealed", hash); - format!("Header {:?} is unsealed", hash) + let sig = seal.as_aura_seal().ok_or_else(|| { + aura_err!("Header {:?} has a bad seal", hash) })?; + let slot_num = find_pre_digest::(&header)?; + if slot_num > slot_now { - header.digest_mut().push(digest_item); + header.digest_mut().push(seal); Ok(CheckedHeader::Deferred(header, slot_num)) } else { // check the signature is valid under the expected authority and @@ -496,16 +429,14 @@ fn check_header( }; let pre_hash = header.hash(); - let to_sign = (slot_num, pre_hash).encode(); - let public = expected_author; - if P::verify(&sig, &to_sign[..], public) { + if P::verify(&sig, pre_hash.as_ref(), expected_author) { match check_equivocation::<_, _,

::Public>( client, slot_now, slot_num, header.clone(), - public.clone(), + expected_author.clone(), ) { Ok(Some(equivocation_proof)) => { let log_str = format!( @@ -517,7 +448,7 @@ fn check_header( info!("{}", log_str); Err(log_str) }, - Ok(None) => Ok(CheckedHeader::Checked(header, digest_item)), + Ok(None) => Ok(CheckedHeader::Checked(header, (slot_num, seal))), Err(e) => Err(e.to_string()), } } else { @@ -532,7 +463,6 @@ pub struct AuraVerifier { extra: E, phantom: PhantomData

, inherent_data_providers: inherents::InherentDataProviders, - allow_old_seals: bool, } impl AuraVerifier @@ -631,20 +561,17 @@ 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 + // 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.allow_old_seals, )?; match checked_header { - CheckedHeader::Checked(pre_header, seal) => { - let (slot_num, _) = seal.as_aura_seal() - .expect("check_header always returns a seal digest item; qed"); - + CheckedHeader::Checked(pre_header, (slot_num, seal)) => { // 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. @@ -813,52 +740,6 @@ pub fn import_queue( extra, inherent_data_providers, phantom: PhantomData, - allow_old_seals: false, - } - ); - 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( - 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 + AuxStore, - C::Api: BlockBuilderApi + AuthoritiesApi, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, - E: 'static + ExtraVerification, - P: Pair + Send + Sync + 'static, - P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode + AsRef, - P::Signature: Encode + Decode, -{ - register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; - initialize_authorities_cache(&*client)?; - - let verifier = Arc::new( - AuraVerifier { - client: client.clone(), - extra, - inherent_data_providers, - phantom: PhantomData, - allow_old_seals: true, } ); Ok(BasicQueue::new( @@ -873,10 +754,11 @@ pub fn import_queue_accept_old_seals( #[cfg(test)] mod tests { use super::*; + use futures::stream::Stream as _; use consensus_common::NoNetwork as DummyOracle; use network::test::*; use network::test::{Block as TestBlock, PeersClient, PeersFullClient}; - use runtime_primitives::traits::Block as BlockT; + use runtime_primitives::traits::{Block as BlockT, DigestFor}; use network::config::ProtocolConfig; use parking_lot::Mutex; use tokio::runtime::current_thread; @@ -910,8 +792,13 @@ mod tests { type Error = Error; type Create = Result; - fn propose(&self, _: InherentData, _: Duration) -> Result { - self.1.new_block().unwrap().bake().map_err(|e| e.into()) + fn propose( + &self, + _: InherentData, + digests: DigestFor, + _: Duration, + ) -> Result { + self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) } } @@ -955,7 +842,6 @@ mod tests { extra: NothingExtra, inherent_data_providers, phantom: Default::default(), - allow_old_seals: false, }) }, PeersClient::Light(_) => unreachable!("No (yet) tests for light client + Aura"), @@ -995,19 +881,18 @@ mod tests { extrinsics_root: Default::default(), digest: DigestTest { logs: vec![], }, }; + let item = as CompatibleDigestItem>::aura_pre_digest(slot_num); + header.digest_mut().push(item); let header_hash: H256 = header.hash(); - let to_sign = (slot_num, header_hash).encode(); - let signature = pair.sign(&to_sign[..]); + let signature = pair.sign(&header_hash[..]); - let item = as CompatibleDigestItem>::aura_seal( - slot_num, - signature, - ); + let item = CompatibleDigestItem::::aura_seal(signature); header.digest_mut().push(item); (header, header_hash) } #[test] + #[allow(deprecated)] fn authoring_blocks() { let _ = ::env_logger::try_init(); let mut net = AuraTestNet::new(3); @@ -1046,7 +931,7 @@ mod tests { &inherent_data_providers, slot_duration.get() ).expect("Registers aura inherent data provider"); - let aura = start_aura::<_, _, _, _, _, sr25519::Pair, _, _, _>( + let aura = start_aura::<_, _, _, _, _, sr25519::Pair, _, _, _, _>( slot_duration, Arc::new(key.clone().into()), client.clone(), @@ -1111,22 +996,22 @@ mod tests { 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()); + check_header::<_, B, P>(&c, 2, header1.clone(), header1_hash, &authorities).unwrap(); + assert!(check_header::<_, B, P>(&c, 3, header1, header1_hash, &authorities).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()); + assert!(check_header::<_, B, P>(&c, 4, header2, header2_hash, &authorities).is_err()); // Different slot is ok. - assert!(check_header::<_, B, P>(&c, 5, header3, header3_hash, &authorities, false).is_ok()); + assert!(check_header::<_, B, P>(&c, 5, header3, header3_hash, &authorities).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()); + assert!(check_header::<_, B, P>(&c, PRUNING_BOUND + 2, header4, header4_hash, &authorities).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()); + assert!(check_header::<_, B, P>(&c, PRUNING_BOUND + 3, header5, header5_hash, &authorities).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()); + assert!(check_header::<_, B, P>(&c, PRUNING_BOUND + 4, header6, header6_hash, &authorities).is_ok()); } } diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index 83ba6ccba2..0e49c45198 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . //! Primitives for BABE. -#![forbid(warnings, unsafe_code, missing_docs)] +#![deny(warnings, unsafe_code, missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] use runtime_primitives::ConsensusEngineId; diff --git a/core/consensus/babe/src/digest.rs b/core/consensus/babe/src/digest.rs new file mode 100644 index 0000000000..b26a1508b5 --- /dev/null +++ b/core/consensus/babe/src/digest.rs @@ -0,0 +1,149 @@ +// 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 . + +//! Private mplementation details of BABE digests. +use primitives::sr25519::{Public, Signature}; +use babe_primitives::BABE_ENGINE_ID; +use runtime_primitives::generic::DigestItem; +use std::fmt::Debug; +use parity_codec::{Decode, Encode, Input}; +use log::info; +use schnorrkel::{ + vrf::{VRFProof, VRFOutput, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}, + PUBLIC_KEY_LENGTH, +}; + +/// A BABE pre-digest. It includes: +/// +/// * The public key of the author. +/// * The VRF proof. +/// * The VRF output. +/// * The slot number. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct BabePreDigest { + pub(super) vrf_output: VRFOutput, + pub(super) proof: VRFProof, + pub(super) author: Public, + pub(super) slot_num: u64, +} + +/// The prefix used by BABE for its VRF keys. +pub const BABE_VRF_PREFIX: &'static [u8] = b"substrate-babe-vrf"; + +type TmpDecode = ( + [u8; VRF_OUTPUT_LENGTH], + [u8; VRF_PROOF_LENGTH], + [u8; PUBLIC_KEY_LENGTH], + u64, +); + +impl Encode for BabePreDigest { + fn encode(&self) -> Vec { + let tmp: TmpDecode = ( + *self.vrf_output.as_bytes(), + self.proof.to_bytes(), + self.author.0, + self.slot_num, + ); + parity_codec::Encode::encode(&tmp) + } +} + +impl Decode for BabePreDigest { + fn decode(i: &mut R) -> Option { + let (output, proof, public_key, slot_num): TmpDecode = Decode::decode(i)?; + Some(BabePreDigest { + proof: VRFProof::from_bytes(&proof).ok()?, + vrf_output: VRFOutput::from_bytes(&output).ok()?, + author: Public(public_key), + slot_num, + }) + } +} + +/// A digest item which is usable with BABE consensus. +pub trait CompatibleDigestItem: Sized { + /// Construct a digest item which contains a BABE pre-digest. + fn babe_pre_digest(seal: BabePreDigest) -> Self; + + /// If this item is an BABE pre-digest, return it. + fn as_babe_pre_digest(&self) -> Option; + + /// Construct a digest item which contains a BABE seal. + fn babe_seal(signature: Signature) -> Self; + + /// If this item is a BABE signature, return the signature. + fn as_babe_seal(&self) -> Option; +} + +impl CompatibleDigestItem for DigestItem> +{ + fn babe_pre_digest(digest: BabePreDigest) -> Self { + DigestItem::PreRuntime(BABE_ENGINE_ID, digest.encode()) + } + + fn as_babe_pre_digest(&self) -> Option { + match self { + DigestItem::PreRuntime(BABE_ENGINE_ID, seal) => { + let decoded = Decode::decode(&mut &seal[..]); + if decoded.is_none() { + info!(target: "babe", "Failed to decode {:?}", seal) + } + decoded + } + _ => { + info!(target: "babe", "Invalid consensus: {:?}!", self); + None + } + } + } + + fn babe_seal(signature: Signature) -> Self { + DigestItem::Seal(BABE_ENGINE_ID, signature.encode()) + } + + fn as_babe_seal(&self) -> Option { + match self { + DigestItem::Seal(BABE_ENGINE_ID, signature) => Decode::decode(&mut &signature[..]), + _ => None, + } + } +} + +impl CompatibleDigestItem for DigestItem +{ + fn babe_pre_digest(digest: BabePreDigest) -> Self { + DigestItem::PreRuntime(BABE_ENGINE_ID, digest.encode()) + } + + fn as_babe_pre_digest(&self) -> Option { + match self { + DigestItem::PreRuntime(BABE_ENGINE_ID, seal) => Decode::decode(&mut &seal[..]), + _ => None, + } + } + + fn babe_seal(signature: Signature) -> Self { + DigestItem::Seal(BABE_ENGINE_ID, signature) + } + + fn as_babe_seal(&self) -> Option { + match self { + DigestItem::Seal(BABE_ENGINE_ID, signature) => Some(signature.clone()), + _ => None, + } + } +} \ No newline at end of file diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 72a4e55a30..2d1afb0187 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -16,7 +16,7 @@ //! # BABE consensus //! -//! BABE (Blind Assignment for Blockchain Extension) consensus in substrate. +//! BABE (Blind Assignment for Blockchain Extension) consensus in Substrate. //! //! # Stability //! @@ -26,32 +26,42 @@ #![forbid(unsafe_code, missing_docs)] #![deny(warnings)] extern crate core; +mod digest; +use digest::CompatibleDigestItem; +pub use digest::{BabePreDigest, BABE_VRF_PREFIX}; 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, + SimpleBitOps, }; -use std::{sync::Arc, u64, fmt::Debug}; -use parity_codec::{Decode, Encode, Input}; +use std::{sync::Arc, u64, fmt::{Debug, Display}}; +use runtime_support::serde::{Serialize, Deserialize}; +use parity_codec::{Decode, Encode}; use primitives::{ crypto::Pair, - sr25519::{Public, Signature, LocalizedSignature, self}, + sr25519::{Public, Signature, self}, }; use merlin::Transcript; use inherents::{InherentDataProviders, InherentData}; -use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_WARN, CONSENSUS_INFO}; +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, + VRFProof, VRFProofBatchable, VRFInOut, }, - PUBLIC_KEY_LENGTH, SIGNATURE_LENGTH, }; use authorities::AuthoritiesApi; -use consensus_common::{self, Authorities, BlockImport, Environment, Proposer, +use consensus_common::{ + self, Authorities, BlockImport, Environment, Proposer, ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, }; use srml_babe::{ @@ -74,92 +84,10 @@ 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. +// and `super::babe::Config` can be eliminated. // https://github.com/paritytech/substrate/issues/2434 pub struct Config(slots::SlotDuration); @@ -191,45 +119,6 @@ impl Config { } } -/// 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 { @@ -280,7 +169,7 @@ pub struct BabeParams { } /// Start the babe worker. The returned future should be run in a tokio runtime. -pub fn start_babe(BabeParams { +pub fn start_babe(BabeParams { config, local_key, client, @@ -295,17 +184,22 @@ pub fn start_babe(BabeParams { impl Future, consensus_common::Error, > where - B: Block, + B: Block, C: ProvideRuntimeApi + ProvideCache, C::Api: AuthoritiesApi, - E: Environment, + SC: SelectChain, + generic::DigestItem: DigestItem, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, + DigestItemFor: CompatibleDigestItem + DigestItem, + H: Header< + Digest=generic::Digest>, + Hash=B::Hash, + >, + E: Environment, I: BlockImport + Send + Sync + 'static, + Error: std::error::Error + Send + From<::consensus_common::Error> + From + '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 { @@ -339,15 +233,22 @@ struct BabeWorker { threshold: u64, } -impl SlotWorker for BabeWorker where +impl SlotWorker for BabeWorker where + B: Block, C: ProvideRuntimeApi + ProvideCache, C::Api: AuthoritiesApi, E: Environment, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, + Hash: Debug + Eq + Copy + SimpleBitOps + Encode + Decode + Serialize + + for<'de> Deserialize<'de> + Debug + Default + AsRef<[u8]> + AsMut<[u8]> + + std::hash::Hash + Display + Send + Sync + 'static, + H: Header< + Digest=generic::Digest>, + Hash=B::Hash, + >, 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>; @@ -399,7 +300,7 @@ impl SlotWorker for BabeWorker whe // 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( + let proposal_work = if let Some((inout, proof, _batchable_proof)) = claim_slot( &[0u8; 0], slot_info.number, &[0u8; 0], @@ -429,105 +330,133 @@ impl SlotWorker for BabeWorker whe } }; + let inherent_digest = BabePreDigest { + proof, + vrf_output: inout.to_output(), + author: pair.public(), + slot_num, + }; + + // deadline our production to approx. the end of the slot let remaining_duration = slot_info.remaining_duration(); - // deadline our production to approx. the end of the - // slot - (Timeout::new( + Timeout::new( proposer.propose( slot_info.inherent_data, + generic::Digest { + logs: vec![ + generic::DigestItem::babe_pre_digest(inherent_digest.clone()), + ], + }, 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 - ); + 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 pre_digest: Result = find_pre_digest::(&header); + if let Err(e) = pre_digest { + error!(target: "babe", "FATAL ERROR: Invalid pre-digest: {}!", e); + return + } else { + trace!(target: "babe", "Got correct number of seals. Good!") + }; + + let header_num = header.number().clone(); + let parent_hash = header.parent_hash().clone(); + + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let header_hash = header.hash(); + let signature = pair.sign(header_hash.as_ref()); + let signature_digest_item = DigestItemFor::::babe_seal(signature); + + let import_block: ImportBlock = ImportBlock { + origin: BlockOrigin::Own, + header, + justification: None, + post_digests: vec![signature_digest_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(), + header_hash, + ); + telemetry!(CONSENSUS_INFO; "babe.pre_sealed_block"; + "header_num" => ?header_num, + "hash_now" => ?import_block.post_header().hash(), + "hash_previously" => ?header_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)).into() + })) + } +} + +macro_rules! babe_err { + ($($i: expr),+) => { + { debug!(target: "babe", $($i),+) + ; format!($($i),+) + } + }; +} - 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)) - }) - ) +fn find_pre_digest(header: &B::Header) -> Result + where DigestItemFor: CompatibleDigestItem, +{ + let mut pre_digest: Option<_> = None; + for log in header.digest().logs() { + trace!(target: "babe", "Checking log {:?}", log); + match (log.as_babe_pre_digest(), pre_digest.is_some()) { + (Some(_), true) => Err(babe_err!("Multiple BABE pre-runtime headers, rejecting!"))?, + (None, _) => trace!(target: "babe", "Ignoring digest not meant for us"), + (s, false) => pre_digest = s, + } } + pre_digest.ok_or_else(|| babe_err!("No BABE pre-runtime digest found")) } /// 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`. +/// The seal must be the last digest. Otherwise, the whole header is considered +/// unsigned. This is required for security and must not be changed. +/// +/// This digest item will always return `Some` when used with `as_babe_pre_digest`. // // FIXME #1018 needs misbehavior types #[forbid(warnings)] @@ -538,36 +467,31 @@ fn check_header( hash: B::Hash, authorities: &[Public], threshold: u64, -) -> Result>, String> +) -> Result, DigestItemFor)>, String> where DigestItemFor: CompatibleDigestItem, { trace!(target: "babe", "Checking header"); - let digest_item = match header.digest_mut().pop() { + let seal = match header.digest_mut().pop() { Some(x) => x, - None => return Err(format!("Header {:?} is unsealed", hash)), + None => return Err(babe_err!("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) + let sig = seal.as_babe_seal().ok_or_else(|| { + babe_err!("Header {:?} has a bad seal", hash) })?; + let pre_digest = find_pre_digest::(&header)?; + let BabePreDigest { slot_num, ref author, ref proof, ref vrf_output } = pre_digest; + if slot_num > slot_now { - header.digest_mut().push(digest_item); + header.digest_mut().push(seal); 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 if !authorities.contains(&author) { + Err(babe_err!("Slot author not found")) } 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) { + if sr25519::Pair::verify(&sig, pre_hash, author) { let (inout, _batchable_proof) = { let transcript = make_transcript( Default::default(), @@ -575,41 +499,39 @@ fn check_header( Default::default(), 0, ); - schnorrkel::PublicKey::from_bytes(signer.as_slice()).and_then(|p| { - p.vrf_verify(transcript, &vrf_output, &proof) + schnorrkel::PublicKey::from_bytes(author.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") + babe_err!("VRF verification failed: {:?}", s) })? }; - 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)) + if !check(&inout, threshold) { + return Err(babe_err!("VRF verification of block by author {:?} failed: \ + threshold {} exceeded", author, threshold)) + } + match check_equivocation(&client, slot_now, slot_num, header.clone(), author.clone()) { + Ok(Some(equivocation_proof)) => { + let log_str = format!( + "Slot author {:?} is equivocating at slot {} with headers {:?} and {:?}", + author, + slot_num, + equivocation_proof.fst_header().hash(), + equivocation_proof.snd_header().hash(), + ); + info!(target: "babe", "{}", log_str); + Err(log_str) + }, + Ok(None) => { + let pre_digest = CompatibleDigestItem::babe_pre_digest(pre_digest); + Ok(CheckedHeader::Checked(header, (pre_digest, seal))) + }, + Err(e) => { + Err(e.to_string()) + }, } } else { - debug!(target: "babe", "Bad signature on {:?}", hash); - Err(format!("Bad signature on {:?}", hash)) + Err(babe_err!("Bad signature on {:?}", hash)) } } } @@ -681,6 +603,8 @@ impl Verifier for BabeVerifier where justification, body, ); + + debug!(target: "babe", "We have {:?} logs in this header", header.digest().logs().len()); let mut inherent_data = self .inherent_data_providers .create_inherent_data() @@ -709,9 +633,9 @@ impl Verifier for BabeVerifier where 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"); + CheckedHeader::Checked(pre_header, (pre_digest, seal)) => { + let BabePreDigest { slot_num, .. } = pre_digest.as_babe_pre_digest() + .expect("check_header always returns a pre-digest 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 @@ -738,6 +662,10 @@ impl Verifier for BabeVerifier 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, @@ -750,7 +678,7 @@ impl Verifier for BabeVerifier where }; // FIXME #1019 extract authorities - Ok((import_block, None)) + Ok((import_block, new_authorities)) } CheckedHeader::Deferred(a, b) => { debug!(target: "babe", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); @@ -820,6 +748,7 @@ fn get_keypair(q: &sr25519::Pair) -> &Keypair { q.as_ref() } +#[allow(deprecated)] fn make_transcript( randomness: &[u8], slot_number: u64, @@ -871,7 +800,8 @@ fn claim_slot( #[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 +// FIXME #2532: need to allow deprecated until refactor is done +// https://github.com/paritytech/substrate/issues/2532 mod tests { use super::*; @@ -880,16 +810,18 @@ mod tests { use consensus_common::NoNetwork as DummyOracle; use network::test::*; use network::test::{Block as TestBlock, PeersClient}; - use runtime_primitives::traits::Block as BlockT; + use runtime_primitives::traits::{Block as BlockT, DigestFor}; use network::config::ProtocolConfig; use parking_lot::Mutex; use tokio::runtime::current_thread; use keyring::sr25519::Keyring; + use super::generic::DigestItem; use client::BlockchainEvents; use test_client; use futures::stream::Stream; use log::debug; use std::time::Duration; + type Item = generic::DigestItem; use test_client::AuthorityKeyring; use primitives::hash::H256; use runtime_primitives::testing::{Header as HeaderTest, Digest as DigestTest, Block as RawBlock, ExtrinsicWrapper}; @@ -922,8 +854,8 @@ mod tests { type Error = Error; type Create = Result; - fn propose(&self, _: InherentData, _: Duration) -> Result { - self.1.new_block().unwrap().bake().map_err(|e| e.into()) + fn propose(&self, _: InherentData, digests: DigestFor, _: Duration) -> Result { + self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) } } @@ -1020,26 +952,30 @@ mod tests { 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 { + let pre_digest = BabePreDigest { proof, - signature: LocalizedSignature { - signature, - signer: pair.public(), - }, + author: pair.public(), slot_num, vrf_output: inout.to_output(), - }); - + }; + assert_eq!( + Decode::decode(&mut &pre_digest.encode()[..]).as_ref(), + Some(&pre_digest), + "Pre-digest encoding and decoding did not round-trip", + ); + let item = generic::DigestItem::babe_pre_digest(pre_digest); header.digest_mut().push(item); + + let to_sign = header.hash(); + let signature = pair.sign(&to_sign[..]); + header.digest_mut().push(generic::DigestItem::babe_seal(signature)); (header, pre_hash) } #[test] fn can_serialize_block() { drop(env_logger::try_init()); - assert!(BabeSeal::decode(&mut &b""[..]).is_none()); + assert!(BabePreDigest::decode(&mut &b""[..]).is_none()); } #[test] @@ -1118,26 +1054,28 @@ mod tests { } #[test] - #[allow(deprecated)] - #[should_panic] - fn old_seals_rejected() { + fn wrong_consensus_engine_id_rejected() { drop(env_logger::try_init()); - generic::DigestItem::::Seal(0, Signature([0; 64])).as_babe_seal().unwrap(); + let sig = sr25519::Pair::generate().sign(b""); + let bad_seal: Item = DigestItem::Seal([0; 4], sig); + assert!(bad_seal.as_babe_pre_digest().is_none()); + assert!(bad_seal.as_babe_seal().is_none()) } #[test] - fn wrong_number_rejected() { + fn malformed_pre_digest_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()) + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, Signature([0; 64])); + assert!(bad_seal.as_babe_pre_digest().is_none()); } #[test] - #[should_panic] - fn bad_seal_rejected() { + fn sig_is_not_pre_digest() { 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"); + let sig = sr25519::Pair::generate().sign(b""); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig); + assert!(bad_seal.as_babe_pre_digest().is_none()); + assert!(bad_seal.as_babe_seal().is_some()) } #[test] @@ -1172,6 +1110,7 @@ mod tests { #[test] fn check_header_works_with_equivocation() { + drop(env_logger::try_init()); let client = test_client::new(); let pair = sr25519::Pair::generate(); let public = pair.public(); diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index 26ae181b51..d44aa0b93a 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -37,7 +37,7 @@ use std::sync::Arc; use std::thread; use runtime_primitives::traits::{ - AuthorityIdFor, Block as BlockT, Header as HeaderT, NumberFor + AuthorityIdFor, Block as BlockT, Header as HeaderT, NumberFor, Digest, }; use runtime_primitives::Justification; @@ -873,6 +873,8 @@ pub fn import_single_block>( }, }; + trace!(target: "sync", "Header {} has {:?} logs", block.hash, header.digest().logs().len()); + let number = header.number().clone(); let hash = header.hash(); let parent = header.parent_hash().clone(); diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index 2d6c53d164..140aa57901 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -33,7 +33,7 @@ use std::sync::Arc; use std::time::Duration; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{AuthorityIdFor, Block}; +use runtime_primitives::traits::{AuthorityIdFor, Block, DigestFor}; use futures::prelude::*; pub use inherents::InherentData; @@ -87,7 +87,12 @@ pub trait Proposer { /// Future that resolves to a committed proposal. type Create: IntoFuture; /// Create a proposal. - fn propose(&self, inherent_data: InherentData, max_duration: Duration) -> Self::Create; + fn propose( + &self, + inherent_data: InherentData, + inherent_digests: DigestFor, + max_duration: Duration, + ) -> Self::Create; } /// An oracle for when major synchronization work is being undertaken. diff --git a/core/consensus/common/src/select_chain.rs b/core/consensus/common/src/select_chain.rs index 47c65d1fe7..9ab21cba13 100644 --- a/core/consensus/common/src/select_chain.rs +++ b/core/consensus/common/src/select_chain.rs @@ -19,13 +19,13 @@ 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 +/// 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. +/// `_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 @@ -51,4 +51,4 @@ pub trait SelectChain: Sync + Send + Clone { ) -> Result::Hash>, Error> { Ok(Some(target_hash)) } -} \ No newline at end of file +} diff --git a/core/consensus/slots/src/aux_schema.rs b/core/consensus/slots/src/aux_schema.rs index 44f4ca5983..3d4a11d487 100644 --- a/core/consensus/slots/src/aux_schema.rs +++ b/core/consensus/slots/src/aux_schema.rs @@ -30,7 +30,7 @@ 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> +fn load_decode(backend: Arc, key: &[u8]) -> ClientResult> where C: AuxStore, T: Decode, diff --git a/core/executor/src/allocator.rs b/core/executor/src/allocator.rs index 4b3f7d3219..bf01dd2e90 100644 --- a/core/executor/src/allocator.rs +++ b/core/executor/src/allocator.rs @@ -163,8 +163,7 @@ impl FreeingBumpHeapAllocator { } fn le_bytes_to_u32(arr: [u8; 4]) -> u32 { - let bytes = [arr[0], arr[1], arr[2], arr[3]]; - unsafe { std::mem::transmute::<[u8; 4], u32>(bytes) }.to_le() + u32::from_le_bytes(arr) } fn write_u32_into_le_bytes(bytes: u32, slice: &mut [u8]) { diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index bed60666f7..464531a5a1 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -483,10 +483,10 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let key = this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_twox_128"))?; let hashed_key = twox_128(&key); debug_trace!(target: "xxhash", "XXhash: {} -> {}", - if let Ok(_skey) = ::std::str::from_utf8(&key) { - _skey + &if let Ok(_skey) = ::std::str::from_utf8(&key) { + *_skey } else { - &format!("{}", HexDisplay::from(&key)) + format!("{}", HexDisplay::from(&key)) }, HexDisplay::from(&hashed_key) ); diff --git a/core/executor/wasm/Cargo.lock b/core/executor/wasm/Cargo.lock index 8c53b790d8..b2d77765f7 100644 --- a/core/executor/wasm/Cargo.lock +++ b/core/executor/wasm/Cargo.lock @@ -87,12 +87,12 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.3" 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)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -201,7 +201,7 @@ dependencies = [ "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (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)", + "primitive-types 0.2.3 (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 2.0.0", ] @@ -226,7 +226,7 @@ dependencies = [ [[package]] name = "uint" -version = "0.6.1" +version = "0.7.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)", @@ -252,7 +252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "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 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-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "ffe022fb8c8bd254524b0b3305906c1921fa37a84a644e29079a9e62200c3901" "checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5" @@ -264,5 +264,5 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum uint 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91bb295c2c53c54742a6b8acb705114f6dfdf3c42becdb146a662cb77fcc0d02" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index c80b65741b..4ad1844358 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -117,7 +117,7 @@ impl AuthoritySetForFinalityChecker for Arc = Decode::decode(&mut &authorities[..]) diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index 6d64ad6778..e397bcf469 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -317,7 +317,7 @@ where // for the canon block the new authority set should start // with. we use the minimum between the median and the local // best finalized block. - + #[allow(deprecated)] let best_finalized_number = self.inner.backend().blockchain().info() .map_err(|e| ConsensusError::ClientImport(e.to_string()))? diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 455afb865a..5b4fa9155a 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -1067,7 +1067,7 @@ fn allows_reimporting_change_blocks() { let (block_import, ..) = net.make_block_import(client.clone()); let full_client = client.as_full().unwrap(); - let builder = full_client.new_block_at(&BlockId::Number(0)).unwrap(); + let builder = full_client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); let block = builder.bake().unwrap(); api.scheduled_changes.lock().insert(*block.header.parent_hash(), ScheduledChange { next_authorities: make_ids(peers_b), @@ -1116,7 +1116,7 @@ fn test_bad_justification() { let (block_import, ..) = net.make_block_import(client.clone()); 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 builder = full_client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); let block = builder.bake().unwrap(); api.scheduled_changes.lock().insert(*block.header.parent_hash(), ScheduledChange { next_authorities: make_ids(peers_b), @@ -1480,7 +1480,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ runner_net.lock().add_light_peer(&GrandpaTestNet::default_config()); runner_net.lock().sync_without_disconnects(); - // check block, finalized on light client + // 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 }, diff --git a/core/network/src/on_demand.rs b/core/network/src/on_demand.rs index 9ce75c4749..90051e9caf 100644 --- a/core/network/src/on_demand.rs +++ b/core/network/src/on_demand.rs @@ -297,7 +297,7 @@ impl OnDemandCore where self.idle_peers.push_back(peer.clone()); self.best_blocks.insert(peer, best_number); - + self.dispatch(network); } @@ -1010,7 +1010,7 @@ pub mod tests { assert_eq!(result, Some(vec![42])); }); - on_demand.on_remote_read_response(&mut network_interface, + on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], diff --git a/core/network/src/test/block_import.rs b/core/network/src/test/block_import.rs index 550d3c75ed..4cf639484f 100644 --- a/core/network/src/test/block_import.rs +++ b/core/network/src/test/block_import.rs @@ -26,9 +26,14 @@ struct TestLink {} impl Link for TestLink {} -fn prepare_good_block() -> (client::Client, Hash, u64, PeerId, IncomingBlock) { +fn prepare_good_block() -> (client::Client< + test_client::Backend, + test_client::Executor, + Block, + test_client::runtime::RuntimeApi, + >, Hash, u64, PeerId, IncomingBlock) { let client = test_client::new(); - let block = client.new_block().unwrap().bake().unwrap(); + let block = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::File, block).unwrap(); let (hash, number) = (client.block_hash(1).unwrap().unwrap(), 1); diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 9e2059fd61..f31a93cf28 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -636,7 +636,8 @@ impl> Peer { 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 = full_client.new_block_at(&BlockId::Hash(at)).unwrap(); + let builder = full_client.new_block_at(&BlockId::Hash(at), Default::default() + ).unwrap(); let block = edit_block(builder); let hash = block.header.hash(); trace!( diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 0875de55b7..ab34cfcd13 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -11,7 +11,7 @@ rustc-hex = { version = "2.0", 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"] } +primitive-types = { version = "0.2.3", 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 } diff --git a/core/rpc/src/chain/tests.rs b/core/rpc/src/chain/tests.rs index 26b7202305..02507442d5 100644 --- a/core/rpc/src/chain/tests.rs +++ b/core/rpc/src/chain/tests.rs @@ -68,7 +68,7 @@ fn should_return_a_block() { subscriptions: Subscriptions::new(remote), }; - let block = api.client.new_block().unwrap().bake().unwrap(); + let block = api.client.new_block(Default::default()).unwrap().bake().unwrap(); let block_hash = block.hash(); api.client.import(BlockOrigin::Own, block).unwrap(); @@ -138,7 +138,7 @@ fn should_return_block_hash() { Ok(None) ); - let block = client.client.new_block().unwrap().bake().unwrap(); + let block = client.client.new_block(Default::default()).unwrap().bake().unwrap(); client.client.import(BlockOrigin::Own, block.clone()).unwrap(); assert_matches!( @@ -172,7 +172,7 @@ fn should_return_finalized_hash() { ); // import new block - let builder = client.client.new_block().unwrap(); + let builder = client.client.new_block(Default::default()).unwrap(); client.client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); // no finalization yet assert_matches!( @@ -205,7 +205,7 @@ fn should_notify_about_latest_block() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let builder = api.client.new_block().unwrap(); + let builder = api.client.new_block(Default::default()).unwrap(); api.client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); } @@ -236,7 +236,7 @@ fn should_notify_about_finalized_block() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let builder = api.client.new_block().unwrap(); + let builder = api.client.new_block(Default::default()).unwrap(); api.client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); api.client.finalize_block(BlockId::number(1), None, true).unwrap(); } diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 14b6506f29..889c181415 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -99,7 +99,7 @@ fn should_notify_about_storage_changes() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let mut builder = api.client.new_block().unwrap(); + let mut builder = api.client.new_block(Default::default()).unwrap(); builder.push_transfer(runtime::Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Ferdie.into(), @@ -134,7 +134,7 @@ fn should_send_initial_storage_changes_and_notifications() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let mut builder = api.client.new_block().unwrap(); + let mut builder = api.client.new_block(Default::default()).unwrap(); builder.push_transfer(runtime::Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Ferdie.into(), @@ -168,7 +168,7 @@ fn should_query_storage() { let api = State::new(client.clone(), Subscriptions::new(core.executor())); let add_block = |nonce| { - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push_transfer(runtime::Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Ferdie.into(), diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 238d84b522..0d9d7dcdfc 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -655,7 +655,7 @@ mod tests { pool.submit_one(&BlockId::hash(best.hash()), transaction.clone()).unwrap(); // import the block - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push(transaction.clone()).unwrap(); let block = builder.bake().unwrap(); let id = BlockId::hash(block.header().hash()); diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index ca008444e1..ff462d9e2a 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -171,7 +171,7 @@ fn record_proof_works() { // Build the block and record proof let mut builder = client - .new_block_at_with_proof_recording(&block_id) + .new_block_at_with_proof_recording(&block_id, Default::default()) .expect("Creates block builder"); builder.push(transaction.clone()).unwrap(); let (block, proof) = builder.bake_and_extract_proof().expect("Bake block"); 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 index 7158630793..b887083800 100644 --- a/core/sr-api-macros/tests/ui/invalid_api_version_2.rs +++ b/core/sr-api-macros/tests/ui/invalid_api_version_2.rs @@ -8,4 +8,3 @@ decl_runtime_apis! { } fn main() {} - diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index 265ceb5941..8f7055b843 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -62,7 +62,6 @@ impl traits::Digest for Digest where /// provide opaque access to other items. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -#[allow(deprecated)] pub enum DigestItem { /// System digest item announcing that authorities set has been changed /// in the block. Contains the new set of authorities. @@ -71,14 +70,19 @@ pub enum DigestItem { /// block. It is created for every block iff runtime supports changes /// trie creation. ChangesTrieRoot(Hash), - /// The old way to put a Seal on it. 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 + /// A message from the runtime to the consensus engine. This should *never* + /// be generated by the native code of any consensus engine, but this is not + /// checked (yet). Consensus(ConsensusEngineId, Vec), + /// Put a Seal on it. + Seal(ConsensusEngineId, SealSignature), + /// A pre-runtime digest. + /// + /// These are messages from the consensus engine to the runtime, although + /// the consensus engine can (and should) read them itself to avoid + /// code and state duplication. It is erroneous for a runtime to produce + /// these, but this is not (yet) checked. + PreRuntime(ConsensusEngineId, Vec), /// Any 'non-system' digest item, opaque to the native code. Other(Vec), } @@ -97,20 +101,26 @@ impl ::serde::Serializ /// final runtime implementations for encoding/decoding its log items. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -#[allow(deprecated)] pub enum DigestItemRef<'a, Hash: 'a, AuthorityId: 'a, SealSignature: 'a> { /// Reference to `DigestItem::AuthoritiesChange`. AuthoritiesChange(&'a [AuthorityId]), /// Reference to `DigestItem::ChangesTrieRoot`. ChangesTrieRoot(&'a Hash), - /// A deprecated sealed signature for testing - #[deprecated] - Seal(&'a u64, &'a SealSignature), - /// A sealed signature for testing - Consensus(&'a ConsensusEngineId, &'a [u8]), + /// A message from the runtime to the consensus engine. This should *never* + /// be generated by the native code of any consensus engine, but this is not + /// checked (yet). + Consensus(&'a ConsensusEngineId, &'a Vec), + /// Put a Seal on it. + Seal(&'a ConsensusEngineId, &'a SealSignature), + /// A pre-runtime digest. + /// + /// These are messages from the consensus engine to the runtime, although + /// the consensus engine can (and should) read them itself to avoid + /// code and state duplication. It is erroneous for a runtime to produce + /// these, but this is not (yet) checked. + PreRuntime(&'a ConsensusEngineId, &'a Vec), /// Any 'non-system' digest item, opaque to the native code. - /// Reference to `DigestItem::Other`. - Other(&'a [u8]), + Other(&'a Vec), } /// Type of the digest item. Used to gain explicit control over `DigestItem` encoding @@ -123,8 +133,9 @@ enum DigestItemType { Other = 0, AuthoritiesChange = 1, ChangesTrieRoot = 2, - Seal = 3, Consensus = 4, + Seal = 5, + PreRuntime = 6, } impl DigestItem { @@ -137,13 +148,13 @@ impl DigestItem(&'a self) -> DigestItemRef<'a, Hash, AuthorityId, SealSignature> { match *self { DigestItem::AuthoritiesChange(ref v) => DigestItemRef::AuthoritiesChange(v), DigestItem::ChangesTrieRoot(ref v) => DigestItemRef::ChangesTrieRoot(v), - DigestItem::Seal(ref v, ref s) => DigestItemRef::Seal(v, s), DigestItem::Consensus(ref v, ref s) => DigestItemRef::Consensus(v, s), + DigestItem::Seal(ref v, ref s) => DigestItemRef::Seal(v, s), + DigestItem::PreRuntime(ref v, ref s) => DigestItemRef::PreRuntime(v, s), DigestItem::Other(ref v) => DigestItemRef::Other(v), } } @@ -164,6 +175,10 @@ impl< fn as_changes_trie_root(&self) -> Option<&Self::Hash> { self.dref().as_changes_trie_root() } + + fn as_pre_runtime(&self) -> Option<(ConsensusEngineId, &[u8])> { + self.dref().as_pre_runtime() + } } impl Encode for DigestItem { @@ -183,14 +198,18 @@ impl Decode for Digest DigestItemType::ChangesTrieRoot => Some(DigestItem::ChangesTrieRoot( Decode::decode(input)?, )), - DigestItemType::Seal => { - let vals: (u64, SealSignature) = Decode::decode(input)?; - Some(DigestItem::Seal(vals.0, vals.1)) - }, DigestItemType::Consensus => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; Some(DigestItem::Consensus(vals.0, vals.1)) } + DigestItemType::Seal => { + let vals: (ConsensusEngineId, SealSignature) = Decode::decode(input)?; + Some(DigestItem::Seal(vals.0, vals.1)) + }, + DigestItemType::PreRuntime => { + let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; + Some(DigestItem::PreRuntime(vals.0, vals.1)) + }, DigestItemType::Other => Some(DigestItem::Other( Decode::decode(input)?, )), @@ -214,9 +233,16 @@ impl<'a, Hash: Codec + Member, AuthorityId: Codec + Member, SealSignature: Codec _ => None, } } + + /// Cast this digest item into `PreRuntime` + pub fn as_pre_runtime(&self) -> Option<(ConsensusEngineId, &'a [u8])> { + match *self { + DigestItemRef::PreRuntime(consensus_engine_id, ref data) => Some((*consensus_engine_id, data)), + _ => None, + } + } } -#[allow(deprecated)] impl<'a, Hash: Encode, AuthorityId: Encode, SealSignature: Encode> Encode for DigestItemRef<'a, Hash, AuthorityId, SealSignature> { fn encode(&self) -> Vec { let mut v = Vec::new(); @@ -230,13 +256,17 @@ impl<'a, Hash: Encode, AuthorityId: Encode, SealSignature: Encode> Encode for Di DigestItemType::ChangesTrieRoot.encode_to(&mut v); changes_trie_root.encode_to(&mut v); }, + DigestItemRef::Consensus(val, data) => { + DigestItemType::Consensus.encode_to(&mut v); + (val, data).encode_to(&mut v); + }, DigestItemRef::Seal(val, sig) => { DigestItemType::Seal.encode_to(&mut v); (val, sig).encode_to(&mut v); }, - DigestItemRef::Consensus(val, sig) => { - DigestItemType::Consensus.encode_to(&mut v); - (val, sig).encode_to(&mut v); + DigestItemRef::PreRuntime(val, data) => { + DigestItemType::PreRuntime.encode_to(&mut v); + (val, data).encode_to(&mut v); }, DigestItemRef::Other(val) => { DigestItemType::Other.encode_to(&mut v); @@ -254,20 +284,19 @@ mod tests { use substrate_primitives::hash::H512 as Signature; #[test] - #[allow(deprecated)] fn should_serialize_digest() { let digest = Digest { logs: vec![ DigestItem::AuthoritiesChange(vec![1]), DigestItem::ChangesTrieRoot(4), - DigestItem::Seal(1, Signature::from_low_u64_be(15)), DigestItem::Other(vec![1, 2, 3]), + DigestItem::Seal(Default::default(), Signature::default()) ], }; assert_eq!( ::serde_json::to_string(&digest).unwrap(), - r#"{"logs":["0x010401000000","0x0204000000","0x0301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f","0x000c010203"]}"# + "{\"logs\":[\"0x010401000000\",\"0x0204000000\",\"0x000c010203\",\"0x050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"]}", ); } } diff --git a/core/sr-primitives/src/generic/header.rs b/core/sr-primitives/src/generic/header.rs index efcc7614ed..fa94d97c64 100644 --- a/core/sr-primitives/src/generic/header.rs +++ b/core/sr-primitives/src/generic/header.rs @@ -18,9 +18,12 @@ #[cfg(feature = "std")] use serde::Serialize; +#[cfg(feature = "std")] +use log::debug; 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}; + Hash as HashT, DigestItem as DigestItemT, MaybeSerializeDebug, + MaybeSerializeDebugButNotDeserialize}; use crate::generic::Digest; /// Abstraction over a block header for a substrate chain. @@ -107,22 +110,29 @@ impl traits::Header for Header &Self::Digest { &self.digest } + + #[cfg(feature = "std")] + fn digest_mut(&mut self) -> &mut Self::Digest { + debug!(target: "header", "Retrieving mutable reference to digest"); + &mut self.digest + } + + #[cfg(not(feature = "std"))] fn digest_mut(&mut self) -> &mut Self::Digest { &mut self.digest } - fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, - digest: Self::Digest + digest: Self::Digest, ) -> Self { Header { number, extrinsics_root, state_root, parent_hash, - digest + digest, } } } diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 05938a6a82..e6cf9142ad 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -681,6 +681,10 @@ macro_rules! impl_outer_log { fn as_changes_trie_root(&self) -> Option<&Self::Hash> { self.dref().and_then(|dref| dref.as_changes_trie_root()) } + + fn as_pre_runtime(&self) -> Option<($crate::ConsensusEngineId, &[u8])> { + self.dref().and_then(|dref| dref.as_pre_runtime()) + } } impl From<$crate::generic::DigestItem<$($genarg),*>> for $name { diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index e8e5aa20b4..18c65d011e 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -107,21 +107,20 @@ impl traits::Header for Header { fn digest(&self) -> &Self::Digest { &self.digest } fn digest_mut(&mut self) -> &mut Self::Digest { &mut self.digest } - fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, - digest: Self::Digest + digest: Self::Digest, ) -> Self { Header { number, - extrinsics_root: extrinsics_root, + extrinsics_root, state_root, parent_hash, - digest + digest, } } } diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index dcfe8ffd24..5963450360 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -641,8 +641,6 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebugButNotDe fn digest(&self) -> &Self::Digest; /// Get a mutable reference to the digest. fn digest_mut(&mut self) -> &mut Self::Digest; - /// Sets the digest. - fn set_digest(&mut self, digest: Self::Digest); /// Returns the hash of the header. fn hash(&self) -> Self::Hash { @@ -780,11 +778,14 @@ pub trait DigestItem: Codec + Member + MaybeSerializeDebugButNotDeserialize { /// `AuthorityChange` payload. type AuthorityId: Member + MaybeHash + crate::codec::Encode + crate::codec::Decode; - /// Returns Some if the entry is the `AuthoritiesChange` entry. + /// Returns `Some` if the entry is the `AuthoritiesChange` entry. fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]>; - /// Returns Some if the entry is the `ChangesTrieRoot` entry. + /// Returns `Some` if the entry is the `ChangesTrieRoot` entry. fn as_changes_trie_root(&self) -> Option<&Self::Hash>; + + /// Returns `Some` if this entry is the `PreRuntime` entry. + fn as_pre_runtime(&self) -> Option<(super::ConsensusEngineId, &[u8])>; } /// Auxiliary wrapper that holds an api instance and binds it to the given lifetime. diff --git a/core/test-client/src/trait_tests.rs b/core/test-client/src/trait_tests.rs index a6da3b206b..c1df6ffdf8 100644 --- a/core/test-client/src/trait_tests.rs +++ b/core/test-client/src/trait_tests.rs @@ -50,14 +50,14 @@ pub fn test_leaves_for_backend(backend: Arc) where vec![genesis_hash]); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), vec![a1.hash()]); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); #[allow(deprecated)] @@ -66,28 +66,28 @@ pub fn test_leaves_for_backend(backend: Arc) where vec![a2.hash()]); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), vec![a3.hash()]); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), vec![a4.hash()]); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), vec![a5.hash()]); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -102,21 +102,21 @@ pub fn test_leaves_for_backend(backend: Arc) where vec![a5.hash(), b2.hash()]); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), vec![a5.hash(), b3.hash()]); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); assert_eq!( blockchain.leaves().unwrap(), vec![a5.hash(), b4.hash()]); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -131,7 +131,7 @@ pub fn test_leaves_for_backend(backend: Arc) where vec![a5.hash(), b4.hash(), c3.hash()]); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -160,27 +160,27 @@ pub fn test_children_for_backend(backend: Arc) where let blockchain = backend.blockchain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -192,15 +192,15 @@ pub fn test_children_for_backend(backend: Arc) where client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -212,7 +212,7 @@ pub fn test_children_for_backend(backend: Arc) where client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -250,27 +250,27 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -282,15 +282,15 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -302,7 +302,7 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 804d5411d6..d7dccd33be 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -21,7 +21,7 @@ use rstd::prelude::*; 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}; +use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Digest as DigestT, Header as _}; use runtime_primitives::generic; use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult, transaction_validity::TransactionValidity}; use parity_codec::{KeyedVec, Encode}; @@ -38,6 +38,7 @@ storage_items! { Number: b"sys:num" => BlockNumber; ParentHash: b"sys:pha" => required Hash; NewAuthorities: b"sys:new_auth" => Vec; + StorageDigest: b"sys:digest" => Digest; } pub fn balance_of_key(who: AccountId) -> Vec { @@ -67,6 +68,7 @@ pub fn initialize_block(header: &Header) { // populate environment. ::put(&header.number); ::put(&header.parent_hash); + ::put(header.digest()); storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32); } @@ -99,18 +101,17 @@ pub fn polish_block(block: &mut Block) { header.state_root = storage_root().into(); // check digest - let mut digest = Digest::default(); + let digest = &mut header.digest; if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into()) { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); } if let Some(new_authorities) = ::take() { digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); } - header.digest = digest; } -pub fn execute_block(block: Block) { - let ref header = block.header; +pub fn execute_block(mut block: Block) { + let header = &mut block.header; // check transaction trie root represents the transactions. let txs = block.extrinsics.iter().map(Encode::encode).collect::>(); @@ -132,14 +133,13 @@ pub fn execute_block(block: Block) { assert!(storage_root == header.state_root, "Storage root must match that calculated."); // check digest - let mut digest = Digest::default(); + let digest = &mut header.digest; if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into()) { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); } if let Some(new_authorities) = ::take() { digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); } - assert!(digest == header.digest, "Header digest items must match that calculated."); } /// The block executor. @@ -209,13 +209,16 @@ pub fn finalize_block() -> Header { let txs: Vec<_> = (0..extrinsic_index).map(ExtrinsicData::take).collect(); let txs = txs.iter().map(Vec::as_slice).collect::>(); let extrinsics_root = enumerated_trie_root::(&txs).into(); - + // let mut digest = Digest::default(); let number = ::take().expect("Number is set by `initialize_block`"); let parent_hash = ::take(); + let mut digest = ::take().expect("StorageDigest is set by `initialize_block`"); + + // This MUST come after all changes to storage are done. Otherwise we will fail the + // “Storage root does not match that calculated” assertion. let storage_root = BlakeTwo256::storage_root(); let storage_changes_root = BlakeTwo256::storage_changes_root(parent_hash); - let mut digest = Digest::default(); if let Some(storage_changes_root) = storage_changes_root { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root)); } diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index eaa9acbd45..8439721da3 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -1615,13 +1615,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.3" 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)", "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)", + "uint 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2492,7 +2492,7 @@ dependencies = [ "hex 0.3.2 (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.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)", + "primitive-types 0.2.3 (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)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2937,7 +2937,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.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)", @@ -3409,7 +3409,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "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" @@ -3508,7 +3508,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" +"checksum uint 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91bb295c2c53c54742a6b8acb705114f6dfdf3c42becdb146a662cb77fcc0d02" "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" diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index 5f46b360e4..c0d57e3fd9 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -1649,13 +1649,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.3" 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)", "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)", + "uint 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2619,7 +2619,7 @@ dependencies = [ "hex 0.3.2 (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.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)", + "primitive-types 0.2.3 (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)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3030,7 +3030,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.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)", @@ -3502,7 +3502,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "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" @@ -3601,7 +3601,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" +"checksum uint 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91bb295c2c53c54742a6b8acb705114f6dfdf3c42becdb146a662cb77fcc0d02" "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" diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 8813850bbd..6c4b93b2ad 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -38,13 +38,13 @@ mod tests { NativeOrEncoded}; use node_primitives::{Hash, BlockNumber, AccountId}; use runtime_primitives::traits::{Header as HeaderT, Hash as HashT, Digest, DigestItem}; - use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; + use runtime_primitives::{generic::{self, 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}; + SystemConfig, GrandpaConfig, IndicesConfig, Event, Log}; use wabt; use primitives::map; diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index bb066b1b98..03b3f1caad 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,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: 82, - impl_version: 82, + spec_version: 86, + impl_version: 87, apis: RUNTIME_API_VERSIONS, }; diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index 846857caa2..f564b3eca2 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -801,6 +801,14 @@ dependencies = [ "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "integer-sqrt" version = "0.1.2" @@ -1671,13 +1679,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" 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)", "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)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2674,6 +2682,7 @@ dependencies = [ "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)", + "parking_lot 0.7.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", @@ -2764,8 +2773,9 @@ dependencies = [ "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)", "impl-serde 0.1.1 (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.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)", + "primitive-types 0.2.4 (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)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2793,6 +2803,7 @@ version = "2.0.0" dependencies = [ "hash-db 0.12.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.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 2.0.0", @@ -3176,7 +3187,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.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)", @@ -3584,6 +3595,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "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" @@ -3657,7 +3669,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" "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" @@ -3757,7 +3769,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "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" diff --git a/scripts/flamingfir-deploy.sh b/scripts/flamingfir-deploy.sh index ffd3cab9d8..13be56dfbd 100755 --- a/scripts/flamingfir-deploy.sh +++ b/scripts/flamingfir-deploy.sh @@ -13,12 +13,12 @@ JOB_ID=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" --header "Conte echo "Launched job: $JOB_ID" -while [ ${RETRY_ATTEMPT} -le ${RETRY_COUNT} ] ; do +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 + sleep $SLEEP_TIME if [ $(echo $RETRY_RESULT | egrep -e successful -e failed) ] ; then - break + break fi done diff --git a/srml/aura/src/tests.rs b/srml/aura/src/tests.rs index e74c7dace2..3e20613c48 100644 --- a/srml/aura/src/tests.rs +++ b/srml/aura/src/tests.rs @@ -73,7 +73,7 @@ fn aura_reports_offline() { } with_externalities(&mut new_test_ext(vec![0, 1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); let slot_duration = Aura::slot_duration(); Aura::on_timestamp_set::(5 * slot_duration, slot_duration); @@ -82,7 +82,7 @@ fn aura_reports_offline() { // no slashing when last step was 0. assert_eq!(SLASH_COUNTS.lock().as_slice(), &[0, 0, 0, 0]); - System::initialize(&2, &header.hash(), &Default::default()); + System::initialize(&2, &header.hash(), &Default::default(), &Default::default()); Aura::on_timestamp_set::(8 * slot_duration, slot_duration); let _header = System::finalize(); diff --git a/srml/consensus/src/tests.rs b/srml/consensus/src/tests.rs index bf8b3a09f3..471cdf4979 100644 --- a/srml/consensus/src/tests.rs +++ b/srml/consensus/src/tests.rs @@ -26,7 +26,7 @@ use inherents::{InherentData, ProvideInherent}; #[test] fn authorities_change_logged() { with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Consensus::set_authorities(&[UintAuthorityId(4), UintAuthorityId(5), UintAuthorityId(6)]); Consensus::on_finalize(1); let header = System::finalize(); @@ -47,7 +47,7 @@ fn authorities_change_logged() { #[test] fn partial_authorities_change_logged() { with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&2, &Default::default(), &Default::default()); + System::initialize(&2, &Default::default(), &Default::default(), &Default::default()); Consensus::set_authorities(&[UintAuthorityId(2), UintAuthorityId(4), UintAuthorityId(5)]); Consensus::on_finalize(2); let header = System::finalize(); @@ -68,7 +68,7 @@ fn partial_authorities_change_logged() { #[test] fn authorities_change_is_not_logged_when_not_changed() { with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Consensus::on_finalize(1); let header = System::finalize(); assert_eq!(header.digest, testing::Digest { @@ -80,7 +80,7 @@ fn authorities_change_is_not_logged_when_not_changed() { #[test] fn authorities_change_is_not_logged_when_changed_back_to_original() { with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Consensus::set_authorities(&[UintAuthorityId(4), UintAuthorityId(5), UintAuthorityId(6)]); Consensus::set_authorities(&[UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]); Consensus::on_finalize(1); @@ -94,7 +94,7 @@ fn authorities_change_is_not_logged_when_changed_back_to_original() { #[test] fn offline_report_can_be_excluded() { with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); assert!(Consensus::create_inherent(&InherentData::new()).is_none()); let offline_report: Vec = vec![0]; @@ -110,7 +110,7 @@ fn set_and_kill_storage_work() { use srml_support::storage; with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); let item = (vec![42u8], vec![42u8]); diff --git a/srml/contract/src/tests.rs b/srml/contract/src/tests.rs index aeadc99353..29fc1d3a6d 100644 --- a/srml/contract/src/tests.rs +++ b/srml/contract/src/tests.rs @@ -736,7 +736,7 @@ fn deduct_blocks() { assert_eq!(bob_contract.rent_allowance, 1_000); // Advance 4 blocks - System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); @@ -751,7 +751,7 @@ fn deduct_blocks() { assert_eq!(Balances::free_balance(BOB), 30_000 - rent); // Advance 7 blocks more - System::initialize(&12, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&12, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); @@ -825,7 +825,7 @@ fn claim_surcharge(blocks: u64, trigger_call: impl Fn() -> bool, removes: bool) )); // Advance blocks - System::initialize(&blocks, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&blocks, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert!(trigger_call()); @@ -865,14 +865,14 @@ fn removals(trigger_call: impl Fn() -> bool) { assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); // Advance blocks - System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // 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()); + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent must have no effect assert!(trigger_call()); @@ -899,14 +899,14 @@ fn removals(trigger_call: impl Fn() -> bool) { assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 100); // Advance blocks - System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // 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()); + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent must have no effect assert!(trigger_call()); @@ -937,14 +937,14 @@ fn removals(trigger_call: impl Fn() -> bool) { assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); // Advance blocks - System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert!(trigger_call()); assert!(ContractInfoOf::::get(BOB).is_none()); // Advance blocks - System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent must have no effect assert!(trigger_call()); @@ -1027,7 +1027,7 @@ fn default_rent_allowance_on_create() { assert_eq!(bob_contract.rent_allowance, >::max_value()); // Advance blocks - System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); @@ -1179,7 +1179,7 @@ fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: } // Advance 4 blocks - System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); @@ -1198,7 +1198,7 @@ fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: if !test_restore_to_with_dirty_storage { // Advance 1 blocks - System::initialize(&6, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&6, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); } assert_ok!(Contract::call( diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 33d26ce42f..70285f7dfa 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -80,7 +80,7 @@ use rstd::result; use primitives::traits::{ self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalize, OnInitialize, Digest, NumberFor, Block as BlockT, OffchainWorker, - ValidateUnsigned, + ValidateUnsigned, DigestItem, }; use srml_support::{Dispatchable, traits::MakePayment}; use parity_codec::{Codec, Encode}; @@ -152,11 +152,13 @@ where { /// Start the execution of a particular block. pub fn initialize_block(header: &System::Header) { - Self::initialize_block_impl(header.number(), header.parent_hash(), header.extrinsics_root()); + let mut digests = System::Digest::default(); + header.digest().logs().iter().for_each(|d| if d.as_pre_runtime().is_some() { digests.push(d.clone()) }); + Self::initialize_block_impl(header.number(), header.parent_hash(), header.extrinsics_root(), &digests); } - fn initialize_block_impl(block_number: &System::BlockNumber, parent_hash: &System::Hash, extrinsics_root: &System::Hash) { - >::initialize(block_number, parent_hash, extrinsics_root); + fn initialize_block_impl(block_number: &System::BlockNumber, parent_hash: &System::Hash, extrinsics_root: &System::Hash, digest: &System::Digest) { + >::initialize(block_number, parent_hash, extrinsics_root, digest); >::on_initialize(*block_number); } @@ -262,7 +264,8 @@ where Payment::make_payment(sender, encoded_len).map_err(|_| internal::ApplyError::CantPay)?; // AUDIT: Under no circumstances may this function panic from here onwards. - + // FIXME: ensure this at compile-time (such as by not defining a panic function, forcing + // a linker error unless the compiler can prove it cannot be called). // increment nonce in storage >::inc_account_nonce(sender); } diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index 2276ad3155..9e83198502 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -344,7 +344,7 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { let mut parent_hash = System::parent_hash(); for i in 2..106 { - System::initialize(&i, &parent_hash, &Default::default()); + System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); FinalityTracker::on_finalize(i); let hdr = System::finalize(); parent_hash = hdr.hash(); @@ -369,7 +369,7 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { let mut parent_hash = System::parent_hash(); for i in 2..106 { - System::initialize(&i, &parent_hash, &Default::default()); + System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); assert_ok!(FinalityTracker::dispatch( Call::final_hint(i-1), Origin::NONE, diff --git a/srml/grandpa/src/tests.rs b/srml/grandpa/src/tests.rs index 560766f8c6..d19c5c25b6 100644 --- a/srml/grandpa/src/tests.rs +++ b/srml/grandpa/src/tests.rs @@ -30,7 +30,7 @@ use super::*; #[test] fn authorities_change_logged() { with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 0, None).unwrap(); System::note_finished_extrinsics(); @@ -56,7 +56,7 @@ fn authorities_change_logged() { #[test] fn authorities_change_logged_after_delay() { with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 1, None).unwrap(); Grandpa::on_finalize(1); let header = System::finalize(); @@ -69,7 +69,7 @@ fn authorities_change_logged_after_delay() { // no change at this height. assert_eq!(System::events(), vec![]); - System::initialize(&2, &header.hash(), &Default::default()); + System::initialize(&2, &header.hash(), &Default::default(), &Default::default()); System::note_finished_extrinsics(); Grandpa::on_finalize(2); @@ -87,7 +87,7 @@ fn authorities_change_logged_after_delay() { #[test] fn cannot_schedule_change_when_one_pending() { with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 1, None).unwrap(); assert!(Grandpa::pending_change().is_some()); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err()); @@ -95,14 +95,14 @@ fn cannot_schedule_change_when_one_pending() { Grandpa::on_finalize(1); let header = System::finalize(); - System::initialize(&2, &header.hash(), &Default::default()); + System::initialize(&2, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_some()); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err()); Grandpa::on_finalize(2); let header = System::finalize(); - System::initialize(&3, &header.hash(), &Default::default()); + System::initialize(&3, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_none()); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_ok()); @@ -130,7 +130,7 @@ fn new_decodes_from_old() { #[test] fn dispatch_forced_change() { with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Grandpa::schedule_change( vec![(4, 1), (5, 1), (6, 1)], 5, @@ -144,7 +144,7 @@ fn dispatch_forced_change() { let mut header = System::finalize(); for i in 2..7 { - System::initialize(&i, &header.hash(), &Default::default()); + System::initialize(&i, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().unwrap().forced.is_some()); assert_eq!(Grandpa::next_forced(), Some(11)); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err()); @@ -157,7 +157,7 @@ fn dispatch_forced_change() { // change has been applied at the end of block 6. // add a normal change. { - System::initialize(&7, &header.hash(), &Default::default()); + System::initialize(&7, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_none()); assert_eq!(Grandpa::grandpa_authorities(), vec![(4, 1), (5, 1), (6, 1)]); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_ok()); @@ -167,7 +167,7 @@ fn dispatch_forced_change() { // run the normal change. { - System::initialize(&8, &header.hash(), &Default::default()); + System::initialize(&8, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_some()); assert_eq!(Grandpa::grandpa_authorities(), vec![(4, 1), (5, 1), (6, 1)]); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err()); @@ -178,7 +178,7 @@ fn dispatch_forced_change() { // normal change applied. but we can't apply a new forced change for some // time. for i in 9..11 { - System::initialize(&i, &header.hash(), &Default::default()); + System::initialize(&i, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_none()); assert_eq!(Grandpa::grandpa_authorities(), vec![(5, 1)]); assert_eq!(Grandpa::next_forced(), Some(11)); @@ -188,7 +188,7 @@ fn dispatch_forced_change() { } { - System::initialize(&11, &header.hash(), &Default::default()); + System::initialize(&11, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_none()); assert!(Grandpa::schedule_change(vec![(5, 1), (6, 1), (7, 1)], 5, Some(0)).is_ok()); assert_eq!(Grandpa::next_forced(), Some(21)); diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index cf5f473bdc..7c4a95a30f 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -465,10 +465,16 @@ impl Module { } /// Start the execution of a particular block. - pub fn initialize(number: &T::BlockNumber, parent_hash: &T::Hash, txs_root: &T::Hash) { + pub fn initialize( + number: &T::BlockNumber, + parent_hash: &T::Hash, + txs_root: &T::Hash, + digest: &T::Digest, + ) { // populate environment storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32); >::put(number); + >::put(digest); >::put(parent_hash); >::insert(*number - One::one(), parent_hash); >::put(txs_root); @@ -553,38 +559,51 @@ impl Module { /// 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. + /// 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"[..])`. + /// 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". + /// 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 verifiable random function (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`. + /// 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-influnce 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 { @@ -606,8 +625,9 @@ impl Module { >::insert(who, Self::account_nonce(who) + T::Index::one()); } - /// 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 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. /// `execute_block` doesn't note any extrinsics. @@ -722,7 +742,7 @@ mod tests { #[test] fn deposit_event_should_work() { with_externalities(&mut new_test_ext(), || { - System::initialize(&1, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&1, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); System::note_finished_extrinsics(); System::deposit_event(1u16); System::finalize(); @@ -737,7 +757,7 @@ mod tests { ] ); - System::initialize(&2, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&2, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); System::deposit_event(42u16); System::note_applied_extrinsic(&Ok(()), 0); System::note_applied_extrinsic(&Err(""), 0); @@ -758,7 +778,7 @@ mod tests { with_externalities(&mut new_test_ext(), || { const BLOCK_NUMBER: u64 = 1; - System::initialize(&BLOCK_NUMBER, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&BLOCK_NUMBER, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); System::note_finished_extrinsics(); let topics = vec![ diff --git a/test-utils/transaction-factory/src/lib.rs b/test-utils/transaction-factory/src/lib.rs index b046cf74c9..8f292f3a02 100644 --- a/test-utils/transaction-factory/src/lib.rs +++ b/test-utils/transaction-factory/src/lib.rs @@ -148,7 +148,7 @@ where as ProvideRuntimeApi>::Api: BlockBuilder>, RA: RuntimeAdapter, { - let mut block = client.new_block().expect("Failed to create new block"); + let mut block = client.new_block(Default::default()).expect("Failed to create new block"); block.push( Decode::decode(&mut &transfer.encode()[..]) .expect("Failed to decode transfer extrinsic") diff --git a/test-utils/transaction-factory/src/modes.rs b/test-utils/transaction-factory/src/modes.rs index f3d278bbbf..a212d6aed8 100644 --- a/test-utils/transaction-factory/src/modes.rs +++ b/test-utils/transaction-factory/src/modes.rs @@ -38,4 +38,3 @@ impl FromStr for Mode { } } } - -- GitLab From 4ae2596928ba1dfebb3b7bca0b985bdefda196cc Mon Sep 17 00:00:00 2001 From: thiolliere Date: Wed, 29 May 2019 14:16:37 +0200 Subject: [PATCH 044/140] derive codec for inherent data (#2714) * derive codec for inherent data * increase spec version --- core/inherents/src/lib.rs | 29 +---------------------------- node/runtime/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/core/inherents/src/lib.rs b/core/inherents/src/lib.rs index 62b6f655cf..e851959ee0 100644 --- a/core/inherents/src/lib.rs +++ b/core/inherents/src/lib.rs @@ -53,7 +53,7 @@ pub use runtime_primitives::RuntimeString; pub type InherentIdentifier = [u8; 8]; /// Inherent data to include in a block. -#[derive(Clone, Default)] +#[derive(Clone, Default, Encode, Decode)] pub struct InherentData { /// All inherent data encoded with parity-codec and an identifier. data: BTreeMap> @@ -123,33 +123,6 @@ impl InherentData { } } -impl codec::Encode for InherentData { - fn encode(&self) -> Vec { - let keys = self.data.keys().collect::>(); - let values = self.data.values().collect::>(); - - let mut encoded = keys.encode(); - encoded.extend(values.encode()); - encoded - } -} - -impl codec::Decode for InherentData { - fn decode(value: &mut I) -> Option { - Vec::::decode(value) - .and_then(|i| Vec::>::decode(value).map(|v| (i, v))) - .and_then(|(i, v)| { - if i.len() == v.len() { - Some(Self { - data: i.into_iter().zip(v.into_iter()).collect() - }) - } else { - None - } - }) - } -} - /// The result of checking inherents. /// /// It either returns okay for all checks, stores all occurred errors or just one fatal error. diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 03b3f1caad..917e979d9f 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,7 +58,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 86, + spec_version: 87, impl_version: 87, apis: RUNTIME_API_VERSIONS, }; -- GitLab From b1a951c712c5ca335fa40f1f9f3c42c1ef8252f5 Mon Sep 17 00:00:00 2001 From: Kian Peymani Date: Wed, 29 May 2019 14:17:58 +0200 Subject: [PATCH 045/140] Limited Unbonding Chunks. (#2700) * Limit number of unlocking chunks. * Bump. --- node/runtime/src/lib.rs | 4 ++-- srml/staking/src/lib.rs | 17 +++++++++++++++-- srml/staking/src/tests.rs | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 917e979d9f..97d1b88cc2 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,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: 87, - impl_version: 87, + spec_version: 88, + impl_version: 88, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 6a9846e07f..f84bf0a9ce 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -214,6 +214,11 @@ //! removed. Once the `BondingDuration` is over, the [`withdraw_unbonded`](./enum.Call.html#variant.withdraw_unbonded) call can be used //! to actually withdraw the funds. //! +//! Note that there is a limitation to the number of fund-chunks that can be scheduled to be unlocked in the future +//! via [`unbond`](enum.Call.html#variant.unbond). +//! In case this maximum (`MAX_UNLOCKING_CHUNKS`) is reached, the bonded account _must_ first wait until a successful +//! call to `withdraw_unbonded` to remove some of the chunks. +//! //! ### Election Algorithm //! //! The current election algorithm is implemented based on Phragmén. @@ -266,6 +271,8 @@ const RECENT_OFFLINE_COUNT: usize = 32; const DEFAULT_MINIMUM_VALIDATOR_COUNT: u32 = 4; const MAX_NOMINATIONS: usize = 16; const MAX_UNSTAKE_THRESHOLD: u32 = 10; +const MAX_UNLOCKING_CHUNKS: usize = 32; +const STAKING_ID: LockIdentifier = *b"staking "; /// Indicates the initial status of the staker. #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] @@ -426,8 +433,6 @@ pub trait Trait: system::Trait + session::Trait { type Reward: OnUnbalanced>; } -const STAKING_ID: LockIdentifier = *b"staking "; - decl_storage! { trait Store for Module as Staking { @@ -605,12 +610,20 @@ decl_module! { /// Once the unlock period is done, you can call `withdraw_unbonded` to actually move /// the funds out of management ready for transfer. /// + /// No more than a limited number of unlocking chunks (see `MAX_UNLOCKING_CHUNKS`) + /// can co-exists at the same time. In that case, [`Call::withdraw_unbonded`] need + /// to be called first to remove some of the chunks (if possible). + /// /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. /// /// See also [`Call::withdraw_unbonded`]. fn unbond(origin, #[compact] value: BalanceOf) { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or("not a controller")?; + ensure!( + ledger.unlocking.len() < MAX_UNLOCKING_CHUNKS, + "can not schedule more unlock chunks" + ); let mut value = value.min(ledger.active); diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index 17885dc251..fecd38bb01 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -1237,6 +1237,38 @@ fn bond_extra_and_withdraw_unbonded_works() { }) } +#[test] +fn too_many_unbond_calls_should_not_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + // locked at era 0 until 3 + for _ in 0..MAX_UNLOCKING_CHUNKS-1 { + assert_ok!(Staking::unbond(Origin::signed(10), 1)); + } + + System::set_block_number(1); + Session::check_rotate_session(System::block_number()); + + // locked ar era 1 until 4 + assert_ok!(Staking::unbond(Origin::signed(10), 1)); + // can't do more. + assert_noop!(Staking::unbond(Origin::signed(10), 1), "can not schedule more unlock chunks"); + + System::set_block_number(2); + Session::check_rotate_session(System::block_number()); + + System::set_block_number(3); + Session::check_rotate_session(System::block_number()); + + assert_noop!(Staking::unbond(Origin::signed(10), 1), "can not schedule more unlock chunks"); + // free up. + assert_ok!(Staking::withdraw_unbonded(Origin::signed(10))); + + // Can add again. + assert_ok!(Staking::unbond(Origin::signed(10), 1)); + assert_eq!(Staking::ledger(&10).unwrap().unlocking.len(), 2); + }) +} + #[test] fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment() { // Test that slot_stake is determined by the least staked validator -- GitLab From d9e7d7ce3b80a3c504c10f898ad2053dd1cc1c36 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 29 May 2019 15:15:10 +0200 Subject: [PATCH 046/140] Maps are appendable too (#2716) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Maps are appendable too * Update srml/support/src/storage/hashed/generator.rs Co-Authored-By: Tomasz Drwięga * Update srml/support/src/storage/mod.rs Co-Authored-By: Tomasz Drwięga * Fix docs * Make Appendable public * Bump runtime version --- node/runtime/src/lib.rs | 2 +- srml/support/procedural/src/storage/impls.rs | 5 ++- srml/support/src/lib.rs | 4 +- srml/support/src/storage/child.rs | 0 srml/support/src/storage/hashed/generator.rs | 22 +++++++++- srml/support/src/storage/mod.rs | 23 ++++++++++- srml/support/src/storage/storage_items.rs | 43 ++++++++++++++++++++ 7 files changed, 94 insertions(+), 5 deletions(-) delete mode 100644 srml/support/src/storage/child.rs diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 97d1b88cc2..6bc118bdc0 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 88, - impl_version: 88, + impl_version: 89, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs index 720ed21c24..0e9e30e2a4 100644 --- a/srml/support/procedural/src/storage/impls.rs +++ b/srml/support/procedural/src/storage/impls.rs @@ -225,8 +225,11 @@ impl<'a, I: Iterator> Impls<'a, I> { #mutate_impl ; ret } - } + + impl<#traitinstance: 'static + #traittype, #instance #bound_instantiable> + #scrate::storage::hashed::generator::AppendableStorageMap<#kty, #typ> for #name<#traitinstance, #instance> + {} } } diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index 4f749d4c89..0931e4c5a3 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -57,7 +57,9 @@ pub mod unsigned; mod double_map; pub mod traits; -pub use self::storage::{StorageList, StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap}; +pub use self::storage::{ + StorageList, StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap, AppendableStorageMap +}; pub use self::hashable::Hashable; pub use self::dispatch::{Parameter, Dispatchable, Callable, IsSubType}; pub use self::double_map::StorageDoubleMapWithHasher; diff --git a/srml/support/src/storage/child.rs b/srml/support/src/storage/child.rs deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs index fb876a2adb..1cc62c69f7 100644 --- a/srml/support/src/storage/hashed/generator.rs +++ b/srml/support/src/storage/hashed/generator.rs @@ -281,5 +281,25 @@ pub trait EnumerableStorageMap: StorageMap>(storage: &S) -> Option; /// Enumerate all elements in the map. - fn enumerate<'a, S: HashedStorage>(storage: &'a S) -> Box + 'a> where K: 'a, V: 'a; + fn enumerate<'a, S: HashedStorage>( + storage: &'a S + ) -> Box + 'a> where K: 'a, V: 'a; +} + +/// A `StorageMap` with appendable entries. +pub trait AppendableStorageMap: StorageMap { + /// Append the given items to the value in the storage. + /// + /// `T` is required to implement `codec::EncodeAppend`. + fn append, I: codec::Encode>( + key : &K, items: &[I], storage: &mut S + ) -> Result<(), &'static str> where V: codec::EncodeAppend { + let k = Self::key_for(key); + let new_val = ::append( + storage.get_raw(&k[..]).unwrap_or_default(), + items, + ).ok_or_else(|| "Could not append given item")?; + storage.put_raw(&k[..], &new_val); + Ok(()) + } } diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs index 635572c991..41ea4cfdbc 100644 --- a/srml/support/src/storage/mod.rs +++ b/srml/support/src/storage/mod.rs @@ -330,6 +330,25 @@ impl StorageMap for U where U: hashed::generator::S } } +/// A storage map with values that can be appended to. +pub trait AppendableStorageMap: StorageMap { + /// Append the given item to the value in the storage. + /// + /// `T` is required to implement `codec::EncodeAppend`. + fn append, I: Encode>(key: KeyArg, items: &[I]) -> Result<(), &'static str> + where V: EncodeAppend; +} + +impl AppendableStorageMap for U + where U: hashed::generator::AppendableStorageMap +{ + fn append, I: Encode>(key: KeyArg, items: &[I]) -> Result<(), &'static str> + where V: EncodeAppend + { + U::append(key.borrow(), items, &mut RuntimeStorage) + } +} + /// A storage map that can be enumerated. /// /// Primarily useful for off-chain computations. @@ -342,7 +361,9 @@ pub trait EnumerableStorageMap: StorageMap { fn enumerate() -> Box> where K: 'static, V: 'static; } -impl EnumerableStorageMap for U where U: hashed::generator::EnumerableStorageMap { +impl EnumerableStorageMap for U + where U: hashed::generator::EnumerableStorageMap +{ fn head() -> Option { >::head(&RuntimeStorage) } diff --git a/srml/support/src/storage/storage_items.rs b/srml/support/src/storage/storage_items.rs index 802965fc27..2e7a8d4bb4 100644 --- a/srml/support/src/storage/storage_items.rs +++ b/srml/support/src/storage/storage_items.rs @@ -900,3 +900,46 @@ mod test3 { type BlockNumber = u32; } } + +#[cfg(test)] +#[allow(dead_code)] +mod test_map_vec_append { + pub trait Trait { + type Origin; + type BlockNumber; + } + decl_module! { + pub struct Module for enum Call where origin: T::Origin {} + } + crate::decl_storage! { + trait Store for Module as Test { + JustVec: Vec; + MapVec: map u32 => Vec; + } + } + + struct Test {} + + impl Trait for Test { + type Origin = u32; + type BlockNumber = u32; + } + + #[test] + fn append_works() { + use crate::storage::{AppendableStorageMap, StorageMap, StorageValue}; + use runtime_io::{with_externalities, TestExternalities}; + + with_externalities(&mut TestExternalities::default(), || { + let _ = >::append(1, &[1, 2, 3]); + let _ = >::append(1, &[4, 5]); + assert_eq!(>::get(1), vec![1, 2, 3, 4, 5]); + + let _ = >::append(&[1, 2, 3]); + let _ = >::append(&[4, 5]); + assert_eq!(>::get(), vec![1, 2, 3, 4, 5]); + }); + } +} + + -- GitLab From 51b577fbede36b2dbee2fad1214f6a59887eaa21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Wed, 29 May 2019 15:25:02 +0200 Subject: [PATCH 047/140] core: import equivocated aura and babe blocks (#2709) * core: import equivocated aura and babe blocks * core: cleanup check_equivocation handling * fix: use map_err on Aura * core: slots: remove unneeded Arc and minimize cloning * core: fix slots equivocation tests * core: slots: remove unused import * core: remove unnecessary comments --- Cargo.lock | 1 + core/consensus/aura/src/lib.rs | 90 +++-------------- core/consensus/babe/src/lib.rs | 123 ++++------------------- core/consensus/slots/Cargo.toml | 3 + core/consensus/slots/src/aux_schema.rs | 134 +++++++++++++++++++++++-- 5 files changed, 161 insertions(+), 190 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 83a85c4d69..d585910b14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4061,6 +4061,7 @@ dependencies = [ "substrate-consensus-common 2.0.0", "substrate-inherents 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)", ] diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index e3ab9e31cf..36c51c8cff 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -395,7 +395,7 @@ fn find_pre_digest(header: &B::Header) -> Result // // FIXME #1018 needs misbehavior types fn check_header( - client: &Arc, + client: &C, slot_now: u64, mut header: B::Header, hash: B::Hash, @@ -431,26 +431,22 @@ fn check_header( let pre_hash = header.hash(); if P::verify(&sig, pre_hash.as_ref(), expected_author) { - match check_equivocation::<_, _,

::Public>( + if let Some(equivocation_proof) = check_equivocation( client, slot_now, slot_num, - header.clone(), - expected_author.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, (slot_num, seal))), - Err(e) => Err(e.to_string()), + &header, + expected_author, + ).map_err(|e| e.to_string())? { + info!( + "Slot author is equivocating at slot {} with headers {:?} and {:?}", + slot_num, + equivocation_proof.fst_header().hash(), + equivocation_proof.snd_header().hash(), + ); } + + Ok(CheckedHeader::Checked(header, (slot_num, seal))) } else { Err(format!("Bad signature on {:?}", hash)) } @@ -766,9 +762,6 @@ mod tests { 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; @@ -873,24 +866,6 @@ 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 item = as CompatibleDigestItem>::aura_pre_digest(slot_num); - header.digest_mut().push(item); - let header_hash: H256 = header.hash(); - let signature = pair.sign(&header_hash[..]); - - let item = CompatibleDigestItem::::aura_seal(signature); - header.digest_mut().push(item); - (header, header_hash) - } - #[test] #[allow(deprecated)] fn authoring_blocks() { @@ -975,43 +950,4 @@ 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. - check_header::<_, B, P>(&c, 2, header1.clone(), header1_hash, &authorities).unwrap(); - assert!(check_header::<_, B, P>(&c, 3, header1, header1_hash, &authorities).is_ok()); - - // But not two different headers at the same slot. - assert!(check_header::<_, B, P>(&c, 4, header2, header2_hash, &authorities).is_err()); - - // Different slot is ok. - assert!(check_header::<_, B, P>(&c, 5, header3, header3_hash, &authorities).is_ok()); - - // Here we trigger pruning and save header 4. - assert!(check_header::<_, B, P>(&c, PRUNING_BOUND + 2, header4, header4_hash, &authorities).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).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).is_ok()); - } } diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 2d1afb0187..81b4be4137 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -461,7 +461,7 @@ fn find_pre_digest(header: &B::Header) -> Result( - client: &Arc, + client: &C, slot_now: u64, mut header: B::Header, hash: B::Hash, @@ -508,28 +508,27 @@ fn check_header( if !check(&inout, threshold) { return Err(babe_err!("VRF verification of block by author {:?} failed: \ - threshold {} exceeded", author, threshold)) + threshold {} exceeded", author, threshold)); } - match check_equivocation(&client, slot_now, slot_num, header.clone(), author.clone()) { - Ok(Some(equivocation_proof)) => { - let log_str = format!( - "Slot author {:?} is equivocating at slot {} with headers {:?} and {:?}", - author, - slot_num, - equivocation_proof.fst_header().hash(), - equivocation_proof.snd_header().hash(), - ); - info!(target: "babe", "{}", log_str); - Err(log_str) - }, - Ok(None) => { - let pre_digest = CompatibleDigestItem::babe_pre_digest(pre_digest); - Ok(CheckedHeader::Checked(header, (pre_digest, seal))) - }, - Err(e) => { - Err(e.to_string()) - }, + + if let Some(equivocation_proof) = check_equivocation( + client, + slot_now, + slot_num, + &header, + author, + ).map_err(|e| e.to_string())? { + info!( + "Slot author {:?} is equivocating at slot {} with headers {:?} and {:?}", + author, + slot_num, + equivocation_proof.fst_header().hash(), + equivocation_proof.snd_header().hash(), + ); } + + let pre_digest = CompatibleDigestItem::babe_pre_digest(pre_digest); + Ok(CheckedHeader::Checked(header, (pre_digest, seal))) } else { Err(babe_err!("Bad signature on {:?}", hash)) } @@ -823,9 +822,6 @@ mod tests { use std::time::Duration; type Item = generic::DigestItem; 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; @@ -934,44 +930,6 @@ 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 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 pre_digest = BabePreDigest { - proof, - author: pair.public(), - slot_num, - vrf_output: inout.to_output(), - }; - assert_eq!( - Decode::decode(&mut &pre_digest.encode()[..]).as_ref(), - Some(&pre_digest), - "Pre-digest encoding and decoding did not round-trip", - ); - let item = generic::DigestItem::babe_pre_digest(pre_digest); - header.digest_mut().push(item); - - let to_sign = header.hash(); - let signature = pair.sign(&to_sign[..]); - header.digest_mut().push(generic::DigestItem::babe_seal(signature)); - (header, pre_hash) - } - #[test] fn can_serialize_block() { drop(env_logger::try_init()); @@ -1107,45 +1065,4 @@ mod tests { Keyring::Charlie.into() ]); } - - #[test] - fn check_header_works_with_equivocation() { - drop(env_logger::try_init()); - 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/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index ee3571bcdc..2be9133d54 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -16,3 +16,6 @@ futures = "0.1.17" tokio = "0.1.7" parking_lot = "0.7.1" log = "0.4" + +[dev-dependencies] +test_client = { package = "substrate-test-client", path = "../../test-client" } diff --git a/core/consensus/slots/src/aux_schema.rs b/core/consensus/slots/src/aux_schema.rs index 3d4a11d487..ed96bf2e22 100644 --- a/core/consensus/slots/src/aux_schema.rs +++ b/core/consensus/slots/src/aux_schema.rs @@ -16,7 +16,6 @@ //! 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}; @@ -30,7 +29,7 @@ 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> +fn load_decode(backend: &C, key: &[u8]) -> ClientResult> where C: AuxStore, T: Decode, @@ -74,16 +73,16 @@ impl EquivocationProof { /// /// Note: it detects equivocations only when slot_now - slot <= MAX_SLOT_CAPACITY. pub fn check_equivocation( - backend: &Arc, + backend: &C, slot_now: u64, slot: u64, - header: H, - signer: P, + header: &H, + signer: &P, ) -> ClientResult>> where H: Header, C: AuxStore, - P: Encode + Decode + PartialEq, + P: Clone + Encode + Decode + PartialEq, { // We don't check equivocations for old headers out of our capacity. if slot_now - slot > MAX_SLOT_CAPACITY { @@ -95,18 +94,18 @@ pub fn check_equivocation( 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[..])? + let mut headers_with_sig = load_decode::<_, Vec<(H, P)>>(backend, &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[..])? + let first_saved_slot = load_decode::<_, u64>(backend, &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 { + if prev_signer == signer { // 2) with different hash if header.hash() != prev_header.hash() { return Ok(Some(EquivocationProof { @@ -137,7 +136,7 @@ pub fn check_equivocation( } } - headers_with_sig.push((header, signer)); + headers_with_sig.push((header.clone(), signer.clone())); backend.insert_aux( &[ @@ -149,3 +148,118 @@ pub fn check_equivocation( Ok(None) } + +#[cfg(test)] +mod test { + use primitives::{sr25519, Pair}; + use primitives::hash::H256; + use runtime_primitives::testing::{Header as HeaderTest, Digest as DigestTest}; + use test_client; + + use super::{MAX_SLOT_CAPACITY, PRUNING_BOUND, check_equivocation}; + + fn create_header(number: u64) -> HeaderTest { + // so that different headers for the same number get different hashes + let parent_hash = H256::random(); + + let header = HeaderTest { + parent_hash, + number, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: DigestTest { logs: vec![], }, + }; + + header + } + + #[test] + fn check_equivocation_works() { + let client = test_client::new(); + let pair = sr25519::Pair::generate(); + let public = pair.public(); + + let header1 = create_header(1); // @ slot 2 + let header2 = create_header(2); // @ slot 2 + let header3 = create_header(2); // @ slot 4 + let header4 = create_header(3); // @ slot MAX_SLOT_CAPACITY + 4 + let header5 = create_header(4); // @ slot MAX_SLOT_CAPACITY + 4 + let header6 = create_header(3); // @ slot 4 + + // It's ok to sign same headers. + assert!( + check_equivocation( + &client, + 2, + 2, + &header1, + &public, + ).unwrap().is_none(), + ); + + assert!( + check_equivocation( + &client, + 3, + 2, + &header1, + &public, + ).unwrap().is_none(), + ); + + // But not two different headers at the same slot. + assert!( + check_equivocation( + &client, + 4, + 2, + &header2, + &public, + ).unwrap().is_some(), + ); + + // Different slot is ok. + assert!( + check_equivocation( + &client, + 5, + 4, + &header3, + &public, + ).unwrap().is_none(), + ); + + // Here we trigger pruning and save header 4. + assert!( + check_equivocation( + &client, + PRUNING_BOUND + 2, + MAX_SLOT_CAPACITY + 4, + &header4, + &public, + ).unwrap().is_none(), + ); + + // This fails because header 5 is an equivocation of header 4. + assert!( + check_equivocation( + &client, + PRUNING_BOUND + 3, + MAX_SLOT_CAPACITY + 4, + &header5, + &public, + ).unwrap().is_some(), + ); + + // This is ok because we pruned the corresponding header. Shows that we are pruning. + assert!( + check_equivocation( + &client, + PRUNING_BOUND + 4, + 4, + &header6, + &public, + ).unwrap().is_none(), + ); + } +} -- GitLab From 090fc1c039bf4ae052ab5219fc6ce75d99773b9e Mon Sep 17 00:00:00 2001 From: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> Date: Wed, 29 May 2019 09:35:31 -0400 Subject: [PATCH 048/140] Update dependencies (#2718) I am taking charge of ~monthly dependency updates, as per a suggestion from @rphmeier. --- Cargo.lock | 1117 ++++++++++++++++++++++++++-------------------------- 1 file changed, 563 insertions(+), 554 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d585910b14..978af7a4ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,13 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -[[package]] -name = "MacTypes-sys" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "aes-ctr" version = "0.3.0" @@ -52,7 +44,7 @@ name = "aio-limited" 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)", + "futures 0.1.27 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -106,7 +98,7 @@ version = "0.1.1" 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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -119,27 +111,26 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.15" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -147,8 +138,8 @@ name = "backtrace-sys" 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -194,7 +185,7 @@ 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.5 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -202,7 +193,7 @@ 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)", "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", @@ -281,7 +272,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bstr" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -289,7 +280,7 @@ dependencies = [ [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -318,6 +309,7 @@ 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)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -333,7 +325,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.26" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -349,7 +341,7 @@ dependencies = [ [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -367,8 +359,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -378,7 +370,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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -402,7 +394,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -415,10 +407,10 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.35" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -428,20 +420,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "core-foundation" -version = "0.5.1" +version = "0.6.4" 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "core-foundation-sys" -version = "0.5.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "criterion" @@ -455,17 +444,17 @@ dependencies = [ "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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (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.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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (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)", + "tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -484,7 +473,7 @@ name = "crossbeam" version = "0.6.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)", + "cfg-if 0.1.9 (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-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -536,7 +525,7 @@ version = "0.3.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)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -550,7 +539,7 @@ version = "0.7.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)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (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)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -570,7 +559,7 @@ name = "crossbeam-utils" version = "0.2.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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -578,7 +567,7 @@ name = "crossbeam-utils" version = "0.6.5" 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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -589,7 +578,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -616,9 +605,9 @@ 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)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -635,7 +624,7 @@ 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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -667,7 +656,7 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -684,13 +673,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.1" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -734,7 +723,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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (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)", @@ -775,15 +764,16 @@ 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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "error-chain" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -791,7 +781,7 @@ name = "exit-future" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -800,7 +790,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -809,10 +799,10 @@ name = "failure_derive" version = "0.1.5" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -825,7 +815,7 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -833,10 +823,10 @@ name = "finality-grandpa" 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)", + "futures 0.1.27 (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)", + "num-traits 0.2.8 (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)", @@ -849,7 +839,7 @@ 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", @@ -886,7 +876,7 @@ 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -912,7 +902,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -920,7 +910,7 @@ name = "futures-cpupool" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -953,7 +943,7 @@ 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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -963,7 +953,7 @@ 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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -982,7 +972,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "bstr 0.1.4 (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)", "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -990,13 +980,13 @@ dependencies = [ [[package]] name = "h2" -version = "0.1.18" +version = "0.1.20" 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.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)", + "futures 0.1.27 (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)", @@ -1015,7 +1005,7 @@ name = "hash256-std-hasher" 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)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1045,7 +1035,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1068,7 +1058,7 @@ 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)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1084,7 +1074,7 @@ 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)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1123,7 +1113,18 @@ 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)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "http-body" +version = "0.1.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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1141,7 +1142,7 @@ dependencies = [ [[package]] name = "hyper" -version = "0.10.15" +version = "0.10.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1159,22 +1160,24 @@ dependencies = [ [[package]] name = "hyper" -version = "0.12.27" +version = "0.12.29" 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)", + "futures 0.1.27 (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.18 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "http-body 0.1.0 (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)", + "itoa 0.4.4 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-buf 0.1.1 (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)", @@ -1208,7 +1211,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1216,7 +1219,7 @@ name = "impl-serde" version = "0.2.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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1239,7 +1242,7 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1253,15 +1256,15 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" 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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1269,10 +1272,10 @@ name = "jsonrpc-core" version = "10.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)", + "futures 0.1.27 (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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1281,9 +1284,9 @@ name = "jsonrpc-derive" version = "10.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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1291,12 +1294,12 @@ name = "jsonrpc-http-server" version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hyper 0.12.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.29 (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.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1307,7 +1310,7 @@ dependencies = [ "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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1321,9 +1324,9 @@ 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)", "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 0.1.20 (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.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1331,7 +1334,7 @@ name = "jsonrpc-ws-server" version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.1 (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)", @@ -1415,7 +1418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.51" +version = "0.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1423,7 +1426,7 @@ name = "libloading" 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)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1433,7 +1436,7 @@ 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.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", @@ -1453,7 +1456,7 @@ dependencies = [ "libp2p-wasm-ext 0.1.1 (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-multiaddr 0.4.1 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1474,19 +1477,19 @@ dependencies = [ "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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.1 (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.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", + "rw-stream-sink 0.1.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.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1504,7 +1507,7 @@ version = "0.8.0" 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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1512,7 +1515,7 @@ name = "libp2p-dns" 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)", + "futures 0.1.27 (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-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1528,9 +1531,9 @@ dependencies = [ "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)", + "futures 0.1.27 (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)", + "protobuf 2.6.1 (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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1545,12 +1548,12 @@ 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.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.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.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", @@ -1570,13 +1573,13 @@ dependencies = [ "bs58 0.2.2 (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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.1 (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.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1593,11 +1596,11 @@ 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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.1 (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)", @@ -1614,7 +1617,7 @@ 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.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", @@ -1629,12 +1632,12 @@ 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.26 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", + "protobuf 2.6.1 (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)", @@ -1650,10 +1653,10 @@ 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.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.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)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1667,7 +1670,7 @@ name = "libp2p-plaintext" 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)", + "futures 0.1.27 (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)", ] @@ -1679,7 +1682,7 @@ 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)", + "futures 0.1.27 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1695,24 +1698,24 @@ dependencies = [ "asn1_der 0.6.1 (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)", + "futures 0.1.27 (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)", + "js-sys 0.3.22 (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.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-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1721,7 +1724,7 @@ 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)", + "futures 0.1.27 (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)", @@ -1735,7 +1738,7 @@ name = "libp2p-uds" 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)", + "futures 0.1.27 (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-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1746,13 +1749,13 @@ name = "libp2p-wasm-ext" 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)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1761,14 +1764,14 @@ 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)", + "futures 0.1.27 (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)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "stdweb 0.4.17 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1776,22 +1779,22 @@ name = "libp2p-yamux" 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)", + "futures 0.1.27 (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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "librocksdb-sys" -version = "5.17.2" +version = "5.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "cc 1.0.37 (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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1842,7 +1845,7 @@ name = "log" version = "0.4.6" 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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1863,7 +1866,7 @@ name = "memchr" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1888,7 +1891,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.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)", @@ -1907,15 +1910,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", @@ -1930,7 +1932,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazycell 1.2.1 (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 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1940,8 +1942,8 @@ 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.51 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1961,7 +1963,7 @@ version = "0.4.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)", + "futures 0.1.27 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1979,19 +1981,19 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.2" +version = "0.2.3" 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.23 (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.43 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1999,8 +2001,8 @@ name = "net2" 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2010,9 +2012,9 @@ 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2021,7 +2023,7 @@ name = "node-cli" version = "2.0.0" dependencies = [ "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)", + "futures 0.1.27 (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 2.0.0", @@ -2049,7 +2051,7 @@ dependencies = [ "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)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "transaction-factory 0.0.1", ] @@ -2088,7 +2090,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2104,7 +2106,7 @@ dependencies = [ "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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", @@ -2138,9 +2140,9 @@ name = "node-template" version = "2.0.0" dependencies = [ "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)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (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 2.0.0", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2156,7 +2158,7 @@ dependencies = [ "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)", + "tokio 0.1.20 (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)", ] @@ -2167,7 +2169,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2209,23 +2211,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2257,15 +2263,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.20" +version = "0.10.23" 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)", + "cfg-if 0.1.9 (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.51 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2275,13 +2281,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-sys" -version = "0.9.43" +version = "0.9.47" 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", ] @@ -2321,7 +2327,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2329,15 +2335,15 @@ name = "parity-codec-derive" 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.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2346,8 +2352,9 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2359,7 +2366,7 @@ dependencies = [ "rand 0.6.5 (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)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2385,7 +2392,7 @@ dependencies = [ "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 0.6.19 (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)", @@ -2425,7 +2432,7 @@ name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2436,7 +2443,7 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2448,7 +2455,7 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2461,7 +2468,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2469,10 +2476,10 @@ name = "paste-impl" version = "0.1.5" 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)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2533,10 +2540,10 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2549,12 +2556,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.5" +version = "0.5.7" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2564,7 +2571,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.28" +version = "0.4.30" 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)", @@ -2572,7 +2579,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2600,7 +2607,7 @@ name = "quote" version = "0.6.12" 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)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2608,7 +2615,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2618,7 +2625,7 @@ 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2631,7 +2638,7 @@ 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2641,13 +2648,13 @@ name = "rand" 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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_jitter 0.1.4 (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)", @@ -2659,7 +2666,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2694,10 +2701,10 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2709,7 +2716,7 @@ 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2720,7 +2727,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2758,7 +2765,7 @@ 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2821,8 +2828,8 @@ name = "rhododendron" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" 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)", + "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2833,9 +2840,9 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (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)", + "libc 0.2.55 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2846,8 +2853,8 @@ name = "rocksdb" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2856,7 +2863,7 @@ version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2880,17 +2887,17 @@ dependencies = [ [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" 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)", + "futures 0.1.27 (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 = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2929,14 +2936,14 @@ 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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.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_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)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2947,23 +2954,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "security-framework" -version = "0.2.2" +version = "0.3.1" 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.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)", + "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "security-framework-sys" -version = "0.2.3" +version = "0.3.1" 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2986,20 +2991,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.90" +version = "1.0.91" 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)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.90" +version = "1.0.91" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3007,9 +3012,9 @@ name = "serde_json" 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)", - "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)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3053,7 +3058,7 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" 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)", @@ -3102,7 +3107,7 @@ 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 1.0.91 (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)", ] @@ -3122,9 +3127,9 @@ name = "slog_derive" version = "0.1.1" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3166,8 +3171,8 @@ dependencies = [ "blake2-rfc 0.2.18 (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.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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", @@ -3176,7 +3181,7 @@ dependencies = [ "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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "trybuild 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3202,10 +3207,10 @@ 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)", + "num-traits 0.2.8 (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.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (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-std 2.0.0", @@ -3238,7 +3243,7 @@ version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -3248,7 +3253,7 @@ name = "srml-assets" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3264,7 +3269,7 @@ 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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3286,7 +3291,7 @@ 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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3307,7 +3312,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3322,7 +3327,7 @@ name = "srml-consensus" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3342,7 +3347,7 @@ dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-sandbox 2.0.0", @@ -3364,7 +3369,7 @@ dependencies = [ "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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3381,7 +3386,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3396,7 +3401,7 @@ name = "srml-example" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "srml-balances 2.0.0", @@ -3411,7 +3416,7 @@ version = "2.0.0" dependencies = [ "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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3429,7 +3434,7 @@ 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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3444,7 +3449,7 @@ name = "srml-grandpa" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3464,7 +3469,7 @@ dependencies = [ "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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3479,7 +3484,7 @@ name = "srml-metadata" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -3491,7 +3496,7 @@ 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)", "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3508,7 +3513,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3527,7 +3532,7 @@ name = "srml-sudo" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3546,7 +3551,7 @@ dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3560,31 +3565,31 @@ dependencies = [ name = "srml-support-procedural" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3592,7 +3597,7 @@ name = "srml-support-test" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "srml-support 2.0.0", "substrate-inherents 2.0.0", @@ -3607,7 +3612,7 @@ dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3620,7 +3625,7 @@ name = "srml-timestamp" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3635,7 +3640,7 @@ name = "srml-treasury" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3662,7 +3667,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "stdweb" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3670,7 +3675,7 @@ dependencies = [ "stdweb-derive 0.5.1 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3678,11 +3683,11 @@ name = "stdweb-derive" version = "0.5.1" 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)", + "proc-macro2 0.4.30 (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.32 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3691,13 +3696,13 @@ 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.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (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.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3738,9 +3743,9 @@ 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.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3754,9 +3759,9 @@ 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.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3783,7 +3788,7 @@ name = "substrate" version = "2.0.0" dependencies = [ "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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "node-cli 2.0.0", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3824,11 +3829,11 @@ dependencies = [ "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)", - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (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)", @@ -3845,19 +3850,19 @@ dependencies = [ "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)", + "sysinfo 0.8.4 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-client" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (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.4 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -3910,7 +3915,7 @@ name = "substrate-consensus-aura" version = "2.0.0" dependencies = [ "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)", + "futures 0.1.27 (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)", @@ -3933,7 +3938,7 @@ dependencies = [ "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)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3963,9 +3968,9 @@ name = "substrate-consensus-babe" version = "2.0.0" dependencies = [ "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)", + "futures 0.1.27 (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)", + "merlin 1.1.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.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3990,7 +3995,7 @@ dependencies = [ "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)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4008,8 +4013,8 @@ name = "substrate-consensus-common" version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (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)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", @@ -4027,9 +4032,9 @@ dependencies = [ name = "substrate-consensus-rhd" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (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)", @@ -4045,14 +4050,14 @@ dependencies = [ "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)", + "tokio 0.1.20 (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)", + "futures 0.1.27 (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)", @@ -4062,7 +4067,7 @@ dependencies = [ "substrate-inherents 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)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4071,7 +4076,7 @@ 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)", - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", @@ -4097,7 +4102,7 @@ dependencies = [ "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)", + "futures 0.1.27 (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)", @@ -4115,7 +4120,7 @@ dependencies = [ "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)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4154,7 +4159,7 @@ dependencies = [ name = "substrate-keystore" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (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)", @@ -4168,10 +4173,10 @@ name = "substrate-network" version = "2.0.0" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (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)", @@ -4188,7 +4193,7 @@ dependencies = [ "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)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4201,20 +4206,20 @@ dependencies = [ "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)", + "futures 0.1.27 (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.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 1.0.91 (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_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.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (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.11 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4227,7 +4232,7 @@ name = "substrate-offchain" version = "2.0.0" dependencies = [ "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)", + "futures 0.1.27 (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", @@ -4238,7 +4243,7 @@ dependencies = [ "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)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4253,7 +4258,7 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4261,14 +4266,14 @@ dependencies = [ name = "substrate-peerset" version = "2.0.0" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", "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)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4285,7 +4290,7 @@ dependencies = [ "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)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (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.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4293,13 +4298,13 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (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)", + "twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4308,8 +4313,8 @@ name = "substrate-rpc" version = "2.0.0" dependencies = [ "assert_matches 1.3.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)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.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-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)", @@ -4317,7 +4322,7 @@ dependencies = [ "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 1.0.91 (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", @@ -4331,7 +4336,7 @@ dependencies = [ "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)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4342,7 +4347,7 @@ dependencies = [ "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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-rpc 2.0.0", ] @@ -4351,7 +4356,7 @@ dependencies = [ name = "substrate-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4359,9 +4364,9 @@ dependencies = [ name = "substrate-service" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (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)", "node-executor 2.0.0", @@ -4369,7 +4374,7 @@ dependencies = [ "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 1.0.91 (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 2.0.0", @@ -4389,7 +4394,7 @@ dependencies = [ "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.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4398,7 +4403,7 @@ version = "2.0.0" dependencies = [ "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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4407,7 +4412,7 @@ dependencies = [ "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.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4428,7 +4433,7 @@ dependencies = [ "hash-db 0.12.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)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (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 2.0.0", @@ -4446,7 +4451,7 @@ dependencies = [ "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 1.0.91 (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)", @@ -4459,7 +4464,7 @@ dependencies = [ name = "substrate-test-client" version = "2.0.0" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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", @@ -4476,11 +4481,11 @@ dependencies = [ name = "substrate-test-runtime" version = "2.0.0" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (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.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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4506,13 +4511,13 @@ name = "substrate-transaction-graph" version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (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)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime 2.0.0", @@ -4522,8 +4527,8 @@ dependencies = [ name = "substrate-transaction-pool" version = "2.0.0" dependencies = [ - "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)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", @@ -4550,7 +4555,7 @@ dependencies = [ "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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4565,32 +4570,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.32" +version = "0.15.34" 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)", + "proc-macro2 0.4.30 (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)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (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.2" +version = "0.8.4" 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4616,11 +4621,11 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.0.7" +version = "3.0.8" 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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.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)", @@ -4640,7 +4645,7 @@ name = "termion" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", @@ -4667,7 +4672,7 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", ] @@ -4696,10 +4701,10 @@ dependencies = [ [[package]] name = "tinytemplate" -version = "1.0.1" +version = "1.0.2" 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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4708,20 +4713,20 @@ name = "tk-listen" version = "0.2.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)", + "futures 0.1.27 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (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.19" +version = "0.1.20" 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)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (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.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4738,13 +4743,23 @@ dependencies = [ "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-buf" +version = "0.1.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)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-codec" version = "0.1.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.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4753,7 +4768,7 @@ name = "tokio-current-thread" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4762,10 +4777,10 @@ name = "tokio-dns-unofficial" version = "0.4.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)", + "futures 0.1.27 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4774,7 +4789,7 @@ 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)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4782,7 +4797,7 @@ name = "tokio-fs" 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)", + "futures 0.1.27 (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)", ] @@ -4793,7 +4808,7 @@ version = "0.1.12" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4803,10 +4818,10 @@ 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)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (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)", @@ -4821,7 +4836,7 @@ 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4830,9 +4845,9 @@ version = "0.1.3" 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)", + "futures 0.1.27 (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)", + "mio 0.6.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-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4845,7 +4860,7 @@ dependencies = [ "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)", + "futures 0.1.27 (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.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4859,7 +4874,7 @@ version = "0.2.11" 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)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4869,8 +4884,8 @@ name = "tokio-tls" version = "0.2.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)", - "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4888,9 +4903,9 @@ version = "0.1.3" 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)", + "futures 0.1.27 (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 0.6.19 (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-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4902,11 +4917,11 @@ version = "0.2.5" 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)", + "futures 0.1.27 (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.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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 0.6.19 (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.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4915,18 +4930,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" -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 = "toml" -version = "0.5.0" +version = "0.5.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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4960,7 +4967,7 @@ dependencies = [ "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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4985,10 +4992,9 @@ dependencies = [ [[package]] name = "trie-standardmap" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "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.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5005,10 +5011,10 @@ 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 1.0.91 (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)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5023,10 +5029,10 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5050,7 +5056,7 @@ version = "0.7.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)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5065,7 +5071,7 @@ dependencies = [ [[package]] name = "unicase" -version = "2.3.0" +version = "2.4.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)", @@ -5089,7 +5095,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -5166,8 +5172,8 @@ name = "wabt" version = "0.7.4" 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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (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)", ] @@ -5177,8 +5183,8 @@ name = "wabt-sys" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cmake 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5197,82 +5203,82 @@ name = "want" version = "0.0.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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" 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)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" 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)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5280,11 +5286,11 @@ 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)", + "futures 0.1.27 (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.11 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5308,32 +5314,35 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" 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)", + "js-sys 0.3.22 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "websocket" -version = "0.22.3" +version = "0.22.4" 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.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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.3 (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.19 (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-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-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)", @@ -5341,7 +5350,7 @@ dependencies = [ [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.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)", @@ -5353,7 +5362,7 @@ version = "2.0.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)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5411,9 +5420,9 @@ dependencies = [ "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 0.6.19 (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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.23 (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)", @@ -5435,7 +5444,7 @@ 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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5451,11 +5460,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.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.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5483,13 +5492,12 @@ 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (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" @@ -5503,8 +5511,8 @@ dependencies = [ "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "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.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f106c02a3604afcdc0df5d36cc47b44b55917dbaf3d808f71c163a0ddba64637" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "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" @@ -5521,8 +5529,8 @@ dependencies = [ "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" "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 bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "59604ece62a407dc9164732e5adea02467898954c3a5811fd2dc140af14ef15b" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "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" @@ -5530,18 +5538,18 @@ dependencies = [ "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 cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" "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 cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "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" "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "6ec65ee4f9c9d16f335091d23693457ed4928657ba4982289d7fafee03bc614a" +"checksum cmake 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "2ca4386c8954b76a8415b63959337d940d724b336cabd3afe189c2b51a7e1ff0" "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 core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" +"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" "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" @@ -5555,7 +5563,7 @@ dependencies = [ "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 crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "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.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9044e25afb0924b5a5fc5511689b0918629e85d68ea591e5e87fbf1e85ea1b3b" @@ -5564,9 +5572,9 @@ dependencies = [ "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.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" +"checksum curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" "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 derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "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" @@ -5578,7 +5586,7 @@ dependencies = [ "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 error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9" "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" @@ -5593,7 +5601,7 @@ dependencies = [ "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "62941eff9507c8177d448bd83a44d9b9760856e184081d8cd79ba9f03dd24981" +"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "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" @@ -5603,7 +5611,7 @@ dependencies = [ "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "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 h2 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "2b53def7bb0253af7718036fe9338c15defd209136819464384f3a553e07481b" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" "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" @@ -5619,10 +5627,11 @@ dependencies = [ "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.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" +"checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" "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.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4f2777434f26af6e4ce4fdcdccd3bed9d861d11e87bcbe72c0f51ddaca8ff848" +"checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" +"checksum hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)" = "e2cd6adf83b3347d36e271f030621a8cf95fd1fd0760546b9fc5a24a0f1447c7" "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" @@ -5632,8 +5641,8 @@ dependencies = [ "checksum interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" "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 js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "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" @@ -5649,7 +5658,7 @@ dependencies = [ "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.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" +"checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" "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" @@ -5670,7 +5679,7 @@ dependencies = [ "checksum libp2p-wasm-ext 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "318d727d5e8e0fe3bb70aacbf99bde57334eae9559deff447edd993422dc0f03" "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 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.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" @@ -5683,37 +5692,37 @@ dependencies = [ "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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" +"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 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "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.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 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.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-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "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.20 (registry+https://github.com/rust-lang/crates.io-index)" = "5a0d6b781aac4ac1bd6cafe2a2f0ad8c16ae8e1dd5184822a16c50139f8838d9" +"checksum openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)" = "33c86834957dd5b915623e94f2f4ab2c70dd8f6b70679824155d5ae21dbd495d" +"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" "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.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.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" +"checksum parity-multiaddr 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b574ca9f0c0235c04de4c5110542959f64c9b8882f638b70f6c6be52c75bdc46" "checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" @@ -5733,12 +5742,12 @@ dependencies = [ "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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6a9bed9ebc40cf53e3a76d7486c54d05002eae6485b2711ab9104476fb2eb8bc" +"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.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 proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" "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" @@ -5752,7 +5761,7 @@ dependencies = [ "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_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"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" @@ -5773,27 +5782,27 @@ dependencies = [ "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_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 rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"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 same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" "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 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 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 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 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.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"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.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" @@ -5808,7 +5817,7 @@ dependencies = [ "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.16 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c1d5ac2f828b2877a6be60a51b8e3ebb57b56862b10be1a72676ca8900b69d" +"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.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" @@ -5822,13 +5831,13 @@ dependencies = [ "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.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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a0cb7899e248ed0baa6ef6f8406352523c2f99bc7c4b1800f4cd6d5dde99eb" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" +"checksum sysinfo 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65f0e28a49b7bf142cee89befd7077b40627d7cc70aa8a8acfe03afc26016c33" "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.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" +"checksum tempfile 3.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dc4738f2e68ed2855de5ac9cdbe05c9216773ecde4739b2f095002ab03a13ef" "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 textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" @@ -5836,9 +5845,10 @@ dependencies = [ "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 tinytemplate 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7655088894274afb52b807bd3c87072daa1fedd155068b8705cabfd628956115" +"checksum tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4574b75faccaacddb9b284faecdf0b544b80b6b294f3d062d325c5726a209c20" "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 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" +"checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" "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" @@ -5854,26 +5864,25 @@ dependencies = [ "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 toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e4e24277af05f38f3aaf03ac78e3a154be83f13db9c8ef0cb95bb1aa764a477b" +"checksum trie-standardmap 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ebaa4b340046196efad8872b2dffe585b5ea330230dc44ee14e399f77da29f51" "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.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "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.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -"checksum unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41d17211f887da8e4a70a45b9536f26fc5de166b81e2d5d80de4a17fd22553bd" +"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.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-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "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 unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" @@ -5889,19 +5898,19 @@ dependencies = [ "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 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-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" "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 web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0adcd2a64c5746c9702b354a1b992802b0c363df1dfa324a74cb7aebe10e0cbf" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "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.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" @@ -5915,7 +5924,7 @@ dependencies = [ "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.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"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" "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" -- GitLab From 1ba2440b28f001855253028e40ce8f4080782060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Wed, 29 May 2019 16:06:49 +0200 Subject: [PATCH 049/140] Remove InherentsPool and introduce non-propagateable transactions. (#2695) * Remove InherentsPool. * Introduce transactions that are not propagated over the network. * Bump spec version. * Use separate flag for propagation. * Fix tests. --- Cargo.lock | 2 - core/basic-authorship/src/basic_authorship.rs | 46 +---------- core/inherents/src/lib.rs | 3 - core/inherents/src/pool.rs | 75 ------------------ core/offchain/Cargo.toml | 1 - core/offchain/src/api.rs | 9 +-- core/offchain/src/lib.rs | 16 ++-- core/service/Cargo.toml | 1 - core/service/src/components.rs | 2 +- core/service/src/lib.rs | 78 +++++++++++++++---- .../sr-primitives/src/transaction_validity.rs | 69 +++++++++++++++- core/test-runtime/src/lib.rs | 31 +++++++- core/test-runtime/src/system.rs | 1 + core/transaction-pool/graph/src/base_pool.rs | 69 +++++++++++++++- core/transaction-pool/graph/src/pool.rs | 4 +- core/transaction-pool/graph/src/ready.rs | 2 + core/transaction-pool/graph/src/rotator.rs | 2 + core/transaction-pool/src/tests.rs | 1 + node-template/src/service.rs | 1 - node/cli/src/service.rs | 1 - node/runtime/src/lib.rs | 2 +- srml/executive/src/lib.rs | 5 +- 22 files changed, 250 insertions(+), 171 deletions(-) delete mode 100644 core/inherents/src/pool.rs diff --git a/Cargo.lock b/Cargo.lock index 978af7a4ab..abd2e63f1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4238,7 +4238,6 @@ dependencies = [ "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", @@ -4384,7 +4383,6 @@ dependencies = [ "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", diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 62aad4c9c7..87d0b8f92b 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -20,7 +20,7 @@ // use std::{self, time, sync::Arc}; -use log::{info, debug, warn, trace}; +use log::{info, debug, trace}; use client::{ self, error, Client as SubstrateClient, CallExecutor, @@ -36,7 +36,7 @@ use runtime_primitives::traits::{ use runtime_primitives::generic::BlockId; use runtime_primitives::ApplyError; use transaction_pool::txpool::{self, Pool as TransactionPool}; -use inherents::{InherentData, pool::InherentsPool}; +use inherents::InherentData; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; /// Build new blocks. @@ -119,8 +119,6 @@ pub struct ProposerFactory where A: txpool::ChainApi { pub client: Arc, /// The transaction pool. pub transaction_pool: Arc>, - /// The inherents pool - pub inherents_pool: Arc::Extrinsic>>, } impl consensus_common::Environment<::Block> for ProposerFactory where @@ -150,7 +148,6 @@ impl consensus_common::Environment<::Block> for Propose parent_id: id, parent_number: *parent_header.number(), transaction_pool: self.transaction_pool.clone(), - inherents_pool: self.inherents_pool.clone(), now: Box::new(time::Instant::now), }; @@ -165,7 +162,6 @@ pub struct Proposer { parent_id: BlockId, parent_number: <::Header as HeaderT>::Number, transaction_pool: Arc>, - inherents_pool: Arc::Extrinsic>>, now: Box time::Instant>, } @@ -218,14 +214,6 @@ impl Proposer where inherent_data, inherent_digests.clone(), |block_builder| { - // Add inherents from the internal pool - let inherents = self.inherents_pool.drain(); - debug!("Pushing {} queued inherent extrinsics.", inherents.len()); - for i in inherents { - if let Err(e) = block_builder.push_extrinsic(i) { - warn!("Error while pushing inherent extrinsic from the pool: {:?}", e); - } - } // proceed with transactions let mut is_first = true; let mut skipped = 0; @@ -328,7 +316,6 @@ mod tests { let proposer_factory = ProposerFactory { client: client.clone(), transaction_pool: txpool.clone(), - inherents_pool: Default::default(), }; let mut proposer = proposer_factory.init( @@ -350,33 +337,4 @@ mod tests { assert_eq!(block.extrinsics().len(), 1); assert_eq!(txpool.ready().count(), 2); } - - #[test] - fn should_include_inherents_from_the_pool() { - // given - let client = Arc::new(test_client::new()); - let chain_api = transaction_pool::ChainApi::new(client.clone()); - let txpool = Arc::new(TransactionPool::new(Default::default(), chain_api)); - let inpool = Arc::new(InherentsPool::default()); - - let proposer_factory = ProposerFactory { - client: client.clone(), - transaction_pool: txpool.clone(), - inherents_pool: inpool.clone(), - }; - - inpool.add(extrinsic(0)); - - let proposer = proposer_factory.init( - &client.header(&BlockId::number(0)).unwrap().unwrap(), - &[] - ).unwrap(); - - // when - let deadline = time::Duration::from_secs(3); - let block = proposer.propose(Default::default(), Default::default(), deadline).unwrap(); - - // then - assert_eq!(block.extrinsics().len(), 1); - } } diff --git a/core/inherents/src/lib.rs b/core/inherents/src/lib.rs index e851959ee0..7b99c7ba52 100644 --- a/core/inherents/src/lib.rs +++ b/core/inherents/src/lib.rs @@ -44,9 +44,6 @@ use parking_lot::RwLock; #[cfg(feature = "std")] use std::{sync::Arc, format}; -#[cfg(feature = "std")] -pub mod pool; - pub use runtime_primitives::RuntimeString; /// An identifier for an inherent. diff --git a/core/inherents/src/pool.rs b/core/inherents/src/pool.rs deleted file mode 100644 index 2c7e953696..0000000000 --- a/core/inherents/src/pool.rs +++ /dev/null @@ -1,75 +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 . - -//! Inherents Pool - -use std::{fmt, mem, vec}; -use parking_lot::Mutex; - -/// Inherents Pool -/// -/// The pool is responsible to collect inherents asynchronously generated -/// by some other parts of the code and make them ready for the next block production. -pub struct InherentsPool { - data: Mutex>, -} - -impl Default for InherentsPool { - fn default() -> Self { - InherentsPool { - data: Default::default(), - } - } -} - -impl fmt::Debug for InherentsPool { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - let mut builder = fmt.debug_struct("InherentsPool"); - if let Some(data) = self.data.try_lock() { - builder.field("data", &*data); - } - builder.finish() - } -} - -impl InherentsPool { - /// Add inherent extrinsic to the pool. - /// - /// This inherent will be appended to the next produced block. - pub fn add(&self, extrinsic: T) { - self.data.lock().push(extrinsic); - } - - /// Drain all currently queued inherents. - pub fn drain(&self) -> Vec { - mem::replace(&mut *self.data.lock(), vec![]) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn should_drain_inherents_to_given_data() { - let pool = InherentsPool::default(); - pool.add(5); - pool.add(7); - - assert_eq!(pool.drain(), vec![5, 7]); - assert_eq!(pool.drain(), vec![]); - } -} diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 241edfea9f..14341e2458 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -10,7 +10,6 @@ edition = "2018" client = { package = "substrate-client", path = "../../core/client" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common" } futures = "0.1.25" -inherents = { package = "substrate-inherents", path = "../../core/inherents" } log = "0.4" offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } parity-codec = { version = "3.3", features = ["derive"] } diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 5d2a636be3..25a8a2ebaa 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -16,7 +16,6 @@ use std::sync::Arc; use futures::{Stream, Future, sync::mpsc}; -use inherents::pool::InherentsPool; use log::{info, debug, warn}; use parity_codec::Decode; use primitives::OffchainExt; @@ -46,21 +45,18 @@ impl OffchainExt for AsyncApi { pub(crate) struct Api { receiver: Option>, transaction_pool: Arc>, - inherents_pool: Arc::Extrinsic>>, at: BlockId, } impl Api { pub fn new( transaction_pool: Arc>, - inherents_pool: Arc::Extrinsic>>, at: BlockId, ) -> (AsyncApi, Self) { let (tx, rx) = mpsc::unbounded(); let api = Self { receiver: Some(rx), transaction_pool, - inherents_pool, at, }; (AsyncApi(tx), api) @@ -90,9 +86,8 @@ impl Api { info!("Submitting to the pool: {:?} (isSigned: {:?})", xt, xt.is_signed()); match self.transaction_pool.submit_one(&self.at, xt.clone()) { Ok(hash) => debug!("[{:?}] Offchain transaction added to the pool.", hash), - Err(_) => { - debug!("Offchain inherent added to the pool."); - self.inherents_pool.add(xt); + Err(e) => { + debug!("Couldn't submit transaction: {:?}", e); }, } } diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index cac960f250..f176fadd0d 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -19,8 +19,8 @@ //! The offchain workers is a special function of the runtime that //! gets executed after block is imported. During execution //! it's able to asynchronously submit extrinsics that will either -//! be propagated to other nodes (transactions) or will be -//! added to the next block produced by the node as inherents. +//! be propagated to other nodes added to the next block +//! produced by the node as unsigned transactions. //! //! Offchain workers can be used for computation-heavy tasks //! that are not feasible for execution during regular block processing. @@ -39,7 +39,6 @@ use std::{ }; use client::runtime_api::ApiExt; -use inherents::pool::InherentsPool; use log::{debug, warn}; use primitives::ExecutionContext; use runtime_primitives::{ @@ -57,7 +56,6 @@ pub use offchain_primitives::OffchainWorkerApi; #[derive(Debug)] pub struct OffchainWorkers { client: Arc, - inherents_pool: Arc::Extrinsic>>, executor: TaskExecutor, _block: PhantomData, } @@ -66,12 +64,10 @@ impl OffchainWorkers { /// Creates new `OffchainWorkers`. pub fn new( client: Arc, - inherents_pool: Arc::Extrinsic>>, executor: TaskExecutor, ) -> Self { Self { client, - inherents_pool, executor, _block: PhantomData, } @@ -97,7 +93,7 @@ impl OffchainWorkers where debug!("Checking offchain workers at {:?}: {:?}", at, has_api); if has_api.unwrap_or(false) { - let (api, runner) = api::Api::new(pool.clone(), self.inherents_pool.clone(), at.clone()); + let (api, runner) = api::Api::new(pool.clone(), at.clone()); self.executor.spawn(runner.process()); debug!("Running offchain workers at {:?}", at); @@ -119,14 +115,14 @@ mod tests { let runtime = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone()))); - let inherents = Arc::new(InherentsPool::default()); // when - let offchain = OffchainWorkers::new(client, inherents.clone(), runtime.executor()); + let offchain = OffchainWorkers::new(client, runtime.executor()); offchain.on_block_imported(&0u64, &pool); // then runtime.shutdown_on_idle().wait().unwrap(); - assert_eq!(inherents.drain().len(), 1); + assert_eq!(pool.status().ready, 1); + assert_eq!(pool.ready().next().unwrap().is_propagateable(), false); } } diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index bf13a51fac..89804166d6 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -16,7 +16,6 @@ exit-future = "0.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" target_info = "0.1" -inherents = { package = "substrate-inherents", path = "../../core/inherents" } keystore = { package = "substrate-keystore", path = "../../core/keystore" } sr-io = { path = "../../core/sr-io" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 0d9d7dcdfc..3876279cc7 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -635,7 +635,7 @@ mod tests { use super::*; use consensus_common::BlockOrigin; use client::LongestChain; - use substrate_test_client::{self, TestClient, AccountKeyring, runtime::Transfer}; + use substrate_test_client::{TestClient, AccountKeyring, runtime::Transfer}; #[test] fn should_remove_transactions_from_the_pool() { diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 1eb59872ce..cb65ece34e 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -34,7 +34,6 @@ use parking_lot::Mutex; use client::BlockchainEvents; use exit_future::Signal; use futures::prelude::*; -use inherents::pool::InherentsPool; use keystore::Store as Keystore; use log::{info, warn, debug}; use parity_codec::{Encode, Decode}; @@ -76,7 +75,6 @@ pub struct Service { select_chain: Option<::SelectChain>, network: Option>>, transaction_pool: Arc>, - inherents_pool: Arc>>, keystore: Keystore, exit: ::exit_future::Exit, signal: Option, @@ -211,11 +209,9 @@ impl Service { .select(exit.clone()) .then(|_| Ok(()))); - let inherents_pool = Arc::new(InherentsPool::default()); let offchain_workers = if config.offchain_worker { Some(Arc::new(offchain::OffchainWorkers::new( client.clone(), - inherents_pool.clone(), task_executor.clone(), ))) } else { @@ -381,7 +377,6 @@ impl Service { network: Some(network), select_chain, transaction_pool, - inherents_pool, signal: Some(signal), keystore, config, @@ -433,11 +428,6 @@ impl Service where Components: components::Components { self.transaction_pool.clone() } - /// Get shared inherents pool instance. - pub fn inherents_pool(&self) -> Arc>> { - self.inherents_pool.clone() - } - /// Get shared keystore. pub fn keystore(&self) -> &Keystore { &self.keystore @@ -498,17 +488,32 @@ impl TransactionPoolAdapter { } } +/// Get transactions for propagation. +/// +/// Function extracted to simplify the test and prevent creating `ServiceFactory`. +fn transactions_to_propagate(pool: &TransactionPool) + -> Vec<(H, B::Extrinsic)> +where + PoolApi: ChainApi, + B: BlockT, + H: std::hash::Hash + Eq + runtime_primitives::traits::Member + serde::Serialize, + E: txpool::error::IntoPoolError + From, +{ + pool.ready() + .filter(|t| t.is_propagateable()) + .map(|t| { + let hash = t.hash.clone(); + let ex: B::Extrinsic = t.data.clone(); + (hash, ex) + }) + .collect() +} + impl network::TransactionPool, ComponentBlock> for TransactionPoolAdapter where ::RuntimeApi: Send + Sync { fn transactions(&self) -> Vec<(ComponentExHash, ComponentExtrinsic)> { - self.pool.ready() - .map(|t| { - let hash = t.hash.clone(); - let ex: ComponentExtrinsic = t.data.clone(); - (hash, ex) - }) - .collect() + transactions_to_propagate(&self.pool) } fn import(&self, transaction: &ComponentExtrinsic) -> Option> { @@ -745,3 +750,42 @@ macro_rules! construct_service_factory { } } } + +#[cfg(test)] +mod tests { + use super::*; + use client::LongestChain; + use consensus_common::SelectChain; + use runtime_primitives::traits::BlindCheckable; + use substrate_test_client::{AccountKeyring, runtime::{Extrinsic, Transfer}}; + + #[test] + fn should_not_propagate_transactions_that_are_marked_as_such() { + // given + let client = Arc::new(substrate_test_client::new()); + let pool = Arc::new(TransactionPool::new( + Default::default(), + transaction_pool::ChainApi::new(client.clone()) + )); + let best = LongestChain::new(client.backend().clone(), client.import_lock()) + .best_chain().unwrap(); + let transaction = Transfer { + amount: 5, + nonce: 0, + from: AccountKeyring::Alice.into(), + to: Default::default(), + }.into_signed_tx(); + pool.submit_one(&BlockId::hash(best.hash()), transaction.clone()).unwrap(); + pool.submit_one(&BlockId::hash(best.hash()), Extrinsic::IncludeData(vec![1])).unwrap(); + assert_eq!(pool.status().ready, 2); + + // when + let transactions = transactions_to_propagate(&pool); + + // then + assert_eq!(transactions.len(), 1); + assert!(transactions[0].1.clone().check().is_ok()); + // this should not panic + let _ = transactions[0].1.transfer(); + } +} diff --git a/core/sr-primitives/src/transaction_validity.rs b/core/sr-primitives/src/transaction_validity.rs index 29d2a82a24..f36599b67b 100644 --- a/core/sr-primitives/src/transaction_validity.rs +++ b/core/sr-primitives/src/transaction_validity.rs @@ -30,7 +30,7 @@ pub type TransactionLongevity = u64; pub type TransactionTag = Vec; /// Information on a transaction's validity and, if valid, on how it relates to other transactions. -#[derive(Clone, PartialEq, Eq, Encode, Decode)] +#[derive(Clone, PartialEq, Eq, Encode)] #[cfg_attr(feature = "std", derive(Debug))] pub enum TransactionValidity { /// Transaction is invalid. Details are described by the error code. @@ -59,7 +59,74 @@ pub enum TransactionValidity { /// Longevity describes minimum number of blocks the validity is correct. /// After this period transaction should be removed from the pool or revalidated. longevity: TransactionLongevity, + /// A flag indicating if the transaction should be propagated to other peers. + /// + /// By setting `false` here the transaction will still be considered for + /// including in blocks that are authored on the current node, but will + /// never be sent to other peers. + propagate: bool, }, /// Transaction validity can't be determined. Unknown(i8), } + +impl Decode for TransactionValidity { + fn decode(value: &mut I) -> Option { + match value.read_byte()? { + 0 => Some(TransactionValidity::Invalid(i8::decode(value)?)), + 1 => { + let priority = TransactionPriority::decode(value)?; + let requires = Vec::decode(value)?; + let provides = Vec::decode(value)?; + let longevity = TransactionLongevity::decode(value)?; + let propagate = bool::decode(value).unwrap_or(true); + + Some(TransactionValidity::Valid { + priority, requires, provides, longevity, propagate, + }) + }, + 2 => Some(TransactionValidity::Unknown(i8::decode(value)?)), + _ => None, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn should_decode_with_backward_compat() { + let old_encoding = vec![ + 1, 5, 0, 0, 0, 0, 0, 0, 0, 4, 16, 1, 2, 3, 4, 4, 12, 4, 5, 6, 42, 0, 0, 0, 0, 0, 0, 0 + ]; + + assert_eq!(TransactionValidity::decode(&mut &*old_encoding), Some(TransactionValidity::Valid { + priority: 5, + requires: vec![vec![1, 2, 3, 4]], + provides: vec![vec![4, 5, 6]], + longevity: 42, + propagate: true, + })); + } + + #[test] + fn should_encode_and_decode() { + let v = TransactionValidity::Valid { + priority: 5, + requires: vec![vec![1, 2, 3, 4]], + provides: vec![vec![4, 5, 6]], + longevity: 42, + propagate: false, + }; + + let encoded = v.encode(); + assert_eq!( + encoded, + vec![1, 5, 0, 0, 0, 0, 0, 0, 0, 4, 16, 1, 2, 3, 4, 4, 12, 4, 5, 6, 42, 0, 0, 0, 0, 0, 0, 0, 0] + ); + + // decode back + assert_eq!(TransactionValidity::decode(&mut &*encoded), Some(v)); + } +} diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index e7c6348495..980ce810e4 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -34,8 +34,9 @@ use substrate_client::{ impl_runtime_apis, }; use runtime_primitives::{ - ApplyResult, transaction_validity::TransactionValidity, + ApplyResult, create_runtime_str, + transaction_validity::TransactionValidity, traits::{ BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT, GetNodeBlockType, GetRuntimeBlockType, AuthorityIdFor, Verify, @@ -121,14 +122,18 @@ impl BlindCheckable for Extrinsic { Err(runtime_primitives::BAD_SIGNATURE) } }, - Extrinsic::IncludeData(data) => Ok(Extrinsic::IncludeData(data)), + Extrinsic::IncludeData(_) => Err(runtime_primitives::BAD_SIGNATURE), } } } impl ExtrinsicT for Extrinsic { fn is_signed(&self) -> Option { - Some(true) + if let Extrinsic::IncludeData(_) = *self { + Some(false) + } else { + Some(true) + } } } @@ -361,6 +366,16 @@ cfg_if! { impl client_api::TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { + if let Extrinsic::IncludeData(data) = utx { + return TransactionValidity::Valid { + priority: data.len() as u64, + requires: vec![], + provides: vec![data], + longevity: 1, + propagate: false, + }; + } + system::validate_transaction(utx) } } @@ -499,6 +514,16 @@ cfg_if! { impl client_api::TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { + if let Extrinsic::IncludeData(data) = utx { + return TransactionValidity::Valid { + priority: data.len() as u64, + requires: vec![], + provides: vec![data], + longevity: 1, + propagate: false, + }; + } + system::validate_transaction(utx) } } diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index d7dccd33be..491ca0db36 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -190,6 +190,7 @@ pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { requires, provides, longevity: 64, + propagate: true, } } diff --git a/core/transaction-pool/graph/src/base_pool.rs b/core/transaction-pool/graph/src/base_pool.rs index 74e499674a..b3a2cf0e54 100644 --- a/core/transaction-pool/graph/src/base_pool.rs +++ b/core/transaction-pool/graph/src/base_pool.rs @@ -100,6 +100,15 @@ pub struct Transaction { pub requires: Vec, /// Tags that this transaction provides. pub provides: Vec, + /// Should that transaction be propagated. + pub propagate: bool, +} + +impl Transaction { + /// Returns `true` if the transaction should be propagated to other peers. + pub fn is_propagateable(&self) -> bool { + self.propagate + } } impl fmt::Debug for Transaction where @@ -123,6 +132,7 @@ impl fmt::Debug for Transaction where write!(fmt, "priority: {:?}, ", &self.priority)?; write!(fmt, "valid_till: {:?}, ", &self.valid_till)?; write!(fmt, "bytes: {:?}, ", &self.bytes)?; + write!(fmt, "propagate: {:?}, ", &self.propagate)?; write!(fmt, "requires: [")?; print_tags(fmt, &self.requires)?; write!(fmt, "], provides: [")?; @@ -473,6 +483,7 @@ mod tests { valid_till: 64u64, requires: vec![], provides: vec![vec![1]], + propagate: true, }).unwrap(); // then @@ -494,6 +505,7 @@ mod tests { valid_till: 64u64, requires: vec![], provides: vec![vec![1]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![1u8], @@ -503,6 +515,7 @@ mod tests { valid_till: 64u64, requires: vec![], provides: vec![vec![1]], + propagate: true, }).unwrap_err(); // then @@ -525,6 +538,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![0]], provides: vec![vec![1]], + propagate: true, }).unwrap(); assert_eq!(pool.ready().count(), 0); assert_eq!(pool.ready.len(), 0); @@ -536,6 +550,7 @@ mod tests { valid_till: 64u64, requires: vec![], provides: vec![vec![0]], + propagate: true, }).unwrap(); // then @@ -557,6 +572,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![0]], provides: vec![vec![1]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![3u8], @@ -566,6 +582,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![2]], provides: vec![], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![2u8], @@ -575,6 +592,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![1]], provides: vec![vec![3], vec![2]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![4u8], @@ -584,6 +602,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![3], vec![4]], provides: vec![], + propagate: true, }).unwrap(); assert_eq!(pool.ready().count(), 0); assert_eq!(pool.ready.len(), 0); @@ -596,6 +615,7 @@ mod tests { valid_till: 64u64, requires: vec![], provides: vec![vec![0], vec![4]], + propagate: true, }).unwrap(); // then @@ -627,6 +647,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![0]], provides: vec![vec![1]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![3u8], @@ -636,6 +657,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![1]], provides: vec![vec![2]], + propagate: true, }).unwrap(); assert_eq!(pool.ready().count(), 0); assert_eq!(pool.ready.len(), 0); @@ -649,6 +671,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![2]], provides: vec![vec![0]], + propagate: true, }).unwrap(); // then @@ -668,6 +691,7 @@ mod tests { valid_till: 64u64, requires: vec![], provides: vec![vec![0]], + propagate: true, }).unwrap(); let mut it = pool.ready().into_iter().map(|tx| tx.data[0]); assert_eq!(it.next(), Some(4)); @@ -695,6 +719,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![0]], provides: vec![vec![1]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![3u8], @@ -704,6 +729,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![1]], provides: vec![vec![2]], + propagate: true, }).unwrap(); assert_eq!(pool.ready().count(), 0); assert_eq!(pool.ready.len(), 0); @@ -717,6 +743,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![2]], provides: vec![vec![0]], + propagate: true, }).unwrap(); // then @@ -736,6 +763,7 @@ mod tests { valid_till: 64u64, requires: vec![], provides: vec![vec![0]], + propagate: true, }).unwrap_err(); let mut it = pool.ready().into_iter().map(|tx| tx.data[0]); assert_eq!(it.next(), None); @@ -759,6 +787,7 @@ mod tests { valid_till: 64u64, requires: vec![], provides: vec![vec![0], vec![4]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![1u8], @@ -768,6 +797,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![0]], provides: vec![vec![1]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![3u8], @@ -777,6 +807,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![2]], provides: vec![], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![2u8], @@ -786,6 +817,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![1]], provides: vec![vec![3], vec![2]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![4u8], @@ -795,6 +827,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![3], vec![4]], provides: vec![], + propagate: true, }).unwrap(); // future pool.import(Transaction { @@ -805,6 +838,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![11]], provides: vec![], + propagate: true, }).unwrap(); assert_eq!(pool.ready().count(), 5); assert_eq!(pool.future.len(), 1); @@ -830,6 +864,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![0]], provides: vec![vec![100]], + propagate: true, }).unwrap(); // ready pool.import(Transaction { @@ -840,6 +875,7 @@ mod tests { valid_till: 64u64, requires: vec![], provides: vec![vec![1]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![2u8], @@ -849,6 +885,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![2]], provides: vec![vec![3]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![3u8], @@ -858,6 +895,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![1]], provides: vec![vec![2]], + propagate: true, }).unwrap(); pool.import(Transaction { data: vec![4u8], @@ -867,6 +905,7 @@ mod tests { valid_till: 64u64, requires: vec![vec![3], vec![2]], provides: vec![vec![4]], + propagate: true, }).unwrap(); assert_eq!(pool.ready().count(), 4); @@ -901,8 +940,36 @@ mod tests { valid_till: 64u64, requires: vec![vec![3], vec![2]], provides: vec![vec![4]], + propagate: true, }), - r#"Transaction { hash: 4, priority: 1000, valid_till: 64, bytes: 1, requires: [03,02], provides: [04], data: [4]}"#.to_owned() + "Transaction { \ +hash: 4, priority: 1000, valid_till: 64, bytes: 1, propagate: true, \ +requires: [03,02], provides: [04], data: [4]}".to_owned() ); } + + #[test] + fn transaction_propagation() { + assert_eq!(Transaction { + data: vec![4u8], + bytes: 1, + hash: 4, + priority: 1_000u64, + valid_till: 64u64, + requires: vec![vec![3], vec![2]], + provides: vec![vec![4]], + propagate: true, + }.is_propagateable(), true); + + assert_eq!(Transaction { + data: vec![4u8], + bytes: 1, + hash: 4, + priority: 1_000u64, + valid_till: 64u64, + requires: vec![vec![3], vec![2]], + provides: vec![vec![4]], + propagate: false, + }.is_propagateable(), false); + } } diff --git a/core/transaction-pool/graph/src/pool.rs b/core/transaction-pool/graph/src/pool.rs index a5b7a3d2aa..61e234f156 100644 --- a/core/transaction-pool/graph/src/pool.rs +++ b/core/transaction-pool/graph/src/pool.rs @@ -129,7 +129,7 @@ impl Pool { } match self.api.validate_transaction(at, xt.clone())? { - TransactionValidity::Valid { priority, requires, provides, longevity } => { + TransactionValidity::Valid { priority, requires, provides, longevity, propagate } => { Ok(base::Transaction { data: xt, bytes, @@ -137,6 +137,7 @@ impl Pool { priority, requires, provides, + propagate, valid_till: block_number .saturated_into::() .saturating_add(longevity), @@ -491,6 +492,7 @@ mod tests { requires: if nonce > block_number { vec![vec![nonce as u8 - 1]] } else { vec![] }, provides: vec![vec![nonce as u8]], longevity: 3, + propagate: true, }) } } diff --git a/core/transaction-pool/graph/src/ready.rs b/core/transaction-pool/graph/src/ready.rs index ca3d7322cc..3497c1bc4b 100644 --- a/core/transaction-pool/graph/src/ready.rs +++ b/core/transaction-pool/graph/src/ready.rs @@ -499,6 +499,7 @@ mod tests { valid_till: 2, requires: vec![vec![1], vec![2]], provides: vec![vec![3], vec![4]], + propagate: true, } } @@ -558,6 +559,7 @@ mod tests { valid_till: u64::max_value(), // use the max_value() here for testing. requires: vec![tx1.provides[0].clone()], provides: vec![], + propagate: true, }; // when diff --git a/core/transaction-pool/graph/src/rotator.rs b/core/transaction-pool/graph/src/rotator.rs index 2ca51ef74e..41c1b5842a 100644 --- a/core/transaction-pool/graph/src/rotator.rs +++ b/core/transaction-pool/graph/src/rotator.rs @@ -120,6 +120,7 @@ mod tests { valid_till: 1, requires: vec![], provides: vec![], + propagate: true, }; (hash, tx) @@ -185,6 +186,7 @@ mod tests { valid_till, requires: vec![], provides: vec![], + propagate: true, } } diff --git a/core/transaction-pool/src/tests.rs b/core/transaction-pool/src/tests.rs index cab44f49cc..a1ee4a50df 100644 --- a/core/transaction-pool/src/tests.rs +++ b/core/transaction-pool/src/tests.rs @@ -53,6 +53,7 @@ impl txpool::ChainApi for TestApi { requires, provides, longevity: 64, + propagate: true, }) } diff --git a/node-template/src/service.rs b/node-template/src/service.rs index 48e26d1ca5..934cf87b9c 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -71,7 +71,6 @@ construct_service_factory! { let proposer = Arc::new(ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - inherents_pool: service.inherents_pool(), }); let client = service.client(); let select_chain = service.select_chain() diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index bb1c257155..e717166cd6 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -87,7 +87,6 @@ construct_service_factory! { let proposer = Arc::new(substrate_basic_authorship::ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - inherents_pool: service.inherents_pool(), }); let client = service.client(); diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 6bc118bdc0..86c73307b8 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 88, - impl_version: 89, + impl_version: 90, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 70285f7dfa..d1c22fcb6a 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -358,6 +358,7 @@ where requires, provides, longevity: TransactionLongevity::max_value(), + propagate: true, } }, (None, None) => UnsignedValidator::validate_unsigned(&xt.deconstruct().0), @@ -432,6 +433,7 @@ mod tests { requires: vec![], provides: vec![], longevity: std::u64::MAX, + propagate: false, }, _ => TransactionValidity::Invalid(0), } @@ -569,7 +571,8 @@ mod tests { priority: 0, requires: vec![], provides: vec![], - longevity: 18446744073709551615 + longevity: 18446744073709551615, + propagate: false, }; let mut t = new_test_ext(); -- GitLab From 58c3bbc40c2fb62b470cef2d2318d348f522dfad Mon Sep 17 00:00:00 2001 From: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> Date: Wed, 29 May 2019 10:07:01 -0400 Subject: [PATCH 050/140] Update runtime dependencies (#2721) --- core/executor/wasm/Cargo.lock | 94 +-- core/test-runtime/wasm/Cargo.lock | 964 +++++++++++++------------ node-template/runtime/wasm/Cargo.lock | 980 +++++++++++++------------- node/runtime/wasm/Cargo.lock | 967 ++++++++++++------------- 4 files changed, 1543 insertions(+), 1462 deletions(-) diff --git a/core/executor/wasm/Cargo.lock b/core/executor/wasm/Cargo.lock index b2d77765f7..34cd17116c 100644 --- a/core/executor/wasm/Cargo.lock +++ b/core/executor/wasm/Cargo.lock @@ -2,10 +2,10 @@ # It is not intended for manual editing. [[package]] name = "arrayvec" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -20,12 +20,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "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 = [ "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -33,15 +33,15 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.12.0" +version = "0.12.2" 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)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -54,7 +54,7 @@ dependencies = [ [[package]] name = "nodrop" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -70,7 +70,7 @@ name = "parity-codec" 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)", + "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -79,33 +79,33 @@ name = "parity-codec-derive" 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.19 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "primitive-types" -version = "0.2.3" +version = "0.2.4" 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)", - "uint 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro2" -version = "0.4.19" +version = "0.4.30" 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)", @@ -113,10 +113,10 @@ dependencies = [ [[package]] name = "quote" -version = "0.6.8" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -156,14 +156,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.79" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-io" version = "2.0.0" dependencies = [ - "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.2 (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 2.0.0", @@ -197,40 +197,40 @@ name = "substrate-primitives" version = "2.0.0" dependencies = [ "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)", + "hash-db 0.12.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)", "num-traits 0.2.8 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (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 2.0.0", ] [[package]] name = "syn" -version = "0.15.26" +version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", ] [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "uint" -version = "0.7.0" +version = "0.7.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)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -240,29 +240,29 @@ version = "0.1.0" 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 arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" "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 crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "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 nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "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.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-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "ffe022fb8c8bd254524b0b3305906c1921fa37a84a644e29079a9e62200c3901" -"checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "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.79 (registry+https://github.com/rust-lang/crates.io-index)" = "84257ccd054dc351472528c8587b4de2dbf0dc0fe2e634030c1a90bfdacebaa9" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" -"checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" -"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum uint 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91bb295c2c53c54742a6b8acb705114f6dfdf3c42becdb146a662cb77fcc0d02" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index 8439721da3..2f05852a50 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -33,7 +33,7 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.10" +version = "0.7.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)", @@ -44,12 +44,12 @@ name = "aio-limited" 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)", + "futures 0.1.27 (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-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)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -79,7 +79,7 @@ version = "0.1.1" 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.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -87,27 +87,26 @@ 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)", + "libc 0.2.55 (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)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.14" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (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.50 (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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -115,8 +114,8 @@ name = "backtrace-sys" version = "0.1.28" 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)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -174,10 +173,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)", @@ -193,7 +192,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)", @@ -206,7 +205,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -245,12 +244,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.30" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -258,8 +257,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -268,7 +267,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -289,7 +288,7 @@ name = "crossbeam" version = "0.6.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)", + "cfg-if 0.1.9 (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-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -341,7 +340,7 @@ version = "0.3.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)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -355,7 +354,7 @@ version = "0.7.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)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (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)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -375,7 +374,7 @@ name = "crossbeam-utils" version = "0.2.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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -383,7 +382,7 @@ name = "crossbeam-utils" version = "0.6.5" 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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -394,7 +393,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -435,14 +434,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.1.4" 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_core 0.3.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]] @@ -452,13 +451,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -492,7 +491,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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (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)", @@ -500,7 +499,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -519,7 +518,7 @@ 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)", + "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)", ] @@ -533,7 +532,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -541,7 +540,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -550,10 +549,10 @@ 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -563,12 +562,12 @@ source = "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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", @@ -613,7 +612,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -621,7 +620,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -654,7 +653,7 @@ 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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -664,7 +663,7 @@ 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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -674,10 +673,10 @@ 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)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -699,7 +698,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]] @@ -707,7 +706,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -717,16 +716,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.3" +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-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)", @@ -798,7 +797,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -811,21 +818,21 @@ name = "iovec" version = "0.1.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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" 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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -863,7 +870,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.50" +version = "0.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -872,7 +879,7 @@ 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)", + "futures 0.1.27 (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.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)", @@ -886,17 +893,17 @@ dependencies = [ "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-secio 0.8.1 (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-wasm-ext 0.1.1 (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)", + "parity-multiaddr 0.4.1 (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.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-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)", ] @@ -912,22 +919,22 @@ dependencies = [ "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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", + "parity-multiaddr 0.4.1 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", + "rw-stream-sink 0.1.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.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-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)", @@ -942,7 +949,7 @@ version = "0.8.0" 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.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -950,7 +957,7 @@ name = "libp2p-dns" 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)", + "futures 0.1.27 (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-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -966,9 +973,9 @@ dependencies = [ "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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", + "protobuf 2.6.1 (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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -983,12 +990,12 @@ 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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", @@ -1008,13 +1015,13 @@ dependencies = [ "bs58 0.2.2 (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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", + "parity-multiaddr 0.4.1 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1031,11 +1038,11 @@ 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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.1 (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)", @@ -1052,7 +1059,7 @@ 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)", + "futures 0.1.27 (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)", @@ -1067,17 +1074,17 @@ 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)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", + "protobuf 2.6.1 (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)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (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)", ] @@ -1088,10 +1095,10 @@ 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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.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)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1105,7 +1112,7 @@ name = "libp2p-plaintext" 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)", + "futures 0.1.27 (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)", ] @@ -1117,40 +1124,40 @@ 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)", + "futures 0.1.27 (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-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.8.0" +version = "0.8.1" 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.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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", + "js-sys 0.3.22 (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.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)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1159,7 +1166,7 @@ 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)", + "futures 0.1.27 (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)", @@ -1173,7 +1180,7 @@ name = "libp2p-uds" 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)", + "futures 0.1.27 (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-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1181,16 +1188,16 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" -version = "0.1.0" +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)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (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)", + "parity-send-wrapper 0.1.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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1198,11 +1205,11 @@ name = "libp2p-yamux" 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)", + "futures 0.1.27 (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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1232,7 +1239,7 @@ name = "log" version = "0.4.6" 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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1267,7 +1274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.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)", @@ -1278,15 +1285,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", @@ -1301,7 +1307,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazycell 1.2.1 (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 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1311,8 +1317,8 @@ 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.50 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1332,7 +1338,7 @@ version = "0.4.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)", + "futures 0.1.27 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1345,9 +1351,9 @@ name = "net2" 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.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1371,23 +1377,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1410,26 +1420,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.19" +version = "0.10.23" 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)", + "cfg-if 0.1.9 (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.50 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "openssl-sys" -version = "0.9.42" +version = "0.9.47" 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)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", ] @@ -1461,7 +1471,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1469,15 +1479,15 @@ name = "parity-codec-derive" 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)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1485,24 +1495,30 @@ dependencies = [ "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)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.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 = "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.2 (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-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-wasm" version = "0.31.3" @@ -1543,10 +1559,10 @@ name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (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]] @@ -1554,11 +1570,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (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]] @@ -1566,31 +1582,31 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (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 = "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.7 (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)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1615,21 +1631,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "primitive-types" -version = "0.2.3" +version = "0.2.4" 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.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1642,12 +1658,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.7" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1657,7 +1673,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.27" +version = "0.4.30" 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)", @@ -1665,7 +1681,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.4.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1683,7 +1699,7 @@ name = "quote" 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)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1691,7 +1707,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1701,10 +1717,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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1714,9 +1730,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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1724,17 +1740,17 @@ name = "rand" 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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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_jitter 0.1.4 (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]] @@ -1742,7 +1758,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1777,12 +1793,12 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1792,10 +1808,10 @@ 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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1803,7 +1819,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1821,7 +1837,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.1 (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)", ] @@ -1832,7 +1848,7 @@ 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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1846,7 +1862,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]] @@ -1854,24 +1870,24 @@ 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]] name = "regex" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.10 (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.5 (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)", @@ -1882,17 +1898,17 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1910,17 +1926,17 @@ dependencies = [ [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" 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)", + "futures 0.1.27 (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 = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1933,36 +1949,19 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.0.0" -source = "git+https://github.com/w3f/schnorrkel#3179838da9dd4896c12bb910e7c42477a3250641" -dependencies = [ - "clear_on_drop 0.2.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.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)", -] - -[[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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.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_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)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1990,20 +1989,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.89" +version = "1.0.91" 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)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.89" +version = "1.0.91" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2011,9 +2010,20 @@ name = "serde_json" 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)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (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]] @@ -2038,7 +2048,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)", @@ -2046,10 +2056,10 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" 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)", @@ -2086,7 +2096,7 @@ 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 1.0.91 (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)", ] @@ -2120,7 +2130,7 @@ dependencies = [ "rustc_version 0.2.3 (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.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]] @@ -2138,10 +2148,10 @@ name = "sr-api-macros" 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)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2166,9 +2176,9 @@ 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)", + "num-traits 0.2.8 (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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2187,7 +2197,7 @@ version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2197,7 +2207,7 @@ name = "srml-executive" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2210,7 +2220,7 @@ name = "srml-metadata" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -2222,8 +2232,8 @@ dependencies = [ "bitmask 0.5.0 (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.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)", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2236,31 +2246,31 @@ dependencies = [ name = "srml-support-procedural" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" 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)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2269,7 +2279,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2311,19 +2321,19 @@ 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" +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.0.0 (git+https://github.com/w3f/schnorrkel)", + "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)", ] @@ -2331,11 +2341,11 @@ dependencies = [ name = "substrate-client" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (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.3 (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)", "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)", @@ -2391,24 +2401,25 @@ name = "substrate-consensus-common" version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (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)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", + "parking_lot 0.7.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)", + "tokio-timer 0.2.11 (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)", + "futures 0.1.27 (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)", @@ -2417,7 +2428,7 @@ dependencies = [ "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)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2425,7 +2436,7 @@ name = "substrate-executor" version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", @@ -2439,7 +2450,7 @@ dependencies = [ "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)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2475,7 +2486,7 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2488,29 +2499,30 @@ dependencies = [ "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)", + "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)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (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)", + "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)", - "serde 1.0.89 (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.91 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", "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)", + "twox-hash 1.3.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-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2520,6 +2532,7 @@ version = "2.0.0" dependencies = [ "hash-db 0.12.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.8 (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 2.0.0", @@ -2537,7 +2550,7 @@ dependencies = [ "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 1.0.91 (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)", @@ -2550,11 +2563,11 @@ dependencies = [ name = "substrate-test-runtime" version = "2.0.0" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (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.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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2600,27 +2613,27 @@ 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.33" +version = "0.15.34" 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.30 (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)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2642,9 +2655,9 @@ 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)", + "libc 0.2.55 (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_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)", ] @@ -2661,9 +2674,9 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (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.55 (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]] @@ -2693,31 +2706,32 @@ name = "tk-listen" version = "0.2.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)", + "futures 0.1.27 (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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (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.16" +version = "0.1.20" 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)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (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.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-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.3 (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.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (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.11 (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)", ] @@ -2728,17 +2742,17 @@ version = "0.1.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)", + "futures 0.1.27 (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.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2746,19 +2760,19 @@ name = "tokio-dns-unofficial" version = "0.4.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)", + "futures 0.1.27 (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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (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)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2766,9 +2780,9 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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]] @@ -2777,7 +2791,7 @@ version = "0.1.12" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2787,25 +2801,25 @@ 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)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (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-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.3 (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.3" +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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2814,38 +2828,46 @@ version = "0.1.3" 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)", + "futures 0.1.27 (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)", + "mio 0.6.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-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" 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)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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]] +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]] @@ -2854,9 +2876,9 @@ version = "0.1.3" 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)", + "futures 0.1.27 (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 0.6.19 (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-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2868,11 +2890,11 @@ version = "0.2.5" 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)", + "futures 0.1.27 (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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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 0.6.19 (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.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2881,10 +2903,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2919,7 +2941,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.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)", @@ -2937,11 +2959,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.7.0" +version = "0.7.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)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2964,7 +2986,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3018,75 +3040,75 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" 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)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" 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)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3094,39 +3116,47 @@ 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)", + "futures 0.1.27 (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)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (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 = [ + "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" 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)", + "js-sys 0.3.22 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.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)", @@ -3139,7 +3169,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)", @@ -3161,7 +3191,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]] @@ -3174,7 +3204,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)", ] @@ -3187,9 +3217,9 @@ dependencies = [ "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 0.6.19 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.23 (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)", @@ -3207,21 +3237,21 @@ 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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.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)", + "futures 0.1.27 (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)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3240,15 +3270,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" +"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 arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "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 autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" "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" @@ -3257,19 +3287,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "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 cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" @@ -3285,19 +3315,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "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 ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" "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 curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" "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 derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "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 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 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.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" @@ -3305,14 +3335,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"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" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "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 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "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" @@ -3320,14 +3350,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" -"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-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "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" @@ -3336,16 +3366,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "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 itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "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 libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" "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" @@ -3359,10 +3390,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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-secio 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ea5c0636053e01575d6269b6112f9239e9d35ca861e3e5c7d6970a07f9e1682a" "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-wasm-ext 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "318d727d5e8e0fe3bb70aacbf99bde57334eae9559deff447edd993422dc0f03" "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" @@ -3372,8 +3403,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" -"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "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" @@ -3382,21 +3413,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "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" -"checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e" +"checksum openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" +"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" "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.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.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-multiaddr 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b574ca9f0c0235c04de4c5110542959f64c9b8882f638b70f6c6be52c75bdc46" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "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" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" @@ -3404,18 +3436,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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.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 primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "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.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" "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.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" @@ -3428,37 +3460,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"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 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 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 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 ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"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_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 rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"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 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 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 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 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.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "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" @@ -3474,11 +3506,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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.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 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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "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" @@ -3487,31 +3519,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" +"checksum tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" +"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-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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" +"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.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" +"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "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.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "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.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91bb295c2c53c54742a6b8acb705114f6dfdf3c42becdb146a662cb77fcc0d02" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "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-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "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" @@ -3520,19 +3553,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" "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 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.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "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" @@ -3540,6 +3574,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"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/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index c0d57e3fd9..2473762307 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -33,7 +33,7 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.10" +version = "0.7.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)", @@ -44,12 +44,12 @@ name = "aio-limited" 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)", + "futures 0.1.27 (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-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)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -79,7 +79,7 @@ version = "0.1.1" 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.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -87,27 +87,26 @@ 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)", + "libc 0.2.55 (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)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.14" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (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.50 (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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -115,8 +114,8 @@ name = "backtrace-sys" version = "0.1.28" 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)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -174,10 +173,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)", @@ -193,7 +192,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)", @@ -206,7 +205,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -245,12 +244,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.31" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -258,8 +257,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -268,7 +267,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -289,7 +288,7 @@ name = "crossbeam" version = "0.6.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)", + "cfg-if 0.1.9 (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-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -341,7 +340,7 @@ version = "0.3.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)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -355,7 +354,7 @@ version = "0.7.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)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (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)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -375,7 +374,7 @@ name = "crossbeam-utils" version = "0.2.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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -383,7 +382,7 @@ name = "crossbeam-utils" version = "0.6.5" 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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -394,7 +393,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -435,14 +434,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.1.4" 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_core 0.3.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]] @@ -452,13 +451,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -492,7 +491,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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (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)", @@ -500,7 +499,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -519,7 +518,7 @@ 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)", + "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)", ] @@ -533,7 +532,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -541,7 +540,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -550,10 +549,10 @@ 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -563,12 +562,12 @@ source = "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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", @@ -613,7 +612,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -621,7 +620,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -654,7 +653,7 @@ 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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -664,7 +663,7 @@ 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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -674,10 +673,10 @@ 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)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -699,7 +698,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]] @@ -707,7 +706,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -717,16 +716,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.3" +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-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)", @@ -798,7 +797,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -811,21 +818,21 @@ name = "iovec" version = "0.1.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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" 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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -863,7 +870,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.50" +version = "0.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -872,7 +879,7 @@ 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)", + "futures 0.1.27 (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.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)", @@ -886,17 +893,17 @@ dependencies = [ "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-secio 0.8.1 (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-wasm-ext 0.1.1 (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)", + "parity-multiaddr 0.4.1 (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.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-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)", ] @@ -912,22 +919,22 @@ dependencies = [ "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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", + "parity-multiaddr 0.4.1 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", + "rw-stream-sink 0.1.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.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-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)", @@ -942,7 +949,7 @@ version = "0.8.0" 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.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -950,7 +957,7 @@ name = "libp2p-dns" 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)", + "futures 0.1.27 (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-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -966,9 +973,9 @@ dependencies = [ "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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", + "protobuf 2.6.1 (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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -983,12 +990,12 @@ 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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", @@ -1008,13 +1015,13 @@ dependencies = [ "bs58 0.2.2 (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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", + "parity-multiaddr 0.4.1 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1031,11 +1038,11 @@ 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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.1 (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)", @@ -1052,7 +1059,7 @@ 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)", + "futures 0.1.27 (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)", @@ -1067,17 +1074,17 @@ 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)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", + "protobuf 2.6.1 (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)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (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)", ] @@ -1088,10 +1095,10 @@ 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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.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)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1105,7 +1112,7 @@ name = "libp2p-plaintext" 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)", + "futures 0.1.27 (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)", ] @@ -1117,40 +1124,40 @@ 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)", + "futures 0.1.27 (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-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.8.0" +version = "0.8.1" 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.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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", + "js-sys 0.3.22 (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.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)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1159,7 +1166,7 @@ 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)", + "futures 0.1.27 (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)", @@ -1173,7 +1180,7 @@ name = "libp2p-uds" 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)", + "futures 0.1.27 (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-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1181,16 +1188,16 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" -version = "0.1.0" +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)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (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)", + "parity-send-wrapper 0.1.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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1198,11 +1205,11 @@ name = "libp2p-yamux" 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)", + "futures 0.1.27 (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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1232,7 +1239,7 @@ name = "log" version = "0.4.6" 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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1267,7 +1274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.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)", @@ -1278,15 +1285,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", @@ -1301,7 +1307,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazycell 1.2.1 (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 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1311,8 +1317,8 @@ 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.50 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1332,7 +1338,7 @@ version = "0.4.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)", + "futures 0.1.27 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1345,9 +1351,9 @@ name = "net2" 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.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1356,7 +1362,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -1405,23 +1411,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1444,26 +1454,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.19" +version = "0.10.23" 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)", + "cfg-if 0.1.9 (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.50 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "openssl-sys" -version = "0.9.42" +version = "0.9.47" 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)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", ] @@ -1495,7 +1505,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1503,15 +1513,15 @@ name = "parity-codec-derive" 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)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1519,24 +1529,30 @@ dependencies = [ "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)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.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 = "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.2 (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-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-wasm" version = "0.31.3" @@ -1577,10 +1593,10 @@ name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (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]] @@ -1588,11 +1604,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (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]] @@ -1600,31 +1616,31 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (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 = "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.7 (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)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1649,21 +1665,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "primitive-types" -version = "0.2.3" +version = "0.2.4" 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.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1676,12 +1692,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.7" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1691,7 +1707,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.27" +version = "0.4.30" 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)", @@ -1699,7 +1715,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.4.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1717,7 +1733,7 @@ name = "quote" 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)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1725,7 +1741,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1735,10 +1751,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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1748,9 +1764,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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1758,17 +1774,17 @@ name = "rand" 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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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_jitter 0.1.4 (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]] @@ -1776,7 +1792,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1811,12 +1827,12 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1826,10 +1842,10 @@ 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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1837,7 +1853,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1855,7 +1871,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.1 (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)", ] @@ -1866,7 +1882,7 @@ 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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1880,7 +1896,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]] @@ -1888,24 +1904,24 @@ 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]] name = "regex" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.10 (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.5 (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)", @@ -1916,17 +1932,17 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1944,17 +1960,17 @@ dependencies = [ [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" 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)", + "futures 0.1.27 (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 = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1967,36 +1983,19 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.0.0" -source = "git+https://github.com/w3f/schnorrkel#0a0de4294b475ef6abdeebb50067f213ca79b3c7" -dependencies = [ - "clear_on_drop 0.2.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.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)", -] - -[[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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.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_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)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2024,20 +2023,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.89" +version = "1.0.91" 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)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.89" +version = "1.0.91" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2045,9 +2044,20 @@ name = "serde_json" 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)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (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]] @@ -2072,7 +2082,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)", @@ -2080,10 +2090,10 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" 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)", @@ -2120,7 +2130,7 @@ 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 1.0.91 (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)", ] @@ -2154,7 +2164,7 @@ dependencies = [ "rustc_version 0.2.3 (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.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]] @@ -2172,10 +2182,10 @@ name = "sr-api-macros" 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)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2200,9 +2210,9 @@ 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)", + "num-traits 0.2.8 (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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2221,7 +2231,7 @@ version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2231,7 +2241,7 @@ name = "srml-aura" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-session 2.0.0", @@ -2248,7 +2258,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2261,7 +2271,7 @@ name = "srml-consensus" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2275,7 +2285,7 @@ name = "srml-executive" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2289,7 +2299,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2304,7 +2314,7 @@ name = "srml-metadata" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -2315,7 +2325,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-consensus 2.0.0", @@ -2330,7 +2340,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2346,7 +2356,7 @@ name = "srml-sudo" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2362,8 +2372,8 @@ dependencies = [ "bitmask 0.5.0 (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.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)", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2376,31 +2386,31 @@ dependencies = [ name = "srml-support-procedural" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" 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)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2409,7 +2419,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2422,7 +2432,7 @@ name = "srml-timestamp" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2464,19 +2474,19 @@ 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" +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.0.0 (git+https://github.com/w3f/schnorrkel)", + "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)", ] @@ -2484,11 +2494,11 @@ dependencies = [ name = "substrate-client" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (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.3 (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)", "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)", @@ -2534,17 +2544,18 @@ name = "substrate-consensus-common" version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (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)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", + "parking_lot 0.7.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)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2552,7 +2563,7 @@ name = "substrate-executor" version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", @@ -2566,7 +2577,7 @@ dependencies = [ "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)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2602,7 +2613,7 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2615,29 +2626,30 @@ dependencies = [ "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)", + "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)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (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)", + "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)", - "serde 1.0.89 (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.91 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "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)", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.3.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-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2647,6 +2659,7 @@ version = "2.0.0" dependencies = [ "hash-db 0.12.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.8 (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 2.0.0", @@ -2664,7 +2677,7 @@ dependencies = [ "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 1.0.91 (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)", @@ -2693,27 +2706,27 @@ 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.33" +version = "0.15.34" 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.30 (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)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2735,9 +2748,9 @@ 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)", + "libc 0.2.55 (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_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)", ] @@ -2754,14 +2767,14 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (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.55 (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.1" +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)", @@ -2786,31 +2799,32 @@ name = "tk-listen" version = "0.2.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)", + "futures 0.1.27 (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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (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.16" +version = "0.1.20" 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)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (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.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-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.3 (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.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (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.11 (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)", ] @@ -2821,17 +2835,17 @@ version = "0.1.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)", + "futures 0.1.27 (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.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2839,19 +2853,19 @@ name = "tokio-dns-unofficial" version = "0.4.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)", + "futures 0.1.27 (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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (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)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2859,9 +2873,9 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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]] @@ -2870,7 +2884,7 @@ version = "0.1.12" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2880,25 +2894,25 @@ 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)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (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-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.3 (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.3" +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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2907,38 +2921,46 @@ version = "0.1.3" 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)", + "futures 0.1.27 (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)", + "mio 0.6.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-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" 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)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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]] +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]] @@ -2947,9 +2969,9 @@ version = "0.1.3" 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)", + "futures 0.1.27 (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 0.6.19 (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-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2961,11 +2983,11 @@ version = "0.2.5" 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)", + "futures 0.1.27 (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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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 0.6.19 (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.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2974,10 +2996,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3012,7 +3034,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.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)", @@ -3030,11 +3052,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.7.0" +version = "0.7.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)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3057,7 +3079,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3111,75 +3133,75 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" 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)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" 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)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3187,39 +3209,47 @@ 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)", + "futures 0.1.27 (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)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (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 = [ + "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" 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)", + "js-sys 0.3.22 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.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)", @@ -3232,7 +3262,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)", @@ -3254,7 +3284,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]] @@ -3267,7 +3297,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)", ] @@ -3280,9 +3310,9 @@ dependencies = [ "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 0.6.19 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.23 (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)", @@ -3300,21 +3330,21 @@ 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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.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)", + "futures 0.1.27 (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)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3333,15 +3363,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" +"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 arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "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 autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" "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" @@ -3350,19 +3380,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "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 cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" @@ -3378,19 +3408,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "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 ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" "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 curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" "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 derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "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 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 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.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" @@ -3398,14 +3428,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"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" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "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 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "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" @@ -3413,14 +3443,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" -"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-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "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" @@ -3429,16 +3459,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "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 itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "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 libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" "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" @@ -3452,10 +3483,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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-secio 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ea5c0636053e01575d6269b6112f9239e9d35ca861e3e5c7d6970a07f9e1682a" "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-wasm-ext 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "318d727d5e8e0fe3bb70aacbf99bde57334eae9559deff447edd993422dc0f03" "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" @@ -3465,8 +3496,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" -"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "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" @@ -3475,21 +3506,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "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" -"checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e" +"checksum openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" +"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" "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.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.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-multiaddr 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b574ca9f0c0235c04de4c5110542959f64c9b8882f638b70f6c6be52c75bdc46" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "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" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" @@ -3497,18 +3529,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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.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 primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "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.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" "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.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" @@ -3521,37 +3553,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"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 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 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 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 ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"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_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 rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"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 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 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 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 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.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "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" @@ -3567,44 +3599,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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.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 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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5388a470627f97a01a6e13389ced797a42b1611f9de7e0f6ca705675ac55297" +"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" +"checksum tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" +"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-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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" +"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.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" +"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "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.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "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.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91bb295c2c53c54742a6b8acb705114f6dfdf3c42becdb146a662cb77fcc0d02" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "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-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "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" @@ -3613,19 +3646,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" "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 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.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "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" @@ -3633,6 +3667,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"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/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index f564b3eca2..58b59ba4fc 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -33,7 +33,7 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.10" +version = "0.7.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)", @@ -44,12 +44,12 @@ name = "aio-limited" 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)", + "futures 0.1.27 (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-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)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -79,7 +79,7 @@ version = "0.1.1" 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.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -87,27 +87,26 @@ 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)", + "libc 0.2.55 (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)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.14" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (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.50 (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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -115,8 +114,8 @@ name = "backtrace-sys" version = "0.1.28" 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)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -174,10 +173,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)", @@ -193,7 +192,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)", @@ -206,7 +205,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -245,12 +244,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.30" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -258,8 +257,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -268,7 +267,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -289,7 +288,7 @@ name = "crossbeam" version = "0.6.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)", + "cfg-if 0.1.9 (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-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -341,7 +340,7 @@ version = "0.3.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)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -355,7 +354,7 @@ version = "0.7.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)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (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)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -375,7 +374,7 @@ name = "crossbeam-utils" version = "0.2.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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -383,7 +382,7 @@ name = "crossbeam-utils" version = "0.6.5" 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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -394,7 +393,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -435,14 +434,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.1.4" 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_core 0.3.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]] @@ -452,13 +451,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -492,7 +491,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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (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)", @@ -500,7 +499,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -519,7 +518,7 @@ 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)", + "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)", ] @@ -533,7 +532,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -541,7 +540,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -550,10 +549,10 @@ 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -563,12 +562,12 @@ source = "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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", @@ -613,7 +612,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -621,7 +620,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -654,7 +653,7 @@ 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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -664,7 +663,7 @@ 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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -674,10 +673,10 @@ 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)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -699,7 +698,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]] @@ -707,7 +706,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -717,16 +716,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.3" +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-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)", @@ -798,7 +797,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -806,7 +805,7 @@ name = "impl-serde" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -819,21 +818,21 @@ name = "iovec" version = "0.1.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)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" 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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -871,7 +870,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.50" +version = "0.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -880,7 +879,7 @@ 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)", + "futures 0.1.27 (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.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)", @@ -894,17 +893,17 @@ dependencies = [ "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-secio 0.8.1 (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-wasm-ext 0.1.1 (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)", + "parity-multiaddr 0.4.1 (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.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-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)", ] @@ -920,22 +919,22 @@ dependencies = [ "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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", + "parity-multiaddr 0.4.1 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", + "rw-stream-sink 0.1.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.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-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)", @@ -950,7 +949,7 @@ version = "0.8.0" 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.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -958,7 +957,7 @@ name = "libp2p-dns" 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)", + "futures 0.1.27 (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-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -974,9 +973,9 @@ dependencies = [ "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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", + "protobuf 2.6.1 (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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -991,12 +990,12 @@ 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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", @@ -1016,13 +1015,13 @@ dependencies = [ "bs58 0.2.2 (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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", + "parity-multiaddr 0.4.1 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1039,11 +1038,11 @@ 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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.1 (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)", @@ -1060,7 +1059,7 @@ 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)", + "futures 0.1.27 (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)", @@ -1075,17 +1074,17 @@ 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)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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)", + "protobuf 2.6.1 (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)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (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)", ] @@ -1096,10 +1095,10 @@ 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)", + "futures 0.1.27 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.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)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1113,7 +1112,7 @@ name = "libp2p-plaintext" 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)", + "futures 0.1.27 (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)", ] @@ -1125,40 +1124,40 @@ 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)", + "futures 0.1.27 (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-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.8.0" +version = "0.8.1" 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.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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", + "js-sys 0.3.22 (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.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)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (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)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1167,7 +1166,7 @@ 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)", + "futures 0.1.27 (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)", @@ -1181,7 +1180,7 @@ name = "libp2p-uds" 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)", + "futures 0.1.27 (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-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1189,16 +1188,16 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" -version = "0.1.0" +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)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (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)", + "parity-send-wrapper 0.1.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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1206,11 +1205,11 @@ name = "libp2p-yamux" 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)", + "futures 0.1.27 (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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1240,7 +1239,7 @@ name = "log" version = "0.4.6" 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)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1275,7 +1274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.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)", @@ -1286,15 +1285,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", @@ -1309,7 +1307,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazycell 1.2.1 (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 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1319,8 +1317,8 @@ 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.50 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1340,7 +1338,7 @@ version = "0.4.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)", + "futures 0.1.27 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1353,9 +1351,9 @@ name = "net2" 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.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1363,7 +1361,7 @@ name = "node-primitives" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -1378,7 +1376,7 @@ dependencies = [ "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)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", @@ -1435,23 +1433,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1474,26 +1476,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.19" +version = "0.10.23" 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)", + "cfg-if 0.1.9 (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.50 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "openssl-sys" -version = "0.9.42" +version = "0.9.47" 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)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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)", ] @@ -1525,7 +1527,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1533,15 +1535,15 @@ name = "parity-codec-derive" 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)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1549,24 +1551,30 @@ dependencies = [ "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)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.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 = "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.2 (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-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-wasm" version = "0.31.3" @@ -1607,10 +1615,10 @@ name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (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]] @@ -1618,11 +1626,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (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]] @@ -1630,31 +1638,31 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.9 (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 = "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.7 (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)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1682,7 +1690,7 @@ name = "primitive-types" version = "0.2.4" 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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1690,10 +1698,10 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1706,12 +1714,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.7" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1721,7 +1729,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.27" +version = "0.4.30" 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)", @@ -1729,7 +1737,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.4.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1757,7 +1765,7 @@ name = "quote" 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)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1765,7 +1773,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1775,10 +1783,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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1788,9 +1796,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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1798,17 +1806,17 @@ name = "rand" 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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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_jitter 0.1.4 (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]] @@ -1816,7 +1824,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1851,12 +1859,12 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1866,10 +1874,10 @@ 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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] @@ -1877,7 +1885,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1895,7 +1903,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.1 (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)", ] @@ -1906,7 +1914,7 @@ 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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1920,7 +1928,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]] @@ -1928,24 +1936,24 @@ 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]] name = "regex" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.10 (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.5 (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)", @@ -1956,17 +1964,17 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1984,17 +1992,17 @@ dependencies = [ [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" 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)", + "futures 0.1.27 (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 = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2007,36 +2015,19 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.0.0" -source = "git+https://github.com/w3f/schnorrkel#3179838da9dd4896c12bb910e7c42477a3250641" -dependencies = [ - "clear_on_drop 0.2.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.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)", -] - -[[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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.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_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)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2064,20 +2055,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.89" +version = "1.0.91" 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)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.89" +version = "1.0.91" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2085,9 +2076,20 @@ name = "serde_json" 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)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (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]] @@ -2112,7 +2114,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)", @@ -2120,10 +2122,10 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" 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)", @@ -2160,7 +2162,7 @@ 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 1.0.91 (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)", ] @@ -2194,7 +2196,7 @@ dependencies = [ "rustc_version 0.2.3 (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.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]] @@ -2212,10 +2214,10 @@ name = "sr-api-macros" 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)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2240,9 +2242,9 @@ 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)", + "num-traits 0.2.8 (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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2256,7 +2258,7 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", - "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]] @@ -2272,7 +2274,7 @@ version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2282,7 +2284,7 @@ name = "srml-aura" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-session 2.0.0", @@ -2299,7 +2301,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2312,7 +2314,7 @@ name = "srml-consensus" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2328,7 +2330,7 @@ dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-sandbox 2.0.0", @@ -2346,7 +2348,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2362,7 +2364,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2375,7 +2377,7 @@ name = "srml-executive" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2388,7 +2390,7 @@ name = "srml-finality-tracker" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2401,7 +2403,7 @@ name = "srml-grandpa" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-consensus 2.0.0", @@ -2419,7 +2421,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2434,7 +2436,7 @@ name = "srml-metadata" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -2445,7 +2447,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-consensus 2.0.0", @@ -2460,7 +2462,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2476,7 +2478,7 @@ name = "srml-sudo" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2492,8 +2494,8 @@ dependencies = [ "bitmask 0.5.0 (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.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)", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2506,31 +2508,31 @@ dependencies = [ name = "srml-support-procedural" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" 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)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2539,7 +2541,7 @@ version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2552,7 +2554,7 @@ name = "srml-timestamp" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2565,7 +2567,7 @@ name = "srml-treasury" version = "2.0.0" dependencies = [ "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 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-balances 2.0.0", @@ -2607,19 +2609,19 @@ 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" +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.0.0 (git+https://github.com/w3f/schnorrkel)", + "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)", ] @@ -2627,11 +2629,11 @@ dependencies = [ name = "substrate-client" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (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.3 (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)", "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)", @@ -2677,8 +2679,8 @@ name = "substrate-consensus-common" version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (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)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", @@ -2688,7 +2690,7 @@ dependencies = [ "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)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2696,7 +2698,7 @@ name = "substrate-executor" version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", @@ -2710,7 +2712,7 @@ dependencies = [ "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)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2757,7 +2759,7 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2770,30 +2772,30 @@ dependencies = [ "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)", + "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)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (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.4 (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)", + "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)", - "serde 1.0.89 (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.91 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "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)", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.3.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-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2803,7 +2805,7 @@ version = "2.0.0" dependencies = [ "hash-db 0.12.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)", + "num-traits 0.2.8 (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 2.0.0", @@ -2821,7 +2823,7 @@ dependencies = [ "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 1.0.91 (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)", @@ -2850,27 +2852,27 @@ 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.33" +version = "0.15.34" 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.30 (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)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2892,9 +2894,9 @@ 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)", + "libc 0.2.55 (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_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)", ] @@ -2911,14 +2913,14 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (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.55 (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.1" +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)", @@ -2943,31 +2945,32 @@ name = "tk-listen" version = "0.2.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)", + "futures 0.1.27 (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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (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.16" +version = "0.1.20" 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)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (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.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-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.3 (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.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (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.11 (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)", ] @@ -2978,17 +2981,17 @@ version = "0.1.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)", + "futures 0.1.27 (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.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2996,19 +2999,19 @@ name = "tokio-dns-unofficial" version = "0.4.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)", + "futures 0.1.27 (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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (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)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3016,9 +3019,9 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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]] @@ -3027,7 +3030,7 @@ version = "0.1.12" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3037,25 +3040,25 @@ 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)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (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-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.3 (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.3" +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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3064,38 +3067,46 @@ version = "0.1.3" 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)", + "futures 0.1.27 (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)", + "mio 0.6.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-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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.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]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" 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)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (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]] +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]] @@ -3104,9 +3115,9 @@ version = "0.1.3" 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)", + "futures 0.1.27 (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 0.6.19 (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-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3118,11 +3129,11 @@ version = "0.2.5" 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)", + "futures 0.1.27 (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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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 0.6.19 (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.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3131,10 +3142,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3169,7 +3180,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.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)", @@ -3191,7 +3202,7 @@ version = "0.7.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)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3214,7 +3225,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3268,75 +3279,75 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" 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)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" 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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" 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)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" 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.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" 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)", + "proc-macro2 0.4.30 (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)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3344,21 +3355,21 @@ 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)", + "futures 0.1.27 (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)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (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]] @@ -3372,20 +3383,20 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" 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)", + "js-sys 0.3.22 (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)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.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)", @@ -3398,7 +3409,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)", @@ -3420,7 +3431,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]] @@ -3433,7 +3444,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)", ] @@ -3446,9 +3457,9 @@ dependencies = [ "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 0.6.19 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.23 (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)", @@ -3466,21 +3477,21 @@ 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.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.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)", + "futures 0.1.27 (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)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3499,15 +3510,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" +"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 arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "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 autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" "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" @@ -3516,19 +3527,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "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 cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" @@ -3544,19 +3555,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "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 ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" "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 curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" "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 derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "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 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 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.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" @@ -3564,14 +3575,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"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" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "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 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "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" @@ -3579,14 +3590,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" -"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-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "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" @@ -3598,14 +3609,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "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 itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "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 libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" "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" @@ -3619,10 +3630,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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-secio 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ea5c0636053e01575d6269b6112f9239e9d35ca861e3e5c7d6970a07f9e1682a" "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-wasm-ext 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "318d727d5e8e0fe3bb70aacbf99bde57334eae9559deff447edd993422dc0f03" "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" @@ -3632,8 +3643,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" -"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "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" @@ -3642,21 +3653,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "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" -"checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e" +"checksum openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" +"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" "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.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.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-multiaddr 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b574ca9f0c0235c04de4c5110542959f64c9b8882f638b70f6c6be52c75bdc46" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "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" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" @@ -3664,18 +3676,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "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.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" "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" @@ -3689,37 +3701,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"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 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 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 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 ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"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_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 rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"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 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 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 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 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.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "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" @@ -3735,44 +3747,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 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.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 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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5388a470627f97a01a6e13389ced797a42b1611f9de7e0f6ca705675ac55297" +"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" +"checksum tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" +"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-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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" +"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.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" +"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "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.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "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.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "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-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "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" @@ -3781,20 +3794,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" "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 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 weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "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" @@ -3802,6 +3815,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"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" -- GitLab From a3026f7ee5d6bdd729abe5986f2a6f2a0aeb6205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Thu, 30 May 2019 13:50:23 +0200 Subject: [PATCH 051/140] Add RPC to remove and ban transactions from the pool. (#2732) --- core/rpc/src/author/hash.rs | 30 +++++++++++++++++++ core/rpc/src/author/mod.rs | 40 ++++++++++++++++++++----- core/rpc/src/author/tests.rs | 28 +++++++++++++++++ core/transaction-pool/graph/src/pool.rs | 3 +- 4 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 core/rpc/src/author/hash.rs diff --git a/core/rpc/src/author/hash.rs b/core/rpc/src/author/hash.rs new file mode 100644 index 0000000000..052c479834 --- /dev/null +++ b/core/rpc/src/author/hash.rs @@ -0,0 +1,30 @@ +// 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 primitives::Bytes; +use serde::Deserialize; + +/// RPC Extrinsic or hash +/// +/// Allows to refer to extrinsics either by their raw representation or by it's hash. +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum ExtrinsicOrHash { + /// The hash of the extrinsic. + Hash(Hash), + /// Raw extrinsic bytes. + Extrinsic(Bytes), +} diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index ae160f1d1a..59641e8466 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -18,9 +18,15 @@ use std::sync::Arc; -use log::warn; use client::{self, Client}; +use crate::rpc::futures::{Sink, Stream, Future}; +use crate::subscriptions::Subscriptions; +use jsonrpc_derive::rpc; +use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; +use log::warn; use parity_codec::{Encode, Decode}; +use primitives::{Bytes, Blake2Hasher, H256}; +use runtime_primitives::{generic, traits}; use transaction_pool::{ txpool::{ ChainApi as PoolChainApi, @@ -31,14 +37,9 @@ use transaction_pool::{ watcher::Status, }, }; -use jsonrpc_derive::rpc; -use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; -use primitives::{Bytes, Blake2Hasher, H256}; -use crate::rpc::futures::{Sink, Stream, Future}; -use runtime_primitives::{generic, traits}; -use crate::subscriptions::Subscriptions; pub mod error; +mod hash; #[cfg(test)] mod tests; @@ -59,6 +60,10 @@ pub trait AuthorApi { #[rpc(name = "author_pendingExtrinsics")] fn pending_extrinsics(&self) -> Result>; + /// Remove given extrinsic from the pool and temporarily ban it to prevent reimporting. + #[rpc(name = "author_removeExtrinsic")] + fn remove_extrinsic(&self, bytes_or_hash: Vec>) -> Result>; + /// Submit an extrinsic to watch. #[pubsub(subscription = "author_extrinsicUpdate", subscribe, name = "author_submitAndWatchExtrinsic")] fn watch_extrinsic(&self, metadata: Self::Metadata, subscriber: Subscriber>, bytes: Bytes); @@ -72,7 +77,7 @@ pub trait AuthorApi { pub struct Author where P: PoolChainApi + Sync + Send + 'static { /// Substrate client client: Arc::Block, RA>>, - /// Extrinsic pool + /// Transactions pool pool: Arc>, /// Subscriptions manager subscriptions: Subscriptions, @@ -118,6 +123,25 @@ impl AuthorApi, BlockHash

> for Author whe Ok(self.pool.ready().map(|tx| tx.data.encode().into()).collect()) } + fn remove_extrinsic(&self, bytes_or_hash: Vec>>) -> Result>> { + let hashes = bytes_or_hash.into_iter() + .map(|x| match x { + hash::ExtrinsicOrHash::Hash(h) => Ok(h), + hash::ExtrinsicOrHash::Extrinsic(bytes) => { + let xt = Decode::decode(&mut &bytes[..]).ok_or(error::Error::BadFormat)?; + Ok(self.pool.hash_of(&xt)) + }, + }) + .collect::>>()?; + + Ok( + self.pool.remove_invalid(&hashes) + .into_iter() + .map(|tx| tx.hash.clone()) + .collect() + ) + } + 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; diff --git a/core/rpc/src/author/tests.rs b/core/rpc/src/author/tests.rs index 4d0277f7d6..4c6a724acd 100644 --- a/core/rpc/src/author/tests.rs +++ b/core/rpc/src/author/tests.rs @@ -137,3 +137,31 @@ fn should_return_pending_extrinsics() { Ok(ref expected) if *expected == vec![Bytes(ex.encode())] ); } + +#[test] +fn should_remove_extrinsics() { + let runtime = runtime::Runtime::new().unwrap(); + let client = Arc::new(test_client::new()); + let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); + let p = Author { + client, + pool: pool.clone(), + subscriptions: Subscriptions::new(runtime.executor()), + }; + let ex1 = uxt(AccountKeyring::Alice, 0); + p.submit_extrinsic(ex1.encode().into()).unwrap(); + let ex2 = uxt(AccountKeyring::Alice, 1); + p.submit_extrinsic(ex2.encode().into()).unwrap(); + let ex3 = uxt(AccountKeyring::Bob, 0); + let hash3 = p.submit_extrinsic(ex3.encode().into()).unwrap(); + assert_eq!(pool.status().ready, 3); + + // now remove all 3 + let removed = p.remove_extrinsic(vec![ + hash::ExtrinsicOrHash::Hash(hash3), + // Removing this one will also remove ex2 + hash::ExtrinsicOrHash::Extrinsic(ex1.encode().into()), + ]).unwrap(); + + assert_eq!(removed.len(), 3); +} diff --git a/core/transaction-pool/graph/src/pool.rs b/core/transaction-pool/graph/src/pool.rs index 61e234f156..4498598aee 100644 --- a/core/transaction-pool/graph/src/pool.rs +++ b/core/transaction-pool/graph/src/pool.rs @@ -417,8 +417,7 @@ impl Pool { } /// Returns transaction hash - #[cfg(test)] - fn hash_of(&self, xt: &ExtrinsicFor) -> ExHash { + pub fn hash_of(&self, xt: &ExtrinsicFor) -> ExHash { self.api.hash_and_length(xt).0 } } -- GitLab From 2227c4fb6f5f11036b2ae36f67b52e4e33517866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Thu, 30 May 2019 17:30:21 +0200 Subject: [PATCH 052/140] Bump structopt and fix compilation. (#2736) --- Cargo.lock | 14 +++++++------- core/cli/src/lib.rs | 8 ++++---- core/cli/src/params.rs | 27 ++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index abd2e63f1b..f7a69e401e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2036,7 +2036,7 @@ dependencies = [ "srml-finality-tracker 2.0.0", "srml-indices 2.0.0", "srml-timestamp 2.0.0", - "structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.2.16 (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", @@ -3730,16 +3730,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "structopt" -version = "0.2.15" +version = "0.2.16" 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.15 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt-derive 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "structopt-derive" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3841,7 +3841,7 @@ dependencies = [ "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)", + "structopt 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 2.0.0", "substrate-keyring 2.0.0", "substrate-network 2.0.0", @@ -5822,8 +5822,8 @@ dependencies = [ "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.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 structopt 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fa19a5a708e22bb5be31c1b6108a2a902f909c4b9ba85cba44c06632386bc0ff" +"checksum structopt-derive 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "c6d59d0ae8ef8de16e49e3ca7afa16024a3e0dfd974a75ef93fdc5464e34523f" "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)" = "" diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 101151ea0d..3619e6491a 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -50,7 +50,7 @@ pub use structopt::clap::App; use params::{ RunCmd, PurgeChainCmd, RevertCmd, ImportBlocksCmd, ExportBlocksCmd, BuildSpecCmd, NetworkConfigurationParams, MergeParameters, TransactionPoolParams, - NodeKeyParams, NodeKeyType + NodeKeyParams, NodeKeyType, Cors, }; pub use params::{NoCustom, CoreParams, SharedParams}; pub use traits::{GetLogFilter, AugmentClap}; @@ -485,9 +485,9 @@ where 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 + Cors::All } else { - Some(vec![ + Cors::List(vec![ "http://localhost:*".into(), "http://127.0.0.1:*".into(), "https://localhost:*".into(), @@ -495,7 +495,7 @@ where "https://polkadot.js.org".into(), "https://substrate-ui.parity.io".into(), ]) - }); + }).into(); // Override telemetry if cli.no_telemetry { diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index e7d466a863..7439cc02c0 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -343,7 +343,7 @@ pub struct RunCmd { /// 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>>, + pub rpc_cors: Option, /// Specify the pruning mode, a number of blocks to keep or 'archive'. Default is 256. #[structopt(long = "pruning", value_name = "PRUNING_MODE")] @@ -490,8 +490,29 @@ fn parse_telemetry_endpoints(s: &str) -> Result<(String, u8), Box>` +/// handling of `structopt`. +#[derive(Clone, Debug)] +pub enum Cors { + /// All hosts allowed + All, + /// Only hosts on the list are allowed. + List(Vec), +} + +impl From for Option> { + fn from(cors: Cors) -> Self { + match cors { + Cors::All => None, + Cors::List(list) => Some(list), + } + } +} + /// Parse cors origins -fn parse_cors(s: &str) -> Result>, Box> { +fn parse_cors(s: &str) -> Result> { let mut is_all = false; let mut origins = Vec::new(); for part in s.split(',') { @@ -504,7 +525,7 @@ fn parse_cors(s: &str) -> Result>, Box> { } } - Ok(if is_all { None } else { Some(origins) }) + Ok(if is_all { Cors::All } else { Cors::List(origins) }) } impl_augment_clap!(RunCmd); -- GitLab From e6f75db5fbbb9d933aaf1e0c1719fed0326a199e Mon Sep 17 00:00:00 2001 From: Denis Andrejew Date: Thu, 30 May 2019 23:04:05 +0200 Subject: [PATCH 053/140] fix some typos in node-template/runtime/src/lib.rs (#2737) --- node-template/runtime/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 875b537a9f..b09fe7d787 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -155,7 +155,7 @@ impl indices::Trait for Runtime { type ResolveHint = indices::SimpleResolveHint; /// Determine whether an account is dead. type IsDeadAccount = Balances; - /// The uniquitous event type. + /// The ubiquitous event type. type Event = Event; } @@ -172,7 +172,7 @@ impl balances::Trait for Runtime { type OnFreeBalanceZero = (); /// What to do if a new account is created. type OnNewAccount = Indices; - /// The uniquitous event type. + /// The ubiquitous event type. type Event = Event; type TransactionPayment = (); @@ -181,7 +181,7 @@ impl balances::Trait for Runtime { } impl sudo::Trait for Runtime { - /// The uniquitous event type. + /// The ubiquitous event type. type Event = Event; type Proposal = Call; } -- GitLab From 910747afa6d78fc6ed1294e7a507ee35acd6e6a9 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 31 May 2019 10:28:09 +0300 Subject: [PATCH 054/140] Import headers from BlockAnnounce message on light nodes (#2731) * import headers from announce message on light * lines width * added comments --- core/network/src/protocol.rs | 50 ++++++- core/network/src/sync.rs | 271 ++++++++++++++++++++++------------ core/network/src/test/mod.rs | 4 +- core/network/src/test/sync.rs | 33 +++++ 4 files changed, 262 insertions(+), 96 deletions(-) diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 2d7799b5bb..baca6f3bf6 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -521,8 +521,9 @@ impl, H: ExHashT> Protocol { } }, GenericMessage::BlockAnnounce(announce) => { - self.on_block_announce(network_out, who.clone(), announce); + let outcome = self.on_block_announce(network_out, who.clone(), announce); self.update_peer_info(&who); + return outcome; }, GenericMessage::Transactions(m) => self.on_extrinsics(network_out, transaction_pool, who, m), @@ -1019,7 +1020,7 @@ impl, H: ExHashT> Protocol { mut network_out: &mut dyn NetworkOut, who: PeerId, announce: message::BlockAnnounce - ) { + ) -> CustomMessageOutcome { let header = announce.header; let hash = header.hash(); { @@ -1028,12 +1029,55 @@ impl, H: ExHashT> Protocol { } } self.on_demand_core.on_block_announce(&mut network_out, who.clone(), *header.number()); - self.sync.on_block_announce( + let try_import = self.sync.on_block_announce( &mut ProtocolContext::new(&mut self.context_data, network_out), who.clone(), hash, &header, ); + + // try_import is only true when we have all data required to import block + // in the BlockAnnounce message. This is only when: + // 1) we're on light client; + // AND + // - EITHER 2.1) announced block is stale; + // - OR 2.2) announced block is NEW and we normally only want to download this single block (i.e. + // there are no ascendants of this block scheduled for retrieval) + if !try_import { + return CustomMessageOutcome::None; + } + + // to import header from announced block let's construct response to request that normally would have + // been sent over network (but it is not in our case) + let blocks_to_import = self.sync.on_block_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), + who.clone(), + message::generic::BlockRequest { + id: 0, + fields: BlockAttributes::HEADER, + from: message::FromBlock::Hash(hash), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }, + message::generic::BlockResponse { + id: 0, + blocks: vec![ + message::generic::BlockData { + hash: hash, + header: Some(header), + body: None, + receipt: None, + message_queue: None, + justification: None, + }, + ], + }, + ); + match blocks_to_import { + Some((origin, blocks)) => CustomMessageOutcome::BlockImport(origin, blocks), + None => CustomMessageOutcome::None, + } } /// Call this when a block has been imported in the import queue and we should announce it on diff --git a/core/network/src/sync.rs b/core/network/src/sync.rs index fdd36a024d..e451372847 100644 --- a/core/network/src/sync.rs +++ b/core/network/src/sync.rs @@ -31,6 +31,7 @@ //! use std::cmp::max; +use std::ops::Range; use std::collections::{HashMap, VecDeque}; use log::{debug, trace, warn, info}; use crate::protocol::PeerInfo as ProtocolPeerInfo; @@ -135,6 +136,7 @@ pub struct ChainSync { blocks: BlockCollection, best_queued_number: NumberFor, best_queued_hash: B::Hash, + role: Roles, required_block_attributes: message::BlockAttributes, extra_requests: ExtraRequestsAggregator, queue_blocks: HashSet, @@ -195,6 +197,7 @@ impl ChainSync { 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), extra_requests: ExtraRequestsAggregator::new(), + role, required_block_attributes, queue_blocks: Default::default(), best_importing_number: Zero::zero(), @@ -665,12 +668,21 @@ impl ChainSync { // Abort search. peer.state = PeerSyncState::Available; } - trace!(target: "sync", "Updating peer {} info, ours={}, common={}, their best={}", n, number, peer.common_number, peer.best_number); - if peer.best_number >= number { - peer.common_number = number; + let new_common_number = if peer.best_number >= number { + number } else { - peer.common_number = peer.best_number; - } + peer.best_number + }; + trace!( + target: "sync", + "Updating peer {} info, ours={}, common={}->{}, their best={}", + n, + number, + peer.common_number, + new_common_number, + peer.best_number, + ); + peer.common_number = new_common_number; } } @@ -681,12 +693,22 @@ impl ChainSync { } /// 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) { + /// + /// If true is returned, then the caller MUST try to import passed header (call `on_block_data). + /// The network request isn't sent in this case. + #[must_use] + pub(crate) fn on_block_announce( + &mut self, + protocol: &mut Context, + who: PeerId, + hash: B::Hash, + header: &B::Header, + ) -> bool { let number = *header.number(); debug!(target: "sync", "Received block announcement with number {:?}", number); if number.is_zero() { warn!(target: "sync", "Ignored invalid block announcement from {}: {}", who, hash); - return; + return false; } let parent_status = block_status(&*protocol.client(), &self.queue_blocks, header.parent_hash().clone()).ok() .unwrap_or(BlockStatus::Unknown); @@ -705,7 +727,7 @@ impl ChainSync { peer.best_hash = hash; } if let PeerSyncState::AncestorSearch(_, _) = peer.state { - return; + return false; } if header.parent_hash() == &self.best_queued_hash || known_parent { peer.common_number = number - One::one(); @@ -713,39 +735,77 @@ impl ChainSync { peer.common_number = number } } else { - return; + return false; } - if !(known || self.is_already_downloading(&hash)) { - let stale = number <= self.best_queued_number; - if stale { - if !(known_parent || self.is_already_downloading(header.parent_hash())) { - if protocol.client().block_status(&BlockId::Number(*header.number())) - .unwrap_or(BlockStatus::Unknown) == BlockStatus::InChainPruned - { - trace!(target: "sync", "Ignored unknown ancient block announced from {}: {} {:?}", who, hash, header); - } else { - trace!(target: "sync", "Considering new unknown stale block announced from {}: {} {:?}", who, hash, header); - self.download_unknown_stale(protocol, who, &hash); - } - } else { - if ancient_parent { - trace!(target: "sync", "Ignored ancient stale block announced from {}: {} {:?}", who, hash, header); + // known block case + if known || self.is_already_downloading(&hash) { + trace!(target: "sync", "Known block announce from {}: {}", who, hash); + return false; + } + + // stale block case + let requires_additional_data = !self.role.is_light(); + let stale = number <= self.best_queued_number; + if stale { + if !(known_parent || self.is_already_downloading(header.parent_hash())) { + if protocol.client().block_status(&BlockId::Number(*header.number())) + .unwrap_or(BlockStatus::Unknown) == BlockStatus::InChainPruned + { + trace!(target: "sync", "Ignored unknown ancient block announced from {}: {} {:?}", who, hash, header); + return false; + } + + trace!(target: "sync", "Considering new unknown stale block announced from {}: {} {:?}", who, hash, header); + let request = self.download_unknown_stale(&who, &hash); + match request { + Some(request) => if requires_additional_data { + protocol.send_block_request(who, request); + return false; } else { - self.download_stale(protocol, who, &hash); - } + return true; + }, + None => return false, } } else { if ancient_parent { - trace!(target: "sync", "Ignored ancient block announced from {}: {} {:?}", who, hash, header); - } else { - trace!(target: "sync", "Considering new block announced from {}: {} {:?}", who, hash, header); - self.download_new(protocol, who); + trace!(target: "sync", "Ignored ancient stale block announced from {}: {} {:?}", who, hash, header); + return false; + } + + let request = self.download_stale(&who, &hash); + match request { + Some(request) => if requires_additional_data { + protocol.send_block_request(who, request); + return false; + } else { + return true; + }, + None => return false, } } - } else { - trace!(target: "sync", "Known block announce from {}: {}", who, hash); } + + if ancient_parent { + trace!(target: "sync", "Ignored ancient block announced from {}: {} {:?}", who, hash, header); + return false; + } + + trace!(target: "sync", "Considering new block announced from {}: {} {:?}", who, hash, header); + let (range, request) = match self.select_new_blocks(who.clone()) { + Some((range, request)) => (range, request), + None => return false, + }; + let is_required_data_available = + !requires_additional_data && + range.end - range.start == One::one() && + range.start == *header.number(); + if !is_required_data_available { + protocol.send_block_request(who, request); + return false; + } + + true } fn is_already_downloading(&self, hash: &B::Hash) -> bool { @@ -788,76 +848,105 @@ impl ChainSync { } // 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) { - match peer.state { - PeerSyncState::Available => { - let request = message::generic::BlockRequest { - id: 0, - fields: self.required_block_attributes.clone(), - from: message::FromBlock::Hash(*hash), - to: None, - direction: message::Direction::Ascending, - max: Some(1), - }; - peer.state = PeerSyncState::DownloadingStale(*hash); - protocol.send_block_request(who, request); - }, - _ => (), - } + fn download_stale( + &mut self, + who: &PeerId, + hash: &B::Hash, + ) -> Option> { + let peer = self.peers.get_mut(who)?; + match peer.state { + PeerSyncState::Available => { + peer.state = PeerSyncState::DownloadingStale(*hash); + Some(message::generic::BlockRequest { + id: 0, + fields: self.required_block_attributes.clone(), + from: message::FromBlock::Hash(*hash), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }) + }, + _ => None, } } // Download old block with unknown parent. - fn download_unknown_stale(&mut self, protocol: &mut Context, who: PeerId, hash: &B::Hash) { - if let Some(ref mut peer) = self.peers.get_mut(&who) { - match peer.state { - PeerSyncState::Available => { - let request = message::generic::BlockRequest { - id: 0, - fields: self.required_block_attributes.clone(), - from: message::FromBlock::Hash(*hash), - to: None, - direction: message::Direction::Descending, - max: Some(MAX_UNKNOWN_FORK_DOWNLOAD_LEN), - }; - peer.state = PeerSyncState::DownloadingStale(*hash); - protocol.send_block_request(who, request); - }, - _ => (), - } + fn download_unknown_stale( + &mut self, + who: &PeerId, + hash: &B::Hash, + ) -> Option> { + let peer = self.peers.get_mut(who)?; + match peer.state { + PeerSyncState::Available => { + peer.state = PeerSyncState::DownloadingStale(*hash); + Some(message::generic::BlockRequest { + id: 0, + fields: self.required_block_attributes.clone(), + from: message::FromBlock::Hash(*hash), + to: None, + direction: message::Direction::Descending, + max: Some(MAX_UNKNOWN_FORK_DOWNLOAD_LEN), + }) + }, + _ => None, } } - // Issue a request for a peer to download new blocks, if any are available + // Issue a request for a peer to download new blocks, if any are available. fn download_new(&mut self, protocol: &mut Context, who: PeerId) { - if let Some(ref mut peer) = self.peers.get_mut(&who) { - // when there are too many blocks in the queue => do not try to download new blocks - if self.queue_blocks.len() > MAX_IMPORTING_BLOCKS { - trace!(target: "sync", "Too many blocks in the queue."); - return; - } - match peer.state { - PeerSyncState::Available => { - trace!(target: "sync", "Considering new block download from {}, common block is {}, best is {:?}", who, peer.common_number, peer.best_number); - if let Some(range) = self.blocks.needed_blocks(who.clone(), MAX_BLOCKS_TO_REQUEST, peer.best_number, peer.common_number) { + if let Some((_, request)) = self.select_new_blocks(who.clone()) { + protocol.send_block_request(who, request); + } + } + + // Select a range of NEW blocks to download from peer. + fn select_new_blocks(&mut self, who: PeerId) -> Option<(Range>, message::BlockRequest)> { + // when there are too many blocks in the queue => do not try to download new blocks + if self.queue_blocks.len() > MAX_IMPORTING_BLOCKS { + trace!(target: "sync", "Too many blocks in the queue."); + return None; + } + + let peer = self.peers.get_mut(&who)?; + match peer.state { + PeerSyncState::Available => { + trace!( + target: "sync", + "Considering new block download from {}, common block is {}, best is {:?}", + who, + peer.common_number, + peer.best_number, + ); + let range = self.blocks.needed_blocks(who.clone(), MAX_BLOCKS_TO_REQUEST, peer.best_number, peer.common_number); + match range { + Some(range) => { trace!(target: "sync", "Requesting blocks from {}, ({} to {})", who, range.start, range.end); - let request = message::generic::BlockRequest { - id: 0, - fields: self.required_block_attributes.clone(), - from: message::FromBlock::Number(range.start), - to: None, - direction: message::Direction::Ascending, - max: Some((range.end - range.start).saturated_into::()), - }; + let from = message::FromBlock::Number(range.start); + let max = Some((range.end - range.start).saturated_into::()); peer.state = PeerSyncState::DownloadingNew(range.start); - protocol.send_block_request(who, request); - } else { + Some(( + range, + message::generic::BlockRequest { + id: 0, + fields: self.required_block_attributes.clone(), + from, + to: None, + direction: message::Direction::Ascending, + max, + }, + )) + }, + None => { trace!(target: "sync", "Nothing to request"); - } - }, - _ => trace!(target: "sync", "Peer {} is busy", who), - } + None + }, + } + }, + _ => { + trace!(target: "sync", "Peer {} is busy", who); + None + }, } } diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index f31a93cf28..6a7a9ccddd 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -521,7 +521,7 @@ impl> Peer { /// Synchronize with import queue. #[cfg(any(test, feature = "test-helpers"))] - fn import_queue_sync(&self) { + pub fn import_queue_sync(&self) { self.import_queue.synchronize(); let _ = self.net_proto_channel.wait_sync(); } @@ -675,7 +675,7 @@ impl> Peer { /// Push blocks to the peer (simplified: with or without a TX) starting from /// given hash. - fn push_blocks_at(&self, at: BlockId, count: usize, with_tx: bool) -> H256 { + pub 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| { diff --git a/core/network/src/test/sync.rs b/core/network/src/test/sync.rs index 8462304e42..50b00ac62a 100644 --- a/core/network/src/test/sync.rs +++ b/core/network/src/test/sync.rs @@ -452,3 +452,36 @@ fn can_not_sync_from_light_peer() { // check that light #1 has disconnected from #2 assert_eq!(net.peer(1).protocol_status().num_peers, 1); } + +#[test] +fn light_peer_imports_header_from_announce() { + let _ = ::env_logger::try_init(); + + fn import_with_announce(net: &mut TestNet, hash: H256) { + let header = net.peer(0).client().header(&BlockId::Hash(hash)).unwrap().unwrap(); + net.peer(1).receive_message( + &net.peer(0).peer_id, + message::generic::Message::BlockAnnounce(message::generic::BlockAnnounce { + header, + }), + ); + + net.peer(1).import_queue_sync(); + assert!(net.peer(1).client().header(&BlockId::Hash(hash)).unwrap().is_some()); + } + + // 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()); + + // let them connect to each other + net.sync(); + + // check that NEW block is imported from announce message + let new_hash = net.peer(0).push_blocks(1, false); + import_with_announce(&mut net, new_hash); + + // check that KNOWN STALE block is imported from announce message + let known_stale_hash = net.peer(0).push_blocks_at(BlockId::Number(0), 1, true); + import_with_announce(&mut net, known_stale_hash); +} -- GitLab From 9605d8540d786c1edfd2f02357e49ccf6166af5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 31 May 2019 09:28:31 +0200 Subject: [PATCH 055/140] Remove `StorageList` (#2725) * Remove `StorageList` `StorageList` is not used anymore by `decl_storage!` and thus, it can be removed. * Fixes tests --- srml/support/src/lib.rs | 2 +- srml/support/src/storage/hashed/generator.rs | 30 ----- srml/support/src/storage/mod.rs | 68 ------------ srml/support/src/storage/storage_items.rs | 111 ------------------- 4 files changed, 1 insertion(+), 210 deletions(-) diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index 0931e4c5a3..140b905e78 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -58,7 +58,7 @@ mod double_map; pub mod traits; pub use self::storage::{ - StorageList, StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap, AppendableStorageMap + StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap, AppendableStorageMap }; pub use self::hashable::Hashable; pub use self::dispatch::{Parameter, Dispatchable, Callable, IsSubType}; diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs index 1cc62c69f7..5a8b2f9d8f 100644 --- a/srml/support/src/storage/hashed/generator.rs +++ b/srml/support/src/storage/hashed/generator.rs @@ -207,36 +207,6 @@ pub trait StorageValue { } } -/// 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. diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs index 41ea4cfdbc..a1891dade3 100644 --- a/srml/support/src/storage/mod.rs +++ b/srml/support/src/storage/mod.rs @@ -196,74 +196,6 @@ impl StorageValue for U where U: hashed::generator::StorageValue } } -/// A strongly-typed list in storage. -pub trait StorageList { - /// Get the prefix key in storage. - fn prefix() -> &'static [u8]; - - /// Get the key used to store 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() -> Vec; - - /// Set the current set of items. - fn set_items(items: &[T]); - - /// Set the item at the given index. - fn set_item>(index: u32, val: Arg); - - /// Load the value at given index. Returns `None` if the index is out-of-bounds. - fn get(index: u32) -> Option; - - /// Load the length of the list - fn len() -> u32; - - /// Clear the list. - fn clear(); -} - -impl StorageList for U where U: hashed::generator::StorageList { - fn prefix() -> &'static [u8] { - >::prefix() - } - - fn len_key() -> Vec { - >::len_key() - } - - fn key_for(index: u32) -> Vec { - >::key_for(index) - } - - fn items() -> Vec { - U::items(&RuntimeStorage) - } - - fn set_items(items: &[T]) { - U::set_items(items, &mut RuntimeStorage) - } - - fn set_item>(index: u32, val: Arg) { - U::set_item(index, val.borrow(), &mut RuntimeStorage) - } - - fn get(index: u32) -> Option { - U::get(index, &RuntimeStorage) - } - - fn len() -> u32 { - U::len(&RuntimeStorage) - } - - fn clear() { - U::clear(&mut RuntimeStorage) - } -} - /// A strongly-typed map in storage. pub trait StorageMap { /// The type that get/take return. diff --git a/srml/support/src/storage/storage_items.rs b/srml/support/src/storage/storage_items.rs index 2e7a8d4bb4..9d89b81e0d 100644 --- a/srml/support/src/storage/storage_items.rs +++ b/srml/support/src/storage/storage_items.rs @@ -22,7 +22,6 @@ //! Three kinds of data types are currently supported: //! - values //! - maps -//! - lists //! //! # Examples: //! @@ -39,8 +38,6 @@ //! pub Value: b"putd_key" => SessionKey; //! // private map. //! Balances: b"private_map:" => map [AuthorityId => Balance]; -//! // private list. -//! Authorities: b"auth:" => list [AuthorityId]; //! } //! //!# fn main() { } @@ -159,16 +156,6 @@ macro_rules! storage_items { storage_items!($($t)*); }; - - // lists - ($name:ident : $prefix:expr => list [$ty:ty]; $($t:tt)*) => { - $crate::__storage_items_internal!(() $name: $prefix => list [$ty]); - storage_items!($($t)*); - }; - (pub $name:ident : $prefix:expr => list [$ty:ty]; $($t:tt)*) => { - $crate::__storage_items_internal!((pub) $name: $prefix => list [$ty]); - storage_items!($($t)*); - }; () => () } @@ -282,84 +269,6 @@ macro_rules! __storage_items_internal { } } }; - // generator for lists. - (($($vis:tt)*) $name:ident : $prefix:expr => list [$ty:ty]) => { - $($vis)* struct $name; - - impl $name { - 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: &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::hashed::generator::StorageList<$ty> for $name { - /// Get the prefix key in storage. - fn prefix() -> &'static [u8] { - $prefix - } - - /// Get the key used to put the length field. - fn len_key() -> $crate::rstd::vec::Vec { - let mut key = $prefix.to_vec(); - key.extend(b"len"); - key - } - - /// Get the storage key used to fetch a value at a given index. - fn key_for(index: u32) -> $crate::rstd::vec::Vec { - let mut key = $prefix.to_vec(); - $crate::codec::Encode::encode_to(&index, &mut key); - key - } - - /// Read out all the items. - 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: &mut S) { - $name::set_len(items.len() as u32, storage); - items.iter() - .enumerate() - .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: &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::hashed::generator::StorageList<$ty>>::key_for(index)[..]) - } - - /// Load the length of the list. - 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: &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::hashed::generator::StorageList<$ty>>::len_key()[..]) - } - } - }; } #[macro_export] @@ -391,7 +300,6 @@ mod tests { storage_items! { Value: b"a" => u32; - List: b"b:" => list [u64]; Map: b"c:" => map [u32 => [u8; 32]]; } @@ -405,25 +313,6 @@ mod tests { assert!(Value::get(&storage).is_none()); } - #[test] - fn list() { - 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], &mut storage); - assert_eq!(List::items(&storage), &[0, 2, 4, 6, 8]); - assert_eq!(List::len(&storage), 5); - - 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(&mut storage); - assert_eq!(List::len(&storage), 0); - assert!(List::items(&storage).is_empty()); - } - #[test] fn map() { let mut storage = HashMap::new(); -- GitLab From c93ca93e8da8e70ce7188ce369b91d3441123de2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 31 May 2019 09:33:44 +0200 Subject: [PATCH 056/140] Offchain-worker APIs stubs (#2615) * WiP: HTTP Apis. * Working on the API. * Add docs, clean up the API. * Expose ext_ stuff as well. * Implement HTTP helpers for offchain sr-io. * Remove HTTP stuff. * Revert "Remove HTTP stuff." This reverts commit 7cca029d6ae93c5849b50edfcc6d2c313ba3e5bf. * HTTP apis. * Additional offchain methods. * Make it compile. * Implement wasm-ext boundary of offchain methods. * Add stubs for offchain stuff to prevent panics. * Fix tests. * Addres some more issues. * Introduce typedef, use unsafe from_utf8 * Bump runtime version. * Introduce error to distinguish deadline and io errors. * Add local_storage_cas * Some tests for offchain stuff. * Address more grumbles. * Fix tests compilation. * Fix borked merge. * Improve docs for expected return values from ext functions. * Adding new sign/enrypt/decrypt APIs. --- Cargo.lock | 2 + core/client/src/call_executor.rs | 16 +- core/client/src/light/call_executor.rs | 14 +- core/client/src/runtime_api.rs | 2 +- core/executor/src/wasm_executor.rs | 363 +++++++++++++++- core/offchain/Cargo.toml | 1 + core/offchain/src/api.rs | 125 +++++- core/offchain/src/lib.rs | 2 + core/offchain/src/testing.rs | 244 +++++++++++ core/primitives/src/lib.rs | 17 +- core/primitives/src/offchain.rs | 410 ++++++++++++++++++ core/sr-io/Cargo.toml | 3 + core/sr-io/src/lib.rs | 141 +++++- core/sr-io/src/offchain/http.rs | 571 +++++++++++++++++++++++++ core/sr-io/src/offchain/mod.rs | 19 + core/sr-io/with_std.rs | 142 +++++- core/sr-io/without_std.rs | 495 +++++++++++++++++++-- core/sr-primitives/src/generic/era.rs | 3 + core/sr-std/with_std.rs | 7 +- core/sr-std/without_std.rs | 8 +- core/state-machine/src/basic.rs | 7 +- core/state-machine/src/ext.rs | 20 +- core/state-machine/src/lib.rs | 130 +++++- core/state-machine/src/testing.rs | 14 +- core/test-runtime/src/lib.rs | 4 +- node/runtime/src/lib.rs | 4 +- 26 files changed, 2646 insertions(+), 118 deletions(-) create mode 100644 core/offchain/src/testing.rs create mode 100644 core/primitives/src/offchain.rs create mode 100644 core/sr-io/src/offchain/http.rs create mode 100644 core/sr-io/src/offchain/mod.rs diff --git a/Cargo.lock b/Cargo.lock index f7a69e401e..7f8f7bd555 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3195,6 +3195,7 @@ dependencies = [ "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 2.0.0", + "substrate-offchain 2.0.0", "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", "substrate-trie 2.0.0", @@ -4235,6 +4236,7 @@ dependencies = [ "futures 0.1.27 (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", diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index 9a47d1ac21..13ee96400f 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -26,9 +26,7 @@ use state_machine::{ use executor::{RuntimeVersion, RuntimeInfo, NativeVersion}; use hash_db::Hasher; use trie::MemoryDB; -use primitives::{ - H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue, OffchainExt -}; +use primitives::{offchain, H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue}; use crate::runtime_api::{ProofRecorder, InitializeBlock}; use crate::backend; @@ -48,7 +46,7 @@ where /// /// No changes are made. fn call< - O: OffchainExt, + O: offchain::Externalities, >( &self, id: &BlockId, @@ -65,7 +63,7 @@ where /// of the execution context. fn contextual_call< 'a, - O: OffchainExt, + O: offchain::Externalities, IB: Fn() -> error::Result<()>, EM: Fn( Result, Self::Error>, @@ -96,7 +94,7 @@ where /// /// No changes are made. fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: state_machine::Backend, F: FnOnce( Result, Self::Error>, @@ -181,7 +179,7 @@ where { type Error = E::Error; - fn call( + fn call( &self, id: &BlockId, method: &str, @@ -211,7 +209,7 @@ where fn contextual_call< 'a, - O: OffchainExt, + O: offchain::Externalities, IB: Fn() -> error::Result<()>, EM: Fn( Result, Self::Error>, @@ -300,7 +298,7 @@ where } fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: state_machine::Backend, F: FnOnce( Result, Self::Error>, diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 9959d29a1b..5fb7e7308a 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -24,7 +24,7 @@ use std::{ use futures::{IntoFuture, Future}; use parity_codec::{Encode, Decode}; -use primitives::{H256, Blake2Hasher, convert_hash, NativeOrEncoded, OffchainExt}; +use primitives::{offchain, H256, Blake2Hasher, convert_hash, NativeOrEncoded}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{One, Block as BlockT, Header as HeaderT}; use state_machine::{ @@ -87,7 +87,7 @@ where type Error = ClientError; fn call< - O: OffchainExt, + O: offchain::Externalities, >( &self, id: &BlockId, @@ -111,7 +111,7 @@ where fn contextual_call< 'a, - O: OffchainExt, + O: offchain::Externalities, IB: Fn() -> ClientResult<()>, EM: Fn( Result, Self::Error>, @@ -154,7 +154,7 @@ where } fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: StateBackend, FF: FnOnce( Result, Self::Error>, @@ -230,7 +230,7 @@ impl CallExecutor for type Error = ClientError; fn call< - O: OffchainExt, + O: offchain::Externalities, >( &self, id: &BlockId, @@ -247,7 +247,7 @@ impl CallExecutor for fn contextual_call< 'a, - O: OffchainExt, + O: offchain::Externalities, IB: Fn() -> ClientResult<()>, EM: Fn( Result, Self::Error>, @@ -327,7 +327,7 @@ impl CallExecutor for } fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: StateBackend, FF: FnOnce( Result, Self::Error>, diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index f5c8a59a90..987138e69a 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -31,7 +31,7 @@ pub use runtime_primitives::{ generic::BlockId, transaction_validity::TransactionValidity, }; #[doc(hidden)] -pub use primitives::{ExecutionContext, OffchainExt}; +pub use primitives::{offchain, ExecutionContext}; #[doc(hidden)] pub use runtime_version::{ApiId, RuntimeVersion, ApisVec, create_apis_vec}; #[doc(hidden)] diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 464531a5a1..6a3c92b755 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -17,6 +17,8 @@ //! Rust implementation of Substrate contracts. use std::collections::HashMap; +use std::convert::TryFrom; +use std::str; use tiny_keccak; use secp256k1; @@ -29,6 +31,7 @@ use state_machine::{Externalities, ChildStorageKey}; use crate::error::{Error, Result}; use crate::wasm_utils::UserError; use primitives::{blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair}; +use primitives::offchain; use primitives::hexdisplay::HexDisplay; use primitives::sandbox as sandbox_primitives; use primitives::{H256, Blake2Hasher}; @@ -113,6 +116,24 @@ impl ReadPrimitive for MemoryInstance { } } +fn deadline_to_timestamp(deadline: u64) -> Option { + if deadline == 0 { + None + } else { + Some(offchain::Timestamp::from_unix_millis(deadline)) + } +} + +fn u32_to_key(key: u32) -> std::result::Result, ()> { + if key > u16::max_value() as u32 { + Err(()) + } else if key == 0 { + Ok(None) + } else { + Ok(Some(offchain::CryptoKeyId(key as u16))) + } +} + impl_function_executor!(this: FunctionExecutor<'e, E>, ext_print_utf8(utf8_data: *const u8, utf8_len: u32) => { if let Ok(utf8) = this.memory.get(utf8_data, utf8_len as usize) { @@ -459,7 +480,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, 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) { + if let Ok(_skey) = str::from_utf8(&key) { _skey } else { &format!("{}", HexDisplay::from(&key)) @@ -483,7 +504,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let key = this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_twox_128"))?; let hashed_key = twox_128(&key); debug_trace!(target: "xxhash", "XXhash: {} -> {}", - &if let Ok(_skey) = ::std::str::from_utf8(&key) { + &if let Ok(_skey) = str::from_utf8(&key) { *_skey } else { format!("{}", HexDisplay::from(&key)) @@ -590,15 +611,345 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(0) }, - ext_submit_extrinsic(msg_data: *const u8, len: u32) => { + ext_submit_transaction(msg_data: *const u8, len: u32) -> u32 => { let extrinsic = this.memory.get(msg_data, len as usize) - .map_err(|_| UserError("OOB while ext_submit_extrinsic: wasm"))?; + .map_err(|_| UserError("OOB while ext_submit_transaction: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.submit_transaction(extrinsic)) + .ok_or_else(|| UserError("Calling unavailable API ext_submit_transaction: wasm"))?; - this.ext.submit_extrinsic(extrinsic) - .map_err(|_| UserError("Calling unavailable API ext_submit_extrinsic: wasm"))?; + Ok(if res.is_ok() { 0 } else { 1 }) + }, + ext_new_crypto_key(crypto: u32) -> u32 => { + let kind = offchain::CryptoKind::try_from(crypto) + .map_err(|_| UserError("crypto kind OOB while ext_new_crypto_key: wasm"))?; + let res = this.ext.offchain() + .map(|api| api.new_crypto_key(kind)) + .ok_or_else(|| UserError("Calling unavailable API ext_new_crypto_key: wasm"))?; + + match res { + Ok(key_id) => Ok(key_id.0 as u32), + Err(()) => Ok(u32::max_value()), + } + }, + ext_encrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8 => { + let key = u32_to_key(key) + .map_err(|_| UserError("key OOB while ext_encrypt: wasm"))?; + let message = this.memory.get(data, data_len as usize) + .map_err(|_| UserError("OOB while ext_encrypt: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.encrypt(key, &*message)) + .ok_or_else(|| UserError("Calling unavailable API ext_encrypt: wasm"))?; + + let (offset,len) = match res { + Ok(encrypted) => { + let len = encrypted.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &encrypted) + .map_err(|_| UserError("Invalid attempt to set memory in ext_encrypt"))?; + (offset, len) + }, + Err(()) => (0, u32::max_value()), + }; + + this.memory.write_primitive(msg_len, len) + .map_err(|_| UserError("Invalid attempt to write msg_len in ext_encrypt"))?; + + Ok(offset) + }, + ext_decrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8 => { + let key = u32_to_key(key) + .map_err(|_| UserError("key OOB while ext_decrypt: wasm"))?; + let message = this.memory.get(data, data_len as usize) + .map_err(|_| UserError("OOB while ext_decrypt: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.decrypt(key, &*message)) + .ok_or_else(|| UserError("Calling unavailable API ext_decrypt: wasm"))?; + + let (offset,len) = match res { + Ok(decrypted) => { + let len = decrypted.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &decrypted) + .map_err(|_| UserError("Invalid attempt to set memory in ext_decrypt"))?; + (offset, len) + }, + Err(()) => (0, u32::max_value()), + }; + + this.memory.write_primitive(msg_len, len) + .map_err(|_| UserError("Invalid attempt to write msg_len in ext_decrypt"))?; + + Ok(offset) + }, + ext_sign(key: u32, data: *const u8, data_len: u32, sig_data_len: *mut u32) -> *mut u8 => { + let key = u32_to_key(key) + .map_err(|_| UserError("key OOB while ext_sign: wasm"))?; + let message = this.memory.get(data, data_len as usize) + .map_err(|_| UserError("OOB while ext_sign: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.sign(key, &*message)) + .ok_or_else(|| UserError("Calling unavailable API ext_sign: wasm"))?; + + let (offset,len) = match res { + Ok(signature) => { + let len = signature.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &signature) + .map_err(|_| UserError("Invalid attempt to set memory in ext_sign"))?; + (offset, len) + }, + Err(()) => (0, u32::max_value()), + }; + + this.memory.write_primitive(sig_data_len, len) + .map_err(|_| UserError("Invalid attempt to write sig_data_len in ext_sign"))?; + + Ok(offset) + }, + ext_verify( + key: u32, + msg: *const u8, + msg_len: u32, + signature: *const u8, + signature_len: u32 + ) -> u32 => { + let key = u32_to_key(key) + .map_err(|_| UserError("key OOB while ext_verify: wasm"))?; + let message = this.memory.get(msg, msg_len as usize) + .map_err(|_| UserError("OOB while ext_verify: wasm"))?; + let signature = this.memory.get(signature, signature_len as usize) + .map_err(|_| UserError("OOB while ext_verify: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.verify(key, &*message, &*signature)) + .ok_or_else(|| UserError("Calling unavailable API ext_verify: wasm"))?; + + match res { + Ok(true) => Ok(0), + Ok(false) => Ok(1), + Err(()) => Ok(u32::max_value()), + } + }, + ext_timestamp() -> u64 => { + let timestamp = this.ext.offchain() + .map(|api| api.timestamp()) + .ok_or_else(|| UserError("Calling unavailable API ext_timestamp: wasm"))?; + Ok(timestamp.unix_millis()) + }, + ext_sleep_until(deadline: u64) => { + this.ext.offchain() + .map(|api| api.sleep_until(offchain::Timestamp::from_unix_millis(deadline))) + .ok_or_else(|| UserError("Calling unavailable API ext_sleep_until: wasm"))?; Ok(()) }, + ext_random_seed(seed_data: *mut u8) => { + // NOTE the runtime as assumptions about seed size. + let seed: [u8; 32] = this.ext.offchain() + .map(|api| api.random_seed()) + .ok_or_else(|| UserError("Calling unavailable API ext_random_seed: wasm"))?; + + this.memory.set(seed_data, &seed) + .map_err(|_| UserError("Invalid attempt to set value in ext_random_seed"))?; + Ok(()) + }, + ext_local_storage_set(key: *const u8, key_len: u32, value: *const u8, value_len: u32) => { + let key = this.memory.get(key, key_len as usize) + .map_err(|_| UserError("OOB while ext_local_storage_set: wasm"))?; + let value = this.memory.get(value, value_len as usize) + .map_err(|_| UserError("OOB while ext_local_storage_set: wasm"))?; + + this.ext.offchain() + .map(|api| api.local_storage_set(&key, &value)) + .ok_or_else(|| UserError("Calling unavailable API ext_local_storage_set: wasm"))?; + + Ok(()) + }, + ext_local_storage_get(key: *const u8, key_len: u32, value_len: *mut u32) -> *mut u8 => { + let key = this.memory.get(key, key_len as usize) + .map_err(|_| UserError("OOB while ext_local_storage_get: wasm"))?; + + let maybe_value = this.ext.offchain() + .map(|api| api.local_storage_get(&key)) + .ok_or_else(|| UserError("Calling unavailable API ext_local_storage_get: wasm"))?; + + let (offset, len) = if let Some(value) = maybe_value { + 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_local_storage_get"))?; + (offset, value.len() as u32) + } else { + (0, u32::max_value()) + }; + + this.memory.write_primitive(value_len, len) + .map_err(|_| UserError("Invalid attempt to write value_len in ext_local_storage_get"))?; + + Ok(offset) + }, + ext_http_request_start( + method: *const u8, + method_len: u32, + url: *const u8, + url_len: u32, + meta: *const u8, + meta_len: u32 + ) -> u32 => { + let method = this.memory.get(method, method_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_start: wasm"))?; + let url = this.memory.get(url, url_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_start: wasm"))?; + let meta = this.memory.get(meta, meta_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_start: wasm"))?; + + let method_str = str::from_utf8(&method) + .map_err(|_| UserError("invalid str while ext_http_request_start: wasm"))?; + let url_str = str::from_utf8(&url) + .map_err(|_| UserError("invalid str while ext_http_request_start: wasm"))?; + + let id = this.ext.offchain() + .map(|api| api.http_request_start(method_str, url_str, &*meta)) + .ok_or_else(|| UserError("Calling unavailable API ext_http_request_start: wasm"))?; + + if let Ok(id) = id { + Ok(id.0 as u32) + } else { + Ok(u32::max_value()) + } + }, + ext_http_request_add_header( + request_id: u32, + name: *const u8, + name_len: u32, + value: *const u8, + value_len: u32 + ) -> u32 => { + let name = this.memory.get(name, name_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_add_header: wasm"))?; + let value = this.memory.get(value, value_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_add_header: wasm"))?; + + let name_str = str::from_utf8(&name) + .map_err(|_| UserError("invalid str while ext_http_request_add_header: wasm"))?; + let value_str = str::from_utf8(&value) + .map_err(|_| UserError("invalid str while ext_http_request_add_header: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.http_request_add_header( + offchain::HttpRequestId(request_id as u16), + &name_str, + &value_str, + )) + .ok_or_else(|| UserError("Calling unavailable API ext_http_request_add_header: wasm"))?; + + Ok(if res.is_ok() { 0 } else { 1 }) + }, + ext_http_request_write_body( + request_id: u32, + chunk: *const u8, + chunk_len: u32, + deadline: u64 + ) -> u32 => { + let chunk = this.memory.get(chunk, chunk_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_write_body: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.http_request_write_body( + offchain::HttpRequestId(request_id as u16), + &chunk, + deadline_to_timestamp(deadline) + )) + .ok_or_else(|| UserError("Calling unavailable API ext_http_request_write_body: wasm"))?; + + Ok(match res { + Ok(()) => 0, + Err(e) => e as u8 as u32, + }) + }, + ext_http_response_wait( + ids: *const u32, + ids_len: u32, + statuses: *mut u32, + deadline: u64 + ) => { + let ids = (0..ids_len) + .map(|i| + this.memory.read_primitive(ids + i * 4) + .map(|id: u32| offchain::HttpRequestId(id as u16)) + .map_err(|_| UserError("OOB while ext_http_response_wait: wasm")) + ) + .collect::<::std::result::Result, _>>()?; + + let res = this.ext.offchain() + .map(|api| api.http_response_wait(&ids, deadline_to_timestamp(deadline))) + .ok_or_else(|| UserError("Calling unavailable API ext_http_response_wait: wasm"))? + .into_iter() + .map(|status| status.into()) + .enumerate() + // make sure to take up to `ids_len` to avoid exceeding the mem. + .take(ids_len as usize); + + for (i, status) in res { + this.memory.write_primitive(statuses + i as u32 * 4, status) + .map_err(|_| UserError("Invalid attempt to set memory in ext_http_response_wait"))?; + } + + Ok(()) + }, + ext_http_response_headers( + request_id: u32, + written_out: *mut u32 + ) -> *mut u8 => { + use parity_codec::Encode; + + let headers = this.ext.offchain() + .map(|api| api.http_response_headers(offchain::HttpRequestId(request_id as u16))) + .ok_or_else(|| UserError("Calling unavailable API ext_http_response_headers: wasm"))?; + + let encoded = headers.encode(); + let len = encoded.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &encoded) + .map_err(|_| UserError("Invalid attempt to set memory in ext_http_response_headers"))?; + this.memory.write_primitive(written_out, len) + .map_err(|_| UserError("Invalid attempt to write written_out in ext_http_response_headers"))?; + + Ok(offset) + }, + ext_http_response_read_body( + request_id: u32, + buffer: *mut u8, + buffer_len: u32, + deadline: u64 + ) -> u32 => { + let mut internal_buffer = Vec::with_capacity(buffer_len as usize); + internal_buffer.resize(buffer_len as usize, 0); + + let res = this.ext.offchain() + .map(|api| api.http_response_read_body( + offchain::HttpRequestId(request_id as u16), + &mut internal_buffer, + deadline_to_timestamp(deadline), + )) + .ok_or_else(|| UserError("Calling unavailable API ext_http_response_read_body: wasm"))?; + + Ok(match res { + Ok(read) => { + this.memory.set(buffer, &internal_buffer[..read]) + .map_err(|_| UserError("Invalid attempt to set memory in ext_http_response_read_body"))?; + + read as u32 + }, + Err(err) => { + u32::max_value() - err as u8 as u32 + 1 + } + }) + }, ext_sandbox_instantiate( dispatch_thunk_idx: usize, wasm_ptr: *const u8, diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 14341e2458..da2aeb4334 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -13,6 +13,7 @@ futures = "0.1.25" log = "0.4" offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } parity-codec = { version = "3.3", features = ["derive"] } +parking_lot = "0.7.1" primitives = { package = "substrate-primitives", path = "../../core/primitives" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } tokio = "0.1.7" diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 25a8a2ebaa..d2c7630c24 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -16,9 +16,13 @@ use std::sync::Arc; use futures::{Stream, Future, sync::mpsc}; -use log::{info, debug, warn}; +use log::{info, debug, warn, error}; use parity_codec::Decode; -use primitives::OffchainExt; +use primitives::offchain::{ + Timestamp, HttpRequestId, HttpRequestStatus, HttpError, + Externalities as OffchainExt, + CryptoKind, CryptoKeyId, +}; use runtime_primitives::{ generic::BlockId, traits::{self, Extrinsic}, @@ -35,9 +39,122 @@ enum ExtMessage { /// NOTE this is done to prevent recursive calls into the runtime (which are not supported currently). pub(crate) struct AsyncApi(mpsc::UnboundedSender); +fn unavailable_yet(name: &str) -> R { + error!("This {:?} API is not available for offchain workers yet. Follow + https://github.com/paritytech/substrate/issues/1458 for details", name); + Default::default() +} + impl OffchainExt for AsyncApi { - fn submit_extrinsic(&mut self, ext: Vec) { - let _ = self.0.unbounded_send(ExtMessage::SubmitExtrinsic(ext)); + fn submit_transaction(&mut self, ext: Vec) -> Result<(), ()> { + self.0.unbounded_send(ExtMessage::SubmitExtrinsic(ext)) + .map(|_| ()) + .map_err(|_| ()) + } + + fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { + unavailable_yet::<()>("new_crypto_key"); + Err(()) + } + + fn encrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unavailable_yet::<()>("encrypt"); + Err(()) + } + + fn decrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unavailable_yet::<()>("decrypt"); + Err(()) + } + + fn sign(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unavailable_yet::<()>("sign"); + Err(()) + } + + fn verify(&mut self, _key: Option, _msg: &[u8], _signature: &[u8]) -> Result { + unavailable_yet::<()>("verify"); + Err(()) + } + + fn timestamp(&mut self) -> Timestamp { + unavailable_yet("timestamp") + } + + fn sleep_until(&mut self, _deadline: Timestamp) { + unavailable_yet::<()>("sleep_until") + } + + fn random_seed(&mut self) -> [u8; 32] { + unavailable_yet("random_seed") + } + + fn local_storage_set(&mut self, _key: &[u8], _value: &[u8]) { + unavailable_yet("local_storage_set") + } + + fn local_storage_compare_and_set(&mut self, _key: &[u8], _old_value: &[u8], _new_value: &[u8]) { + unavailable_yet("local_storage_compare_and_set") + } + + fn local_storage_get(&mut self, _key: &[u8]) -> Option> { + unavailable_yet("local_storage_get") + } + + fn http_request_start( + &mut self, + _method: &str, + _uri: &str, + _meta: &[u8] + ) -> Result { + unavailable_yet::<()>("http_request_start"); + Err(()) + } + + fn http_request_add_header( + &mut self, + _request_id: HttpRequestId, + _name: &str, + _value: &str + ) -> Result<(), ()> { + unavailable_yet::<()>("http_request_add_header"); + Err(()) + } + + fn http_request_write_body( + &mut self, + _request_id: HttpRequestId, + _chunk: &[u8], + _deadline: Option + ) -> Result<(), HttpError> { + unavailable_yet::<()>("http_request_write_body"); + Err(HttpError::IoError) + } + + fn http_response_wait( + &mut self, + ids: &[HttpRequestId], + _deadline: Option + ) -> Vec { + unavailable_yet::<()>("http_response_wait"); + ids.iter().map(|_| HttpRequestStatus::Unknown).collect() + } + + fn http_response_headers( + &mut self, + _request_id: HttpRequestId + ) -> Vec<(Vec, Vec)> { + unavailable_yet("http_response_headers") + } + + fn http_response_read_body( + &mut self, + _request_id: HttpRequestId, + _buffer: &mut [u8], + _deadline: Option + ) -> Result { + unavailable_yet::<()>("http_response_read_body"); + Err(HttpError::IoError) } } diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index f176fadd0d..376f41b445 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -50,6 +50,8 @@ use transaction_pool::txpool::{Pool, ChainApi}; mod api; +pub mod testing; + pub use offchain_primitives::OffchainWorkerApi; /// An offchain workers manager. diff --git a/core/offchain/src/testing.rs b/core/offchain/src/testing.rs new file mode 100644 index 0000000000..3419665d0a --- /dev/null +++ b/core/offchain/src/testing.rs @@ -0,0 +1,244 @@ +// 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 . + +//! Offchain Externalities implementation for tests. + +use std::{ + collections::BTreeMap, + sync::Arc, +}; +use parking_lot::RwLock; +use primitives::offchain::{ + self, + HttpError, + HttpRequestId as RequestId, + HttpRequestStatus as RequestStatus, + Timestamp, + CryptoKind, + CryptoKeyId, +}; + +/// Pending request. +#[derive(Debug, Default, PartialEq, Eq)] +pub struct PendingRequest { + /// HTTP method + pub method: String, + /// URI + pub uri: String, + /// Encoded Metadata + pub meta: Vec, + /// Request headers + pub headers: Vec<(String, String)>, + /// Request body + pub body: Vec, + /// Has the request been sent already. + pub sent: bool, + /// Response body + pub response: Vec, + /// Number of bytes already read from the response body. + pub read: usize, + /// Response headers + pub response_headers: Vec<(String, String)>, +} + +/// Internal state of the externalities. +/// +/// This can be used in tests to respond or assert stuff about interactions. +#[derive(Debug, Default)] +pub struct State { + /// A list of pending requests. + pub requests: BTreeMap, +} + +impl State { + /// Asserts that pending request has been submitted and fills it's response. + pub fn fulfill_pending_request( + &mut self, + id: u16, + expected: PendingRequest, + response: impl Into>, + response_headers: impl IntoIterator, + ) { + match self.requests.get_mut(&RequestId(id)) { + None => { + panic!("Missing expected request: {:?}.\n\nAll: {:?}", id, self.requests); + } + Some(req) => { + assert_eq!( + *req, + expected, + ); + req.response = response.into(); + req.response_headers = response_headers.into_iter().collect(); + } + } + } +} + +/// Implementation of offchain externalities used for tests. +#[derive(Clone, Default, Debug)] +pub struct TestOffchainExt(pub Arc>); + +impl offchain::Externalities for TestOffchainExt { + fn submit_transaction(&mut self, _ex: Vec) -> Result<(), ()> { + unimplemented!("not needed in tests so far") + } + + fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { + unimplemented!("not needed in tests so far") + } + + fn encrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unimplemented!("not needed in tests so far") + } + + fn decrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unimplemented!("not needed in tests so far") + } + + fn sign(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unimplemented!("not needed in tests so far") + } + + fn verify(&mut self, _key: Option, _msg: &[u8], _signature: &[u8]) -> Result { + unimplemented!("not needed in tests so far") + } + + fn timestamp(&mut self) -> Timestamp { + unimplemented!("not needed in tests so far") + } + + fn sleep_until(&mut self, _deadline: Timestamp) { + unimplemented!("not needed in tests so far") + } + + fn random_seed(&mut self) -> [u8; 32] { + unimplemented!("not needed in tests so far") + } + + fn local_storage_set(&mut self, _key: &[u8], _value: &[u8]) { + unimplemented!("not needed in tests so far") + } + + fn local_storage_compare_and_set( + &mut self, + _key: &[u8], + _old_value: &[u8], + _new_value: &[u8] + ) { + unimplemented!("not needed in tests so far") + } + + fn local_storage_get(&mut self, _key: &[u8]) -> Option> { + unimplemented!("not needed in tests so far") + } + + fn http_request_start(&mut self, method: &str, uri: &str, meta: &[u8]) -> Result { + let mut state = self.0.write(); + let id = RequestId(state.requests.len() as u16); + state.requests.insert(id.clone(), PendingRequest { + method: method.into(), + uri: uri.into(), + meta: meta.into(), + ..Default::default() + }); + Ok(id) + } + + fn http_request_add_header( + &mut self, + request_id: RequestId, + name: &str, + value: &str, + ) -> Result<(), ()> { + let mut state = self.0.write(); + if let Some(req) = state.requests.get_mut(&request_id) { + req.headers.push((name.into(), value.into())); + Ok(()) + } else { + Err(()) + } + } + + fn http_request_write_body( + &mut self, + request_id: RequestId, + chunk: &[u8], + _deadline: Option + ) -> Result<(), HttpError> { + let mut state = self.0.write(); + if let Some(req) = state.requests.get_mut(&request_id) { + if chunk.is_empty() { + req.sent = true; + } + req.body.extend(chunk); + Ok(()) + } else { + Err(HttpError::IoError) + } + } + + fn http_response_wait( + &mut self, + ids: &[RequestId], + _deadline: Option, + ) -> Vec { + let state = self.0.read(); + + ids.iter().map(|id| match state.requests.get(id) { + Some(req) if req.response.is_empty() => RequestStatus::DeadlineReached, + None => RequestStatus::Unknown, + _ => RequestStatus::Finished(200), + }).collect() + } + + fn http_response_headers(&mut self, request_id: RequestId) -> Vec<(Vec, Vec)> { + let state = self.0.read(); + if let Some(req) = state.requests.get(&request_id) { + req.response_headers + .clone() + .into_iter() + .map(|(k, v)| (k.into_bytes(), v.into_bytes())) + .collect() + } else { + Default::default() + } + } + + fn http_response_read_body( + &mut self, + request_id: RequestId, + buffer: &mut [u8], + _deadline: Option + ) -> Result { + let mut state = self.0.write(); + if let Some(req) = state.requests.get_mut(&request_id) { + if req.read >= req.response.len() { + // Remove the pending request as per spec. + state.requests.remove(&request_id); + Ok(0) + } else { + let read = std::cmp::min(buffer.len(), req.response[req.read..].len()); + buffer[0..read].copy_from_slice(&req.response[req.read..read]); + req.read += read; + Ok(read) + } + } else { + Err(HttpError::IoError) + } + } +} + diff --git a/core/primitives/src/lib.rs b/core/primitives/src/lib.rs index c9008171df..69b9f1a960 100644 --- a/core/primitives/src/lib.rs +++ b/core/primitives/src/lib.rs @@ -56,6 +56,7 @@ pub mod ed25519; pub mod sr25519; pub mod hash; mod hasher; +pub mod offchain; pub mod sandbox; pub mod storage; pub mod uint; @@ -85,25 +86,11 @@ pub enum ExecutionContext { /// Context used for block construction. BlockConstruction, /// Offchain worker context. - OffchainWorker(Box), + OffchainWorker(Box), /// Context used for other calls. Other, } -/// An extended externalities for offchain workers. -pub trait OffchainExt { - /// Submits an extrinsics. - /// - /// The extrinsic will either go to the pool (signed) - /// or to the next produced block (inherent). - fn submit_extrinsic(&mut self, extrinsic: Vec); -} -impl OffchainExt for Box { - fn submit_extrinsic(&mut self, ex: Vec) { - (&mut **self).submit_extrinsic(ex) - } -} - /// Hex-serialized shim for `Vec`. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash, PartialOrd, Ord))] diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs new file mode 100644 index 0000000000..764837d7b4 --- /dev/null +++ b/core/primitives/src/offchain.rs @@ -0,0 +1,410 @@ +// 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 . + +//! Offchain workers types + +use rstd::prelude::{Vec, Box}; +use rstd::convert::TryFrom; + +/// A type of supported crypto. +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[repr(C)] +pub enum CryptoKind { + /// SR25519 crypto (Schnorrkel) + Sr25519 = 1, + /// ED25519 crypto (Edwards) + Ed25519 = 2, +} + +impl TryFrom for CryptoKind { + type Error = (); + + fn try_from(kind: u32) -> Result { + match kind { + e if e == CryptoKind::Sr25519 as u8 as u32 => Ok(CryptoKind::Sr25519), + e if e == CryptoKind::Ed25519 as u8 as u32 => Ok(CryptoKind::Ed25519), + _ => Err(()) + } + } +} + +/// Opaque type for created crypto keys. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct CryptoKeyId(pub u16); + +/// Opaque type for offchain http requests. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct HttpRequestId(pub u16); + +/// An error enum returned by some http methods. +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[repr(C)] +pub enum HttpError { + /// The requested action couldn't been completed within a deadline. + DeadlineReached = 1, + /// There was an IO Error while processing the request. + IoError = 2, +} + +impl TryFrom for HttpError { + type Error = (); + + fn try_from(error: u32) -> Result { + match error { + e if e == HttpError::DeadlineReached as u8 as u32 => Ok(HttpError::DeadlineReached), + e if e == HttpError::IoError as u8 as u32 => Ok(HttpError::IoError), + _ => Err(()) + } + } +} + +/// Status of the HTTP request +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum HttpRequestStatus { + /// Deadline was reached while we waited for this request to finish. + /// + /// Note the deadline is controlled by the calling part, it not necessarily means + /// that the request has timed out. + DeadlineReached, + /// Request timed out. + /// + /// This means that the request couldn't be completed by the host environment + /// within a reasonable time (according to the host), has now been terminated + /// and is considered finished. + /// To retry the request you need to construct it again. + Timeout, + /// Request status of this ID is not known. + Unknown, + /// The request has finished with given status code. + Finished(u16), +} + +impl From for u32 { + fn from(status: HttpRequestStatus) -> Self { + match status { + HttpRequestStatus::Unknown => 0, + HttpRequestStatus::DeadlineReached => 10, + HttpRequestStatus::Timeout => 20, + HttpRequestStatus::Finished(code) => code as u32, + } + } +} + +impl TryFrom for HttpRequestStatus { + type Error = (); + + fn try_from(status: u32) -> Result { + match status { + 0 => Ok(HttpRequestStatus::Unknown), + 10 => Ok(HttpRequestStatus::DeadlineReached), + 20 => Ok(HttpRequestStatus::Timeout), + 100...999 => Ok(HttpRequestStatus::Finished(status as u16)), + _ => Err(()), + } + } +} + +/// Opaque timestamp type +#[derive(Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Timestamp(u64); + +/// Duration type +#[derive(Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Duration(u64); + +impl Duration { + /// Create new duration representing given number of milliseconds. + pub fn from_millis(millis: u64) -> Self { + Duration(millis) + } + + /// Returns number of milliseconds this Duration represents. + pub fn millis(&self) -> u64 { + self.0 + } +} + +impl Timestamp { + /// Creates new `Timestamp` given unix timestamp in miliseconds. + pub fn from_unix_millis(millis: u64) -> Self { + Timestamp(millis) + } + + /// Increase the timestamp by given `Duration`. + pub fn add(&self, duration: Duration) -> Timestamp { + Timestamp(self.0.saturating_add(duration.0)) + } + + /// Decrease the timestamp by given `Duration` + pub fn sub(&self, duration: Duration) -> Timestamp { + Timestamp(self.0.saturating_sub(duration.0)) + } + + /// Returns a saturated difference (Duration) between two Timestamps. + pub fn diff(&self, other: &Self) -> Duration { + Duration(self.0.saturating_sub(other.0)) + } + + /// Return number of milliseconds since UNIX epoch. + pub fn unix_millis(&self) -> u64 { + self.0 + } +} + +/// An extended externalities for offchain workers. +pub trait Externalities { + /// Submit transaction. + /// + /// The transaction will end up in the pool and be propagated to others. + fn submit_transaction(&mut self, extrinsic: Vec) -> Result<(), ()>; + + /// Create new key(pair) for signing/encryption/decryption. + /// + /// Returns an error if given crypto kind is not supported. + fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result; + + /// Encrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn encrypt(&mut self, key: Option, data: &[u8]) -> Result, ()>; + + /// Decrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist. + fn decrypt(&mut self, key: Option, data: &[u8]) -> Result, ()>; + + /// Sign a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn sign(&mut self, key: Option, data: &[u8]) -> Result, ()>; + + /// Verifies that `signature` for `msg` matches given `key`. + /// + /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. + /// Returns an error in case the key is not available or does not exist or the parameters + /// lengths are incorrect. + fn verify(&mut self, key: Option, msg: &[u8], signature: &[u8]) -> Result; + + /// Returns current UNIX timestamp (in millis) + fn timestamp(&mut self) -> Timestamp; + + /// Pause the execution until `deadline` is reached. + fn sleep_until(&mut self, deadline: Timestamp); + + /// Returns a random seed. + /// + /// This is a trully random non deterministic seed generated by host environment. + /// Obviously fine in the off-chain worker context. + fn random_seed(&mut self) -> [u8; 32]; + + /// Sets a value in the local storage. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_set(&mut self, key: &[u8], value: &[u8]); + + /// Sets a value in the local storage if it matches current value. + /// + /// Since multiple offchain workers may be running concurrently, to prevent + /// data races use CAS to coordinate between them. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_compare_and_set(&mut self, key: &[u8], old_value: &[u8], new_value: &[u8]); + + /// Gets a value from the local storage. + /// + /// If the value does not exist in the storage `None` will be returned. + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_get(&mut self, key: &[u8]) -> Option>; + + /// Initiaties a http request given HTTP verb and the URL. + /// + /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. + /// Returns the id of newly started request. + fn http_request_start( + &mut self, + method: &str, + uri: &str, + meta: &[u8] + ) -> Result; + + /// Append header to the request. + fn http_request_add_header( + &mut self, + request_id: HttpRequestId, + name: &str, + value: &str + ) -> Result<(), ()>; + + /// Write a chunk of request body. + /// + /// Writing an empty chunks finalises the request. + /// Passing `None` as deadline blocks forever. + /// + /// Returns an error in case deadline is reached or the chunk couldn't be written. + fn http_request_write_body( + &mut self, + request_id: HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), HttpError>; + + /// Block and wait for the responses for given requests. + /// + /// Returns a vector of request statuses (the len is the same as ids). + /// Note that if deadline is not provided the method will block indefinitely, + /// otherwise unready responses will produce `DeadlineReached` status. + /// + /// Passing `None` as deadline blocks forever. + fn http_response_wait( + &mut self, + ids: &[HttpRequestId], + deadline: Option + ) -> Vec; + + /// Read all response headers. + /// + /// Returns a vector of pairs `(HeaderKey, HeaderValue)`. + fn http_response_headers( + &mut self, + request_id: HttpRequestId + ) -> Vec<(Vec, Vec)>; + + /// Read a chunk of body response to given buffer. + /// + /// Returns the number of bytes written or an error in case a deadline + /// is reached or server closed the connection. + /// Passing `None` as a deadline blocks forever. + fn http_response_read_body( + &mut self, + request_id: HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result; + +} +impl Externalities for Box { + fn submit_transaction(&mut self, ex: Vec) -> Result<(), ()> { + (&mut **self).submit_transaction(ex) + } + + fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result { + (&mut **self).new_crypto_key(crypto) + } + + fn encrypt(&mut self, key: Option, data: &[u8]) -> Result, ()> { + (&mut **self).encrypt(key, data) + } + + fn decrypt(&mut self, key: Option, data: &[u8]) -> Result, ()> { + (&mut **self).decrypt(key, data) + } + + fn sign(&mut self, key: Option, data: &[u8]) -> Result, ()> { + (&mut **self).sign(key, data) + } + + fn verify(&mut self, key: Option, msg: &[u8], signature: &[u8]) -> Result { + (&mut **self).verify(key, msg, signature) + } + + fn timestamp(&mut self) -> Timestamp { + (&mut **self).timestamp() + } + + fn sleep_until(&mut self, deadline: Timestamp) { + (&mut **self).sleep_until(deadline) + } + + fn random_seed(&mut self) -> [u8; 32] { + (&mut **self).random_seed() + } + + fn local_storage_set(&mut self, key: &[u8], value: &[u8]) { + (&mut **self).local_storage_set(key, value) + } + + fn local_storage_compare_and_set(&mut self, key: &[u8], old_value: &[u8], new_value: &[u8]) { + (&mut **self).local_storage_compare_and_set(key, old_value, new_value) + } + + fn local_storage_get(&mut self, key: &[u8]) -> Option> { + (&mut **self).local_storage_get(key) + } + + fn http_request_start(&mut self, method: &str, uri: &str, meta: &[u8]) -> Result { + (&mut **self).http_request_start(method, uri, meta) + } + + fn http_request_add_header(&mut self, request_id: HttpRequestId, name: &str, value: &str) -> Result<(), ()> { + (&mut **self).http_request_add_header(request_id, name, value) + } + + fn http_request_write_body( + &mut self, + request_id: HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), HttpError> { + (&mut **self).http_request_write_body(request_id, chunk, deadline) + } + + fn http_response_wait(&mut self, ids: &[HttpRequestId], deadline: Option) -> Vec { + (&mut **self).http_response_wait(ids, deadline) + } + + fn http_response_headers(&mut self, request_id: HttpRequestId) -> Vec<(Vec, Vec)> { + (&mut **self).http_response_headers(request_id) + } + + fn http_response_read_body( + &mut self, + request_id: HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result { + (&mut **self).http_response_read_body(request_id, buffer, deadline) + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn timestamp_ops() { + let t = Timestamp(5); + assert_eq!(t.add(Duration::from_millis(10)), Timestamp(15)); + assert_eq!(t.sub(Duration::from_millis(10)), Timestamp(0)); + assert_eq!(t.diff(&Timestamp(3)), Duration(2)); + } +} diff --git a/core/sr-io/Cargo.toml b/core/sr-io/Cargo.toml index dbe699b4b5..0c97ba8050 100644 --- a/core/sr-io/Cargo.toml +++ b/core/sr-io/Cargo.toml @@ -19,6 +19,9 @@ environmental = { version = "1.0.1", optional = true } substrate-state-machine = { path = "../state-machine", optional = true } trie = { package = "substrate-trie", path = "../trie", optional = true } +[dev-dependencies] +substrate-offchain = { path = "../offchain" } + [features] default = ["std"] std = [ diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 314aa3b61e..cd9b43798b 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -33,6 +33,7 @@ use rstd::vec::Vec; pub use codec; pub use primitives::Blake2Hasher; +use primitives::offchain::{Timestamp, HttpRequestId, HttpRequestStatus, HttpError, CryptoKind, CryptoKeyId}; /// Error verifying ECDSA signature pub enum EcdsaVerifyError { @@ -44,6 +45,8 @@ pub enum EcdsaVerifyError { BadSignature, } +pub mod offchain; + /// Trait for things which can be printed. pub trait Printable { /// Print the object. @@ -226,12 +229,140 @@ export_api! { export_api! { pub(crate) trait OffchainApi { - /// Submit extrinsic from the runtime. + /// Submit transaction to the pool. + /// + /// The transaction will end up in the pool. + fn submit_transaction(data: &T) -> Result<(), ()>; + + /// Create new key(pair) for signing/encryption/decryption. + /// + /// Returns an error if given crypto kind is not supported. + fn new_crypto_key(crypto: CryptoKind) -> Result; + + /// Encrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn encrypt(key: Option, data: &[u8]) -> Result, ()>; + + /// Decrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist. + fn decrypt(key: Option, data: &[u8]) -> Result, ()>; + + /// Sign a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn sign(key: Option, data: &[u8]) -> Result, ()>; + + /// Verifies that `signature` for `msg` matches given `key`. + /// + /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. + /// Returns an error in case the key is not available or does not exist or the parameters + /// lengths are incorrect. + fn verify(key: Option, msg: &[u8], signature: &[u8]) -> Result; + + /// Returns current UNIX timestamp (in millis) + fn timestamp() -> Timestamp; + + /// Pause the execution until `deadline` is reached. + fn sleep_until(deadline: Timestamp); + + /// Returns a random seed. + /// + /// This is a trully random non deterministic seed generated by host environment. + /// Obviously fine in the off-chain worker context. + fn random_seed() -> [u8; 32]; + + /// Sets a value in the local storage. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_set(key: &[u8], value: &[u8]); + + /// Sets a value in the local storage if it matches current value. + /// + /// Since multiple offchain workers may be running concurrently, to prevent + /// data races use CAS to coordinate between them. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_compare_and_set(key: &[u8], old_value: &[u8], new_value: &[u8]); + + /// Gets a value from the local storage. + /// + /// If the value does not exist in the storage `None` will be returned. + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_get(key: &[u8]) -> Option>; + + /// Initiaties a http request given HTTP verb and the URL. + /// + /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. + /// Returns the id of newly started request. + fn http_request_start( + method: &str, + uri: &str, + meta: &[u8] + ) -> Result; + + /// Append header to the request. + fn http_request_add_header( + request_id: HttpRequestId, + name: &str, + value: &str + ) -> Result<(), ()>; + + /// Write a chunk of request body. + /// + /// Writing an empty chunks finalises the request. + /// Passing `None` as deadline blocks forever. + /// + /// Returns an error in case deadline is reached or the chunk couldn't be written. + fn http_request_write_body( + request_id: HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), HttpError>; + + /// Block and wait for the responses for given requests. + /// + /// Returns a vector of request statuses (the len is the same as ids). + /// Note that if deadline is not provided the method will block indefinitely, + /// otherwise unready responses will produce `DeadlineReached` status. + /// + /// Passing `None` as deadline blocks forever. + fn http_response_wait( + ids: &[HttpRequestId], + deadline: Option + ) -> Vec; + + /// Read all response headers. + /// + /// Returns a vector of pairs `(HeaderKey, HeaderValue)`. + /// NOTE response headers have to be read before response body. + fn http_response_headers( + request_id: HttpRequestId + ) -> Vec<(Vec, Vec)>; + + /// Read a chunk of body response to given buffer. /// - /// 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); + /// Returns the number of bytes written or an error in case a deadline + /// is reached or server closed the connection. + /// If `0` is returned it means that the response has been fully consumed + /// and the `request_id` is now invalid. + /// NOTE this implies that response headers must be read before draining the body. + /// Passing `None` as a deadline blocks forever. + fn http_response_read_body( + request_id: HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result; } } diff --git a/core/sr-io/src/offchain/http.rs b/core/sr-io/src/offchain/http.rs new file mode 100644 index 0000000000..0708f83717 --- /dev/null +++ b/core/sr-io/src/offchain/http.rs @@ -0,0 +1,571 @@ +// 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 . + +//! A non-std set of HTTP types. + +use rstd::str; +use rstd::prelude::Vec; +#[cfg(not(feature = "std"))] +use rstd::prelude::vec; +use primitives::offchain::{ + Timestamp, + HttpRequestId as RequestId, + HttpRequestStatus as RequestStatus, + HttpError, +}; + +/// Request method (HTTP verb) +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Method { + /// GET request + Get, + /// POST request + Post, + /// PUT request + Put, + /// PATCH request + Patch, + /// DELETE request + Delete, + /// Custom verb + Other(&'static str), +} + +impl AsRef for Method { + fn as_ref(&self) -> &str { + match *self { + Method::Get => "GET", + Method::Post => "POST", + Method::Put => "PUT", + Method::Patch => "PATCH", + Method::Delete => "DELETE", + Method::Other(m) => m, + } + } +} + +mod header { + use super::*; + + /// A header type. + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug))] + pub struct Header { + name: Vec, + value: Vec, + } + + impl Header { + /// Creates new header given it's name and value. + pub fn new(name: &str, value: &str) -> Self { + Header { + name: name.as_bytes().to_vec(), + value: value.as_bytes().to_vec(), + } + } + + /// Returns the name of this header. + pub fn name(&self) -> &str { + // Header keys are always produced from `&str` so this is safe. + // we don't store them as `Strings` to avoid bringing `alloc::String` to rstd + // or here. + unsafe { str::from_utf8_unchecked(&self.name) } + } + + /// Returns the value of this header. + pub fn value(&self) -> &str { + // Header values are always produced from `&str` so this is safe. + // we don't store them as `Strings` to avoid bringing `alloc::String` to rstd + // or here. + unsafe { str::from_utf8_unchecked(&self.value) } + } + } +} + +/// An HTTP request builder. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Request<'a, T = Vec<&'static [u8]>> { + /// Request method + pub method: Method, + /// Request URL + pub url: &'a str, + /// Body of the request + pub body: T, + /// Deadline to finish sending the request + pub deadline: Option, + /// Request list of headers. + headers: Vec, +} + +impl Default for Request<'static, T> { + fn default() -> Self { + Request { + method: Method::Get, + url: "http://localhost", + headers: Vec::new(), + body: Default::default(), + deadline: None, + } + } +} + +impl<'a> Request<'a> { + /// Start a simple GET request + pub fn get(url: &'a str) -> Self { + Self::new(url) + } +} + +impl<'a, T> Request<'a, T> { + /// Create new POST request with given body. + pub fn post(url: &'a str, body: T) -> Self { + let req: Request = Request::default(); + + Request { + url, + body, + method: Method::Post, + headers: req.headers, + deadline: req.deadline, + } + } +} + +impl<'a, T: Default> Request<'a, T> { + /// Create new Request builder with given URL and body. + pub fn new(url: &'a str) -> Self { + Request::default().url(url) + } + + /// Change the method of the request + pub fn method(mut self, method: Method) -> Self { + self.method = method; + self + } + + /// Change the URL of the request. + pub fn url(mut self, url: &'a str) -> Self { + self.url = url; + self + } + + /// Set the body of the request. + pub fn body(mut self, body: T) -> Self { + self.body = body; + self + } + + /// Add a header. + pub fn add_header(mut self, name: &str, value: &str) -> Self { + self.headers.push(header::Header::new(name, value)); + self + } + + /// Set the deadline of the request. + pub fn deadline(mut self, deadline: Timestamp) -> Self { + self.deadline = Some(deadline); + self + } +} + +impl<'a, I: AsRef<[u8]>, T: IntoIterator> Request<'a, T> { + /// Send the request and return a handle. + /// + /// Err is returned in case the deadline is reached + /// or the request timeouts. + pub fn send(self) -> Result { + let meta = &[]; + + // start an http request. + let id = crate::http_request_start(self.method.as_ref(), self.url, meta).map_err(|_| HttpError::IoError)?; + + // add custom headers + for header in &self.headers { + crate::http_request_add_header( + id, + header.name(), + header.value(), + ).map_err(|_| HttpError::IoError)? + } + + // write body + for chunk in self.body { + crate::http_request_write_body(id, chunk.as_ref(), self.deadline)?; + } + + // finalise the request + crate::http_request_write_body(id, &[], self.deadline)?; + + Ok(PendingRequest { + id, + }) + } +} + +/// A request error +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Error { + /// Deadline has been reached. + DeadlineReached, + /// Request had timed out. + Timeout, + /// Unknown error has been ecountered. + Unknown, +} + +/// A struct representing an uncompleted http request. +#[derive(PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct PendingRequest { + /// Request ID + pub id: RequestId, +} + +/// A result of waiting for a pending request. +pub type HttpResult = Result; + +impl PendingRequest { + /// Wait for the request to complete. + /// + /// NOTE this waits for the request indefinitely. + pub fn wait(self) -> HttpResult { + match self.try_wait(None) { + Ok(res) => res, + Err(_) => panic!("Since `None` is passed we will never get a deadline error; qed"), + } + } + + /// Attempts to wait for the request to finish, + /// but will return `Err` in case the deadline is reached. + pub fn try_wait(self, deadline: impl Into>) -> Result { + Self::try_wait_all(vec![self], deadline).pop().expect("One request passed, one status received; qed") + } + + /// Wait for all provided requests. + pub fn wait_all(requests: Vec) -> Vec { + Self::try_wait_all(requests, None) + .into_iter() + .map(|r| match r { + Ok(r) => r, + Err(_) => panic!("Since `None` is passed we will never get a deadline error; qed"), + }) + .collect() + } + + /// Attempt to wait for all provided requests, but up to given deadline. + /// + /// Requests that are complete will resolve to an `Ok` others will return a `DeadlineReached` error. + pub fn try_wait_all( + requests: Vec, + deadline: impl Into> + ) -> Vec> { + let ids = requests.iter().map(|r| r.id).collect::>(); + let statuses = crate::http_response_wait(&ids, deadline.into()); + + statuses + .into_iter() + .zip(requests.into_iter()) + .map(|(status, req)| match status { + RequestStatus::DeadlineReached => Err(req), + RequestStatus::Timeout => Ok(Err(Error::Timeout)), + RequestStatus::Unknown => Ok(Err(Error::Unknown)), + RequestStatus::Finished(code) => Ok(Ok(Response::new(req.id, code))), + }) + .collect() + } +} + +/// A HTTP response. +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Response { + /// Request id + pub id: RequestId, + /// Response status code + pub code: u16, + /// A collection of headers. + headers: Option, +} + +impl Response { + fn new(id: RequestId, code: u16) -> Self { + Self { + id, + code, + headers: None, + } + } + + /// Retrieve the headers for this response. + pub fn headers(&mut self) -> &Headers { + if self.headers.is_none() { + self.headers = Some(Headers { raw: crate::http_response_headers(self.id) }); + } + self.headers.as_ref().expect("Headers were just set; qed") + } + + /// Retrieve the body of this response. + pub fn body(&self) -> ResponseBody { + ResponseBody::new(self.id) + } +} + +/// A buffered byte iterator over response body. +/// +/// Note that reading the body may return `None` in following cases: +/// 1. Either the deadline you've set is reached (check via `#error`; +/// In such case you can resume the reader by setting a new deadline) +/// 2. Or because of IOError. In such case the reader is not resumable and will keep +/// returning `None`. +/// 3. The body has been returned. The reader will keep returning `None`. +#[derive(Clone)] +pub struct ResponseBody { + id: RequestId, + error: Option, + buffer: [u8; 4096], + filled_up_to: Option, + position: usize, + deadline: Option, +} + +#[cfg(feature = "std")] +impl std::fmt::Debug for ResponseBody { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.debug_struct("ResponseBody") + .field("id", &self.id) + .field("error", &self.error) + .field("buffer", &self.buffer.len()) + .field("filled_up_to", &self.filled_up_to) + .field("position", &self.position) + .field("deadline", &self.deadline) + .finish() + } +} + +impl ResponseBody { + fn new(id: RequestId) -> Self { + ResponseBody { + id, + error: None, + buffer: [0_u8; 4096], + filled_up_to: None, + position: 0, + deadline: None, + } + } + + /// Set the deadline for reading the body. + pub fn deadline(&mut self, deadline: impl Into>) { + self.deadline = deadline.into(); + self.error = None; + } + + /// Return an error that caused the iterator to return `None`. + /// + /// If the error is `DeadlineReached` you can resume the iterator by setting + /// a new deadline. + pub fn error(&self) -> &Option { + &self.error + } +} + +impl Iterator for ResponseBody { + type Item = u8; + + fn next(&mut self) -> Option { + if self.error.is_some() { + return None; + } + + if self.filled_up_to.is_none() { + let result = crate::http_response_read_body(self.id, &mut self.buffer, self.deadline); + match result { + Err(e) => { + self.error = Some(e); + return None; + } + Ok(0) => { + return None; + } + Ok(size) => { + self.position = 0; + self.filled_up_to = Some(size); + } + } + } + + if Some(self.position) == self.filled_up_to { + self.filled_up_to = None; + return self.next(); + } + + let result = self.buffer[self.position]; + self.position += 1; + Some(result) + } +} + +/// A collection of Headers in the response. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Headers { + /// Raw headers + pub raw: Vec<(Vec, Vec)>, +} + +impl Headers { + /// Retrieve a single header from the list of headers. + /// + /// Note this method is linearly looking from all the headers + /// comparing them with the needle byte-by-byte. + /// If you want to consume multiple headers it's better to iterate + /// and collect them on your own. + pub fn find(&self, name: &str) -> Option<&str> { + let raw = name.as_bytes(); + for &(ref key, ref val) in &self.raw { + if &**key == raw { + return str::from_utf8(&val).ok() + } + } + None + } + + /// Convert this headers into an iterator. + pub fn into_iter(&self) -> HeadersIterator { + HeadersIterator { collection: &self.raw, index: None } + } +} + +/// A custom iterator traversing all the headers. +#[derive(Clone)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct HeadersIterator<'a> { + collection: &'a [(Vec, Vec)], + index: Option, +} + +impl<'a> HeadersIterator<'a> { + /// Move the iterator to the next position. + /// + /// Returns `true` is `current` has been set by this call. + pub fn next(&mut self) -> bool { + let index = self.index.map(|x| x + 1).unwrap_or(0); + self.index = Some(index); + index < self.collection.len() + } + + /// Returns current element (if any). + /// + /// Note that you have to call `next` prior to calling this + pub fn current(&self) -> Option<(&str, &str)> { + self.collection.get(self.index?) + .map(|val| (str::from_utf8(&val.0).unwrap_or(""), str::from_utf8(&val.1).unwrap_or(""))) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{TestExternalities, with_externalities}; + use substrate_offchain::testing; + + #[test] + fn should_send_a_basic_request_and_get_response() { + let offchain = testing::TestOffchainExt::default(); + let mut t = TestExternalities::default(); + let state = offchain.0.clone(); + t.set_offchain_externalities(offchain); + + with_externalities(&mut t, || { + let request: Request = Request::get("http://localhost:1234"); + let pending = request + .add_header("X-Auth", "hunter2") + .send() + .unwrap(); + // make sure it's sent correctly + state.write().fulfill_pending_request( + 0, + testing::PendingRequest { + method: "GET".into(), + uri: "http://localhost:1234".into(), + headers: vec![("X-Auth".into(), "hunter2".into())], + sent: true, + ..Default::default() + }, + b"1234".to_vec(), + None, + ); + + // wait + let mut response = pending.wait().unwrap(); + + // then check the response + let mut headers = response.headers().into_iter(); + assert_eq!(headers.current(), None); + assert_eq!(headers.next(), false); + assert_eq!(headers.current(), None); + + let body = response.body(); + assert_eq!(body.clone().collect::>(), b"1234".to_vec()); + assert_eq!(body.error(), &None); + }) + } + + #[test] + fn should_send_a_post_request() { + let offchain = testing::TestOffchainExt::default(); + let mut t = TestExternalities::default(); + let state = offchain.0.clone(); + t.set_offchain_externalities(offchain); + + with_externalities(&mut t, || { + let pending = Request::default() + .method(Method::Post) + .url("http://localhost:1234") + .body(vec![b"1234"]) + .send() + .unwrap(); + // make sure it's sent correctly + state.write().fulfill_pending_request( + 0, + testing::PendingRequest { + method: "POST".into(), + uri: "http://localhost:1234".into(), + body: b"1234".to_vec(), + sent: true, + ..Default::default() + }, + b"1234".to_vec(), + Some(("Test".to_owned(), "Header".to_owned())), + ); + + // wait + let mut response = pending.wait().unwrap(); + + // then check the response + let mut headers = response.headers().into_iter(); + assert_eq!(headers.current(), None); + assert_eq!(headers.next(), true); + assert_eq!(headers.current(), Some(("Test", "Header"))); + + let body = response.body(); + assert_eq!(body.clone().collect::>(), b"1234".to_vec()); + assert_eq!(body.error(), &None); + }) + } +} diff --git a/core/sr-io/src/offchain/mod.rs b/core/sr-io/src/offchain/mod.rs new file mode 100644 index 0000000000..6b82f77111 --- /dev/null +++ b/core/sr-io/src/offchain/mod.rs @@ -0,0 +1,19 @@ +// 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 . + +//! A collection of higher lever helpers for offchain workers. + +pub mod http; diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 1bc0141c1d..01e7614de6 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -28,7 +28,7 @@ pub use substrate_state_machine::{ }; use environmental::environmental; -use primitives::{hexdisplay::HexDisplay, H256}; +use primitives::{offchain, hexdisplay::HexDisplay, H256}; #[cfg(feature = "std")] use std::collections::HashMap; @@ -251,12 +251,142 @@ impl HashingApi for () { } } +fn with_offchain(f: impl FnOnce(&mut offchain::Externalities) -> R, msg: &'static str) -> R { + ext::with(|ext| ext + .offchain() + .map(|ext| f(ext)) + .expect(msg) + ).expect("offchain-worker functions 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.") + fn submit_transaction(data: &T) -> Result<(), ()> { + with_offchain(|ext| { + ext.submit_transaction(codec::Encode::encode(data)) + }, "submit_transaction can be called only in the offchain worker context") + } + + fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { + with_offchain(|ext| { + ext.new_crypto_key(crypto) + }, "new_crypto_key can be called only in the offchain worker context") + } + + fn encrypt(key: Option, data: &[u8]) -> Result, ()> { + with_offchain(|ext| { + ext.encrypt(key, data) + }, "encrypt can be called only in the offchain worker context") + } + + fn decrypt(key: Option, data: &[u8]) -> Result, ()> { + with_offchain(|ext| { + ext.decrypt(key, data) + }, "decrypt can be called only in the offchain worker context") + } + + fn sign(key: Option, data: &[u8]) -> Result, ()> { + with_offchain(|ext| { + ext.sign(key, data) + }, "sign can be called only in the offchain worker context") + } + + fn verify(key: Option, msg: &[u8], signature: &[u8]) -> Result { + with_offchain(|ext| { + ext.verify(key, msg, signature) + }, "verify can be called only in the offchain worker context") + } + + fn timestamp() -> offchain::Timestamp { + with_offchain(|ext| { + ext.timestamp() + }, "timestamp can be called only in the offchain worker context") + } + + fn sleep_until(deadline: Timestamp) { + with_offchain(|ext| { + ext.sleep_until(deadline) + }, "sleep_until can be called only in the offchain worker context") + } + + fn random_seed() -> [u8; 32] { + with_offchain(|ext| { + ext.random_seed() + }, "random_seed can be called only in the offchain worker context") + } + + fn local_storage_set(key: &[u8], value: &[u8]) { + with_offchain(|ext| { + ext.local_storage_set(key, value) + }, "local_storage_set can be called only in the offchain worker context") + } + + fn local_storage_compare_and_set(key: &[u8], old_value: &[u8], new_value: &[u8]) { + with_offchain(|ext| { + ext.local_storage_compare_and_set(key, old_value, new_value) + }, "local_storage_compare_and_set can be called only in the offchain worker context") + } + + fn local_storage_get(key: &[u8]) -> Option> { + with_offchain(|ext| { + ext.local_storage_get(key) + }, "local_storage_get can be called only in the offchain worker context") + } + + fn http_request_start( + method: &str, + uri: &str, + meta: &[u8] + ) -> Result { + with_offchain(|ext| { + ext.http_request_start(method, uri, meta) + }, "http_request_start can be called only in the offchain worker context") + } + + fn http_request_add_header( + request_id: offchain::HttpRequestId, + name: &str, + value: &str + ) -> Result<(), ()> { + with_offchain(|ext| { + ext.http_request_add_header(request_id, name, value) + }, "http_request_add_header can be called only in the offchain worker context") + } + + fn http_request_write_body( + request_id: offchain::HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), offchain::HttpError> { + with_offchain(|ext| { + ext.http_request_write_body(request_id, chunk, deadline) + }, "http_request_write_body can be called only in the offchain worker context") + } + + fn http_response_wait( + ids: &[offchain::HttpRequestId], + deadline: Option + ) -> Vec { + with_offchain(|ext| { + ext.http_response_wait(ids, deadline) + }, "http_response_wait can be called only in the offchain worker context") + } + + fn http_response_headers( + request_id: offchain::HttpRequestId + ) -> Vec<(Vec, Vec)> { + with_offchain(|ext| { + ext.http_response_headers(request_id) + }, "http_response_headers can be called only in the offchain worker context") + } + + fn http_response_read_body( + request_id: offchain::HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result { + with_offchain(|ext| { + ext.http_response_read_body(request_id, buffer, deadline) + }, "http_response_read_body can be called only in the offchain worker context") } } diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index de87aeddbd..84e717ffae 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -19,8 +19,8 @@ pub use rstd; pub use rstd::{mem, slice}; use core::{intrinsics, panic::PanicInfo}; -use rstd::{vec::Vec, cell::Cell}; -use primitives::Blake2Hasher; +use rstd::{vec::Vec, cell::Cell, convert::TryInto}; +use primitives::{offchain, Blake2Hasher}; #[cfg(not(feature = "no_panic_handler"))] #[panic_handler] @@ -219,7 +219,6 @@ pub mod ext { /// # 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. @@ -331,8 +330,206 @@ pub mod ext { // Offchain-worker Context //================================ - /// Submit extrinsic. - fn ext_submit_extrinsic(data: *const u8, len: u32); + /// Submit transaction. + /// + /// # Returns + /// + /// - 0 if it was successfuly added to the pool + /// - nonzero otherwise. + fn ext_submit_transaction(data: *const u8, len: u32) -> u32; + + /// Create new key(pair) for signing/encryption/decryption. + /// + /// # Returns + /// + /// - A crypto key id (if the value is less than u16::max_value) + /// - `u32::max_value` in case the crypto is not supported + fn ext_new_crypto_key(crypto: u32) -> u32; + + /// Encrypt a piece of data using given crypto key. + /// + /// If `key` is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// + /// - `0` in case the key is invalid, `msg_len` is set to `u32::max_value` + /// - Otherwise, pointer to the encrypted message in memory, + /// `msg_len` contains the length of the message. + fn ext_encrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8; + + /// Decrypt a piece of data using given crypto key. + /// + /// If `key `is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// + /// - `0` in case the key is invalid or data couldn't be decrypted, + /// `msg_len` is set to `u32::max_value` + /// - Otherwise, pointer to the decrypted message in memory, + /// `msg_len` contains the length of the message. + fn ext_decrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8; + + /// Sign a piece of data using given crypto key. + /// + /// If `key` is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// + /// - `0` in case the key is invalid, + /// `sig_data_len` is set to `u32::max_value` + /// - Otherwise, pointer to the signature in memory, + /// `sig_data_len` contains the length of the signature. + fn ext_sign(key: u32, data: *const u8, data_len: u32, sig_data_len: *mut u32) -> *mut u8; + + /// Verifies that `signature` for `msg` matches given `key`. + /// + /// If `key` is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// - `0` in case the signature is correct + /// - `1` in case it doesn't match the key + /// - `u32::max_value` if the key is invalid. + fn ext_verify( + key: u32, + msg: *const u8, + msg_len: u32, + signature: *const u8, + signature_len: u32 + ) -> u32; + + /// Returns current UNIX timestamp (milliseconds) + fn ext_timestamp() -> u64; + + /// Pause execution until given timestamp (milliseconds; `deadline`) is reached. + /// + /// The deadline is obtained by querying the current timestamp via `ext_timestamp` + /// and then adding some time to it. + fn ext_sleep_until(deadline: u64); + + /// Generate a random seed + /// + /// `data` has to be a pointer to a slice of 32 bytes. + fn ext_random_seed(data: *mut u8); + + /// Write a value to local storage. + fn ext_local_storage_set(key: *const u8, key_len: u32, value: *const u8, value_len: u32); + + /// Write a value to local storage in atomic fashion. + fn ext_local_storage_compare_and_set( + key: *const u8, + key_len: u32, + old_value: *const u8, + old_value_len: u32, + new_value: *const u8, + new_value_len: u32 + ); + + /// Read a value from local storage. + /// + /// + /// # Returns + /// + /// - 0 if the value has not been found, the `value_len` is set to `u32::max_value`. + /// - Otherwise, pointer to the value in memory. `value_len` contains the length of the value. + fn ext_local_storage_get(key: *const u8, key_len: u32, value_len: *mut u32) -> *mut u8; + + /// Initiaties a http request. + /// + /// `meta` is parity-codec encoded additional parameters to the request (like redirection policy, + /// timeouts, certificates policy, etc). The format is not yet specified and the field is currently + /// only reserved for future use. + /// + /// # Returns + /// + /// `RequestId(u16)` of initiated request, any value beyond `u16::max_value` + /// signifies an error. + fn ext_http_request_start( + method: *const u8, + method_len: u32, + url: *const u8, + url_len: u32, + meta: *const u8, + meta_len: u32 + ) -> u32; + + /// Add a header to the request. + /// + /// # Returns + /// + /// - `0` if successful (and the request id exists) + /// - nonzero otherwise + fn ext_http_request_add_header( + request_id: u32, + name: *const u8, + name_len: u32, + value: *const u8, + value_len: u32 + ) -> u32; + + /// Write a chunk of request body. + /// + /// Writing an empty chunks finalises the request. + /// Passing `0` as deadline blocks forever. + /// + /// # Returns + /// + /// - `0` if successful, + /// - nonzero otherwise (see HttpError for the codes) + fn ext_http_request_write_body( + request_id: u32, + chunk: *const u8, + chunk_len: u32, + deadline: u64 + ) -> u32; + + /// Block and wait for the responses for given requests. + /// + /// Note that if deadline is 0 the method will block indefinitely, + /// otherwise unready responses will produce `DeadlineReached` status. + /// (see #primitives::offchain::HttpRequestStatus) + /// + /// Make sure that `statuses` have the same length as ids. + fn ext_http_response_wait( + ids: *const u32, + ids_len: u32, + statuses: *mut u32, + deadline: u64 + ); + + /// Read all response headers. + /// + /// Note the headers are only available before response body is fully consumed. + /// + /// # Returns + /// + /// - A pointer to parity-codec encoded vector of pairs `(HeaderKey, HeaderValue)`. + /// - In case invalid `id` is passed it returns a pointer to parity-encoded empty vector. + fn ext_http_response_headers( + id: u32, + written_out: *mut u32 + ) -> *mut u8; + + /// Read a chunk of body response to given buffer. + /// + /// Passing `0` as deadline blocks forever. + /// + /// # Returns + /// + /// The number of bytes written if successful, + /// - if it's `0` it means response has been fully consumed, + /// - if it's greater than `u32::max_value() - 255` it means reading body failed. + /// + /// In case of failure, the error code should be mapped to `HttpError` + /// in a following manner: + /// - `u32::max_value()` HttpError code 1 (DeadlineReached) + /// - `u32::max_value() - 1` HttpError code 2 (IoError) + /// The rest is reserved for potential future errors. + fn ext_http_response_read_body( + id: u32, + buffer: *mut u8, + buffer_len: u32, + deadline: u64 + ) -> u32; } } @@ -343,14 +540,7 @@ impl StorageApi for () { 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)) - } + from_raw_parts(ptr, length) } } @@ -364,14 +554,7 @@ impl StorageApi for () { 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)) - } + from_raw_parts(ptr, length) } } @@ -491,10 +674,7 @@ impl StorageApi for () { 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) + from_raw_parts(ptr, length).expect("ext_child_storage_root never returns u32::max_value; qed") } } @@ -624,12 +804,273 @@ impl CryptoApi for () { } impl OffchainApi for () { - fn submit_extrinsic(data: &T) { + fn submit_transaction(data: &T) -> Result<(), ()> { let encoded_data = codec::Encode::encode(data); + let ret = unsafe { + ext_submit_transaction.get()(encoded_data.as_ptr(), encoded_data.len() as u32) + }; + + if ret == 0 { + Ok(()) + } else { + Err(()) + } + } + + fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { + let crypto = crypto as u8 as u32; + let ret = unsafe { + ext_new_crypto_key.get()(crypto) + }; + + if ret > u16::max_value() as u32 { + Err(()) + } else { + Ok(offchain::CryptoKeyId(ret as u16)) + } + } + + fn encrypt(key: Option, data: &[u8]) -> Result, ()> { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let mut len = 0_u32; + unsafe { + let ptr = ext_encrypt.get()(key, data.as_ptr(), data.len() as u32, &mut len); + + from_raw_parts(ptr, len).ok_or(()) + } + } + + fn decrypt(key: Option, data: &[u8]) -> Result, ()> { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let mut len = 0_u32; + unsafe { + let ptr = ext_decrypt.get()(key, data.as_ptr(), data.len() as u32, &mut len); + + from_raw_parts(ptr, len).ok_or(()) + } + } + + fn sign(key: Option, data: &[u8]) -> Result, ()> { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let mut len = 0_u32; + unsafe { + let ptr = ext_sign.get()(key, data.as_ptr(), data.len() as u32, &mut len); + + from_raw_parts(ptr, len).ok_or(()) + } + } + + fn verify(key: Option, msg: &[u8], signature: &[u8]) -> Result { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let val = unsafe { + ext_verify.get()( + key, + msg.as_ptr(), + msg.len() as u32, + signature.as_ptr(), + signature.len() as u32, + ) + }; + + match val { + 0 => Ok(true), + 1 => Ok(false), + _ => Err(()), + } + } + + fn timestamp() -> offchain::Timestamp { + offchain::Timestamp::from_unix_millis(unsafe { + ext_timestamp.get()() + }) + } + + fn sleep_until(deadline: Timestamp) { + unsafe { + ext_sleep_until.get()(deadline.unix_millis()) + } + } + + fn random_seed() -> [u8; 32] { + let mut result = [0_u8; 32]; + unsafe { + ext_random_seed.get()(result.as_mut_ptr()) + } + result + } + + fn local_storage_set(key: &[u8], value: &[u8]) { + unsafe { + ext_local_storage_set.get()( + key.as_ptr(), + key.len() as u32, + value.as_ptr(), + value.len() as u32, + ) + } + } + + fn local_storage_compare_and_set(key: &[u8], old_value: &[u8], new_value: &[u8]) { unsafe { - ext_submit_extrinsic.get()(encoded_data.as_ptr(), encoded_data.len() as u32) + ext_local_storage_compare_and_set.get()( + key.as_ptr(), + key.len() as u32, + old_value.as_ptr(), + old_value.len() as u32, + new_value.as_ptr(), + new_value.len() as u32, + ) } } + + fn local_storage_get(key: &[u8]) -> Option> { + let mut len = 0u32; + unsafe { + let ptr = ext_local_storage_get.get()( + key.as_ptr(), + key.len() as u32, + &mut len, + ); + + from_raw_parts(ptr, len) + } + } + + fn http_request_start(method: &str, url: &str, meta: &[u8]) -> Result { + let method = method.as_bytes(); + let url = url.as_bytes(); + + let result = unsafe { + ext_http_request_start.get()( + method.as_ptr(), + method.len() as u32, + url.as_ptr(), + url.len() as u32, + meta.as_ptr(), + meta.len() as u32, + ) + }; + + if result > u16::max_value() as u32 { + Err(()) + } else { + Ok(offchain::HttpRequestId(result as u16)) + } + } + + fn http_request_add_header(request_id: offchain::HttpRequestId, name: &str, value: &str) -> Result<(), ()> { + let name = name.as_bytes(); + let value = value.as_bytes(); + + let result = unsafe { + ext_http_request_add_header.get()( + request_id.0 as u32, + name.as_ptr(), + name.len() as u32, + value.as_ptr(), + value.len() as u32, + ) + }; + + if result == 0 { + Ok(()) + } else { + Err(()) + } + } + + fn http_request_write_body( + request_id: offchain::HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), offchain::HttpError> { + let res = unsafe { + ext_http_request_write_body.get()( + request_id.0 as u32, + chunk.as_ptr(), + chunk.len() as u32, + deadline.map_or(0, |x| x.unix_millis()), + ) + }; + + if res == 0 { + Ok(()) + } else { + Err(res.try_into().unwrap_or(offchain::HttpError::IoError)) + } + } + + fn http_response_wait( + ids: &[offchain::HttpRequestId], + deadline: Option + ) -> Vec { + let ids = ids.iter().map(|x| x.0 as u32).collect::>(); + let mut statuses = Vec::new(); + statuses.resize(ids.len(), 0u32); + + unsafe { + ext_http_response_wait.get()( + ids.as_ptr(), + ids.len() as u32, + statuses.as_mut_ptr(), + deadline.map_or(0, |x| x.unix_millis()), + ) + } + + statuses + .into_iter() + .map(|status| status.try_into().unwrap_or(offchain::HttpRequestStatus::Unknown)) + .collect() + } + + fn http_response_headers( + request_id: offchain::HttpRequestId, + ) -> Vec<(Vec, Vec)> { + let mut len = 0u32; + let raw_result = unsafe { + let ptr = ext_http_response_headers.get()( + request_id.0 as u32, + &mut len, + ); + + from_raw_parts(ptr, len).expect("ext_http_response_headers never return u32::max_value; qed") + }; + + codec::Decode::decode(&mut &*raw_result).unwrap_or_default() + } + + fn http_response_read_body( + request_id: offchain::HttpRequestId, + buffer: &mut [u8], + deadline: Option, + ) -> Result { + let res = unsafe { + ext_http_response_read_body.get()( + request_id.0 as u32, + buffer.as_mut_ptr(), + buffer.len() as u32, + deadline.map_or(0, |x| x.unix_millis()), + ) + }; + + if res >= u32::max_value() - 255 { + let code = (u32::max_value() - res) + 1; + code.try_into().map_err(|_| offchain::HttpError::IoError) + } else { + Ok(res as usize) + } + } +} + +unsafe fn from_raw_parts(ptr: *mut u8, len: u32) -> Option> { + if len == 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, len as usize, len as usize)) + } } impl Api for () {} diff --git a/core/sr-primitives/src/generic/era.rs b/core/sr-primitives/src/generic/era.rs index 22f47b6769..c41d3eedfc 100644 --- a/core/sr-primitives/src/generic/era.rs +++ b/core/sr-primitives/src/generic/era.rs @@ -21,7 +21,10 @@ use serde::{Serialize, Deserialize}; use crate::codec::{Decode, Encode, Input, Output}; +/// Era period pub type Period = u64; + +/// Era phase pub type Phase = u64; /// An era to describe the longevity of a transaction. diff --git a/core/sr-std/with_std.rs b/core/sr-std/with_std.rs index d71b9dcb69..5824e26241 100644 --- a/core/sr-std/with_std.rs +++ b/core/sr-std/with_std.rs @@ -19,6 +19,8 @@ pub use std::boxed; pub use std::cell; pub use std::clone; pub use std::cmp; +pub use std::convert; +pub use std::default; pub use std::fmt; pub use std::hash; pub use std::iter; @@ -28,11 +30,10 @@ pub use std::num; pub use std::ops; pub use std::ptr; pub use std::rc; +pub use std::result; pub use std::slice; +pub use std::str; 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; diff --git a/core/sr-std/without_std.rs b/core/sr-std/without_std.rs index 9214a0ed2f..db81372c2f 100755 --- a/core/sr-std/without_std.rs +++ b/core/sr-std/without_std.rs @@ -53,6 +53,8 @@ pub use core::borrow; pub use core::cell; pub use core::clone; pub use core::cmp; +pub use core::convert; +pub use core::default; pub use core::hash; pub use core::intrinsics; pub use core::iter; @@ -61,10 +63,10 @@ pub use core::mem; pub use core::num; pub use core::ops; pub use core::ptr; -pub use core::slice; -pub use core::default; pub use core::result; -pub use core::convert; +pub use core::slice; +// Allow intepreting vectors of bytes as strings, but not constructing them. +pub use core::str; // 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). diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index 6cb3efd267..0eb0b84b27 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -20,6 +20,7 @@ use std::collections::HashMap; use std::iter::FromIterator; use hash_db::Hasher; use trie::trie_root; +use primitives::offchain; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; use parity_codec::Encode; use super::{ChildStorageKey, Externalities, OverlayedChanges}; @@ -155,9 +156,9 @@ impl Externalities for BasicExternalities where H::Out: Ord { Ok(None) } - fn submit_extrinsic(&mut self, _extrinsic: Vec) -> Result<(), ()> { - warn!("Call to submit_extrinsic without offchain externalities set."); - Err(()) + fn offchain(&mut self) -> Option<&mut offchain::Externalities> { + warn!("Call to non-existent out offchain externalities set."); + None } } diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index f0638edf65..6ec1ce77e6 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -20,8 +20,9 @@ use std::{error, fmt, cmp::Ord}; use log::warn; use crate::backend::Backend; use crate::changes_trie::{Storage as ChangesTrieStorage, compute_changes_trie_root}; -use crate::{Externalities, OverlayedChanges, OffchainExt, ChildStorageKey}; +use crate::{Externalities, OverlayedChanges, ChildStorageKey}; use hash_db::Hasher; +use primitives::offchain; use primitives::storage::well_known_keys::is_child_storage_key; use trie::{MemoryDB, TrieDBMut, TrieMut, default_child_trie_root}; @@ -91,7 +92,7 @@ where H: Hasher, B: 'a + Backend, T: 'a + ChangesTrieStorage, - O: 'a + OffchainExt, + O: 'a + offchain::Externalities, H::Out: Ord + 'static, N: crate::changes_trie::BlockNumber, { @@ -145,7 +146,7 @@ where H: Hasher, B: 'a + Backend, T: 'a + ChangesTrieStorage, - O: 'a + OffchainExt, + O: 'a + offchain::Externalities, N: crate::changes_trie::BlockNumber, { pub fn storage_pairs(&self) -> Vec<(Vec, Vec)> { @@ -167,7 +168,7 @@ where H: Hasher, B: 'a + Backend, T: 'a + ChangesTrieStorage, - O: 'a + OffchainExt, + O: 'a + offchain::Externalities, H::Out: Ord + 'static, N: crate::changes_trie::BlockNumber, { @@ -342,15 +343,8 @@ where Ok(root) } - fn submit_extrinsic(&mut self, extrinsic: Vec) -> Result<(), ()> { - let _guard = panic_handler::AbortGuard::new(true); - if let Some(ext) = self.offchain_externalities.as_mut() { - ext.submit_extrinsic(extrinsic); - Ok(()) - } else { - warn!("Call to submit_extrinsic without offchain externalities set."); - Err(()) - } + fn offchain(&mut self) -> Option<&mut offchain::Externalities> { + self.offchain_externalities.as_mut().map(|x| &mut **x as _) } } diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index 4f51677fff..f16c3db14e 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -24,7 +24,7 @@ use log::warn; use hash_db::Hasher; use parity_codec::{Decode, Encode}; use primitives::{ - storage::well_known_keys, NativeOrEncoded, NeverNativeValue, OffchainExt + storage::well_known_keys, NativeOrEncoded, NeverNativeValue, offchain }; pub mod backend; @@ -221,10 +221,8 @@ pub trait Externalities { /// 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) -> Result, ()> where H::Out: Ord; - /// Submit extrinsic. - /// - /// Returns an error in case the API is not available. - fn submit_extrinsic(&mut self, extrinsic: Vec) -> Result<(), ()>; + /// Returns offchain externalities extension if present. + fn offchain(&mut self) -> Option<&mut offchain::Externalities>; } /// An implementation of offchain extensions that should never be triggered. @@ -237,8 +235,121 @@ impl NeverOffchainExt { } } -impl OffchainExt for NeverOffchainExt { - fn submit_extrinsic(&mut self, _extrinsic: Vec) { unreachable!() } +impl offchain::Externalities for NeverOffchainExt { + fn submit_transaction(&mut self, _extrinsic: Vec) -> Result<(), ()> { + unreachable!() + } + + fn new_crypto_key( + &mut self, + _crypto: offchain::CryptoKind, + ) -> Result { + unreachable!() + } + + fn encrypt( + &mut self, + _key: Option, + _data: &[u8], + ) -> Result, ()> { + unreachable!() + } + + fn decrypt( + &mut self, + _key: Option, + _data: &[u8], + ) -> Result, ()> { + unreachable!() + } + + fn sign(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unreachable!() + } + + fn verify( + &mut self, + _key: Option, + _msg: &[u8], + _signature: &[u8], + ) -> Result { + unreachable!() + } + + fn timestamp(&mut self) -> offchain::Timestamp { + unreachable!() + } + + fn sleep_until(&mut self, _deadline: offchain::Timestamp) { + unreachable!() + } + + fn random_seed(&mut self) -> [u8; 32] { + unreachable!() + } + + fn local_storage_set(&mut self, _key: &[u8], _value: &[u8]) { + unreachable!() + } + + fn local_storage_compare_and_set(&mut self, _key: &[u8], _old_value: &[u8], _new_value: &[u8]) { + unreachable!() + } + + fn local_storage_get(&mut self, _key: &[u8]) -> Option> { + unreachable!() + } + + fn http_request_start( + &mut self, + _method: &str, + _uri: &str, + _meta: &[u8] + ) -> Result { + unreachable!() + } + + fn http_request_add_header( + &mut self, + _request_id: offchain::HttpRequestId, + _name: &str, + _value: &str + ) -> Result<(), ()> { + unreachable!() + } + + fn http_request_write_body( + &mut self, + _request_id: offchain::HttpRequestId, + _chunk: &[u8], + _deadline: Option + ) -> Result<(), offchain::HttpError> { + unreachable!() + } + + fn http_response_wait( + &mut self, + _ids: &[offchain::HttpRequestId], + _deadline: Option + ) -> Vec { + unreachable!() + } + + fn http_response_headers( + &mut self, + _request_id: offchain::HttpRequestId + ) -> Vec<(Vec, Vec)> { + unreachable!() + } + + fn http_response_read_body( + &mut self, + _request_id: offchain::HttpRequestId, + _buffer: &mut [u8], + _deadline: Option + ) -> Result { + unreachable!() + } } /// Code execution engine. @@ -376,7 +487,7 @@ impl<'a, H, N, B, T, O, Exec> StateMachine<'a, H, N, B, T, O, Exec> where Exec: CodeExecutor, B: Backend, T: ChangesTrieStorage, - O: OffchainExt, + O: offchain::Externalities, H::Out: Ord + 'static, N: crate::changes_trie::BlockNumber, { @@ -415,12 +526,11 @@ impl<'a, H, N, B, T, O, Exec> StateMachine<'a, H, N, B, T, O, Exec> where R: Decode + Encode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, { - let offchain = self.offchain_ext.as_mut(); let mut externalities = ext::Ext::new( self.overlay, self.backend, self.changes_trie_storage, - offchain.map(|x| &mut **x), + self.offchain_ext.as_mut().map(|x| &mut **x), ); let (result, was_native) = self.exec.call( &mut externalities, diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index 52d208142d..3934e726af 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -25,6 +25,7 @@ use crate::changes_trie::{ compute_changes_trie_root, InMemoryStorage as ChangesTrieInMemoryStorage, BlockNumber as ChangesTrieBlockNumber, }; +use primitives::offchain; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; use parity_codec::Encode; use super::{ChildStorageKey, Externalities, OverlayedChanges}; @@ -36,6 +37,7 @@ pub struct TestExternalities { overlay: OverlayedChanges, backend: InMemory, changes_trie_storage: ChangesTrieInMemoryStorage, + offchain: Option>, } impl TestExternalities { @@ -61,6 +63,7 @@ impl TestExternalities { overlay, changes_trie_storage: ChangesTrieInMemoryStorage::new(), backend: inner.into(), + offchain: None, } } @@ -80,6 +83,11 @@ impl TestExternalities { .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) } + /// Set offchain externaltiies. + pub fn set_offchain_externalities(&mut self, offchain: impl offchain::Externalities + 'static) { + self.offchain = Some(Box::new(offchain)); + } + /// Get mutable reference to changes trie storage. pub fn changes_trie_storage(&mut self) -> &mut ChangesTrieInMemoryStorage { &mut self.changes_trie_storage @@ -226,8 +234,10 @@ impl Externalities for TestExternalities )?.map(|(root, _)| root.clone())) } - fn submit_extrinsic(&mut self, _extrinsic: Vec) -> Result<(), ()> { - unimplemented!() + fn offchain(&mut self) -> Option<&mut offchain::Externalities> { + self.offchain + .as_mut() + .map(|x| &mut **x as _) } } diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index 980ce810e4..e582fd4dc7 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -476,7 +476,7 @@ cfg_if! { impl offchain_primitives::OffchainWorkerApi for Runtime { fn offchain_worker(block: u64) { let ex = Extrinsic::IncludeData(block.encode()); - runtime_io::submit_extrinsic(&ex) + runtime_io::submit_transaction(&ex).unwrap(); } } @@ -628,7 +628,7 @@ cfg_if! { impl offchain_primitives::OffchainWorkerApi for Runtime { fn offchain_worker(block: u64) { let ex = Extrinsic::IncludeData(block.encode()); - runtime_io::submit_extrinsic(&ex) + runtime_io::submit_transaction(&ex).unwrap() } } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 86c73307b8..d243357fc2 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,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: 88, - impl_version: 90, + spec_version: 89, + impl_version: 89, apis: RUNTIME_API_VERSIONS, }; -- GitLab From 4a143611c3abd3ee546410e8e0010b495b5c7a1b Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 31 May 2019 10:40:27 +0200 Subject: [PATCH 057/140] Remove unneeded derive (#2743) --- srml/staking/src/phragmen.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/srml/staking/src/phragmen.rs b/srml/staking/src/phragmen.rs index 56f6419c06..888e38a7ec 100644 --- a/srml/staking/src/phragmen.rs +++ b/srml/staking/src/phragmen.rs @@ -19,7 +19,6 @@ 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; @@ -35,7 +34,7 @@ const SCALE_FACTOR: ExtendedBalance = u32::max_value() as ExtendedBalance + 1; pub const ACCURACY: ExtendedBalance = u32::max_value() as ExtendedBalance + 1; /// Wrapper around validation candidates some metadata. -#[derive(Clone, Encode, Decode, Default)] +#[derive(Clone, Default)] #[cfg_attr(feature = "std", derive(Debug))] pub struct Candidate { /// The validator's account @@ -49,7 +48,7 @@ pub struct Candidate { } /// Wrapper around the nomination info of a single nominator for a group of validators. -#[derive(Clone, Encode, Decode, Default)] +#[derive(Clone, Default)] #[cfg_attr(feature = "std", derive(Debug))] pub struct Nominator { /// The nominator's account. @@ -63,7 +62,7 @@ pub struct Nominator { } /// Wrapper around a nominator vote and the load of that vote. -#[derive(Clone, Encode, Decode, Default)] +#[derive(Clone, Default)] #[cfg_attr(feature = "std", derive(Debug))] pub struct Edge { /// Account being voted for -- GitLab From 4c9a2d75680930761de799c60a927c02d2ba2cec Mon Sep 17 00:00:00 2001 From: Joshy Orndorff Date: Sat, 1 Jun 2019 00:50:05 -0400 Subject: [PATCH 058/140] Typo fix Substate -> Substrate (#2754) --- README.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.adoc b/README.adoc index f1ffc20d91..2a76525914 100644 --- a/README.adoc +++ b/README.adoc @@ -307,7 +307,7 @@ cargo run --release \-- \ --telemetry-url ws://telemetry.polkadot.io:1024 \ --validator -Additional Substate CLI usage options are available and may be shown by running `cargo run \-- --help`. +Additional Substrate CLI usage options are available and may be shown by running `cargo run \-- --help`. [[flaming-fir]] === Joining the Flaming Fir Testnet -- GitLab From a9469eeee848d616bc11231517af499ed8baf8e4 Mon Sep 17 00:00:00 2001 From: kaichao Date: Mon, 3 Jun 2019 17:55:16 +0800 Subject: [PATCH 059/140] Fix typo (#2762) --- core/rpc/src/author/hash.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/rpc/src/author/hash.rs b/core/rpc/src/author/hash.rs index 052c479834..96addf8ebc 100644 --- a/core/rpc/src/author/hash.rs +++ b/core/rpc/src/author/hash.rs @@ -19,7 +19,7 @@ use serde::Deserialize; /// RPC Extrinsic or hash /// -/// Allows to refer to extrinsics either by their raw representation or by it's hash. +/// Allows to refer to extrinsic either by its raw representation or its hash. #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub enum ExtrinsicOrHash { -- GitLab From e45524e52925557d182bb8bbe9d8fa4a2182beb5 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 3 Jun 2019 14:48:46 +0200 Subject: [PATCH 060/140] Add warning about secp256k1 network keys (#2764) --- core/network-libp2p/src/service_task.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/network-libp2p/src/service_task.rs b/core/network-libp2p/src/service_task.rs index a58b24cbfe..e74757e0b1 100644 --- a/core/network-libp2p/src/service_task.rs +++ b/core/network-libp2p/src/service_task.rs @@ -16,6 +16,7 @@ use crate::{ behaviour::Behaviour, + config::NodeKeyConfig, transport, NetworkState, NetworkStatePeer, NetworkStateNotConnectedPeer }; use crate::custom_proto::{CustomProto, CustomProtoOut, CustomMessage, RegisteredProtocol}; @@ -79,6 +80,9 @@ where TMessage: CustomMessage + Send + 'static { }); // Private and public keys configuration. + if let NodeKeyConfig::Secp256k1(_) = config.node_key { + warn!(target: "sub-libp2p", "Secp256k1 keys are deprecated in favour of ed25519"); + } 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(); -- GitLab From 7efd7e77bff06330bf3ecec13752236a786c8b17 Mon Sep 17 00:00:00 2001 From: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> Date: Mon, 3 Jun 2019 10:34:38 -0400 Subject: [PATCH 061/140] Remove spurious `#[derive(Encode, Decode)]` (#2759) They did not compile, since `Encode` and `Decode` are deliberately not implemented for `usize`. --- node/runtime/src/lib.rs | 2 +- srml/aura/src/lib.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index d243357fc2..1e31e5400e 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 89, - impl_version: 89, + impl_version: 90, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index 646ad972d0..3b557e2944 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -57,7 +57,6 @@ use primitives::traits::{SaturatedConversion, Saturating, Zero, One}; use timestamp::OnTimestampSet; #[cfg(feature = "std")] use timestamp::TimestampInherentData; -use parity_codec::{Encode, Decode}; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; @@ -133,6 +132,7 @@ impl ProvideInherentData for InherentDataProvider { } fn error_to_string(&self, error: &[u8]) -> Option { + use parity_codec::Decode; RuntimeString::decode(&mut &error[..]).map(Into::into) } } @@ -163,7 +163,7 @@ decl_module! { } /// A report of skipped authorities in Aura. -#[derive(Clone, Encode, Decode, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] pub struct AuraReport { // The first skipped slot. -- GitLab From b30bff5bce27979c78e655c492dbca09c5fe0079 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Mon, 3 Jun 2019 16:45:12 +0200 Subject: [PATCH 062/140] Peer prioritization (#2717) * Added priority groups * Added a test * Whitespace * Added add/remove single peer API * Added a warning * Fixed removing reserved peer * Fixed build * Made some methods private and made get_priority_group return an Option --- core/peerset/src/lib.rs | 94 ++++-- core/peerset/src/peersstate.rs | 505 +++++++++++++++++---------------- 2 files changed, 330 insertions(+), 269 deletions(-) diff --git a/core/peerset/src/lib.rs b/core/peerset/src/lib.rs index 6956cd16e1..aa3ce02076 100644 --- a/core/peerset/src/lib.rs +++ b/core/peerset/src/lib.rs @@ -19,7 +19,7 @@ mod peersstate; -use std::{collections::HashMap, collections::VecDeque, time::Instant}; +use std::{collections::{HashSet, HashMap}, collections::VecDeque, time::Instant}; use futures::{prelude::*, sync::mpsc, try_ready}; use libp2p::PeerId; use log::{debug, error, trace}; @@ -29,6 +29,8 @@ use serde_json::json; 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; +/// Reserved peers group ID +const RESERVED_NODES: &'static str = "reserved"; #[derive(Debug)] enum Action { @@ -36,6 +38,9 @@ enum Action { RemoveReservedPeer(PeerId), SetReservedOnly(bool), ReportPeer(PeerId, i32), + SetPriorityGroup(String, HashSet), + AddToPriorityGroup(String, PeerId), + RemoveFromPriorityGroup(String, PeerId), } /// Shared handle to the peer set manager (PSM). Distributed around the code. @@ -72,6 +77,21 @@ impl PeersetHandle { pub fn report_peer(&self, peer_id: PeerId, score_diff: i32) { let _ = self.tx.unbounded_send(Action::ReportPeer(peer_id, score_diff)); } + + /// Modify a priority group. + pub fn set_priority_group(&self, group_id: String, peers: HashSet) { + let _ = self.tx.unbounded_send(Action::SetPriorityGroup(group_id, peers)); + } + + /// Add a peer to a priority group. + pub fn add_to_priority_group(&self, group_id: String, peer_id: PeerId) { + let _ = self.tx.unbounded_send(Action::AddToPriorityGroup(group_id, peer_id)); + } + + /// Remove a peer from a priority group. + pub fn remove_from_priority_group(&self, group_id: String, peer_id: PeerId) { + let _ = self.tx.unbounded_send(Action::RemoveFromPriorityGroup(group_id, peer_id)); + } } /// Message that can be sent by the peer set manager (PSM). @@ -161,14 +181,7 @@ impl Peerset { latest_time_update: Instant::now(), }; - for peer_id in config.reserved_nodes { - 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); - } - } - + peerset.data.set_priority_group(RESERVED_NODES, config.reserved_nodes.into_iter().collect()); for peer_id in config.bootnodes { if let peersstate::Peer::Unknown(entry) = peerset.data.peer(&peer_id) { entry.discover(); @@ -182,32 +195,25 @@ impl Peerset { } fn on_add_reserved_peer(&mut self, peer_id: PeerId) { - 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)); + let mut reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); + reserved.insert(peer_id); + self.data.set_priority_group(RESERVED_NODES, reserved); + self.alloc_slots(); } fn on_remove_reserved_peer(&mut self, peer_id: PeerId) { + let mut reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); + reserved.remove(&peer_id); + self.data.set_priority_group(RESERVED_NODES, reserved); match self.data.peer(&peer_id) { - peersstate::Peer::Connected(mut peer) => { - peer.set_reserved(false); + peersstate::Peer::Connected(peer) => { 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(_) => {} + peersstate::Peer::NotConnected(_) => {}, + peersstate::Peer::Unknown(_) => {}, } } @@ -215,20 +221,35 @@ impl Peerset { // Disconnect non-reserved nodes. self.reserved_only = reserved_only; if self.reserved_only { + let reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); 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() { + if !reserved.contains(&peer_id) { peer.disconnect(); self.message_queue.push_back(Message::Drop(peer_id)); } } - } else { self.alloc_slots(); } } + fn on_set_priority_group(&mut self, group_id: &str, peers: HashSet) { + self.data.set_priority_group(group_id, peers); + self.alloc_slots(); + } + + fn on_add_to_priority_group(&mut self, group_id: &str, peer_id: PeerId) { + self.data.add_to_priority_group(group_id, peer_id); + self.alloc_slots(); + } + + fn on_remove_from_priority_group(&mut self, group_id: &str, peer_id: PeerId) { + self.data.remove_from_priority_group(group_id, &peer_id); + self.alloc_slots(); + } + fn on_report_peer(&mut self, peer_id: PeerId, score_diff: i32) { // We want reputations to be up-to-date before adjusting them. self.update_time(); @@ -292,7 +313,13 @@ impl Peerset { self.update_time(); // Try to grab the next node to attempt to connect to. - while let Some(next) = self.data.reserved_not_connected_peer() { + while let Some(next) = { + if self.reserved_only { + self.data.priority_not_connected_peer_from_group(RESERVED_NODES) + } else { + self.data.priority_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. @@ -421,6 +448,11 @@ impl Peerset { "message_queue": self.message_queue.len(), }) } + + /// Returns priority group by id. + pub fn get_priority_group(&self, group_id: &str) -> Option> { + self.data.get_priority_group(group_id) + } } impl Stream for Peerset { @@ -439,6 +471,9 @@ impl Stream for Peerset { Action::RemoveReservedPeer(peer_id) => self.on_remove_reserved_peer(peer_id), Action::SetReservedOnly(reserved) => self.on_set_reserved_only(reserved), Action::ReportPeer(peer_id, score_diff) => self.on_report_peer(peer_id, score_diff), + Action::SetPriorityGroup(group_id, peers) => self.on_set_priority_group(&group_id, peers), + Action::AddToPriorityGroup(group_id, peer_id) => self.on_add_to_priority_group(&group_id, peer_id), + Action::RemoveFromPriorityGroup(group_id, peer_id) => self.on_remove_from_priority_group(&group_id, peer_id), } } } @@ -590,3 +625,4 @@ mod tests { 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 index a6a375b369..e02d630404 100644 --- a/core/peerset/src/peersstate.rs +++ b/core/peerset/src/peersstate.rs @@ -17,7 +17,8 @@ //! Contains the state storage behind the peerset. use libp2p::PeerId; -use std::{borrow::Cow, collections::HashMap}; +use std::{borrow::Cow, collections::{HashSet, HashMap}}; +use log::warn; /// State storage behind the peerset. /// @@ -35,17 +36,20 @@ pub struct PeersState { /// sort, to make the logic easier. nodes: HashMap, - /// Number of non-reserved nodes for which the `ConnectionState` is `In`. + /// Number of non-priority nodes for which the `ConnectionState` is `In`. num_in: u32, - /// Number of non-reserved nodes for which the `ConnectionState` is `In`. + /// Number of non-priority nodes for which the `ConnectionState` is `In`. num_out: u32, - /// Maximum allowed number of non-reserved nodes for which the `ConnectionState` is `In`. + /// Maximum allowed number of non-priority nodes for which the `ConnectionState` is `In`. max_in: u32, - /// Maximum allowed number of non-reserved nodes for which the `ConnectionState` is `Out`. + /// Maximum allowed number of non-priority nodes for which the `ConnectionState` is `Out`. max_out: u32, + + /// Priority groups. Each group is identified by a string ID and contains a set of peer IDs. + priority_nodes: HashMap>, } /// State of a single node that we know about. @@ -54,14 +58,20 @@ 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, } +impl Default for Node { + fn default() -> Node { + Node { + connection_state: ConnectionState::NotConnected, + reputation: 0, + } + } +} + /// Whether we are connected to a node. #[derive(Debug, Copy, Clone, PartialEq, Eq)] enum ConnectionState { @@ -93,42 +103,30 @@ impl PeersState { num_out: 0, max_in: in_peers, max_out: out_peers, + priority_nodes: HashMap::new(), } } /// 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 { + match self.nodes.get_mut(peer_id) { + None => 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, - }) + }), + Some(peer) => { + if peer.connection_state.is_connected() { + Peer::Connected(ConnectedPeer { + state: self, + peer_id: Cow::Borrowed(peer_id), + }) + } else { + Peer::NotConnected(NotConnectedPeer { + state: self, + peer_id: Cow::Borrowed(peer_id), + }) + } + } } } @@ -148,28 +146,32 @@ impl PeersState { .map(|(p, _)| p) } - /// Returns the first reserved peer that we are not connected to. + /// Returns the first priority 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 - } + /// If multiple nodes are prioritized, which one is returned is unspecified. + pub fn priority_not_connected_peer(&mut self) -> Option { + let id = self.priority_nodes.values() + .flatten() + .find(|id| self.nodes.get(id).map_or(false, |node| !node.connection_state.is_connected())) + .cloned(); + id.map(move |id| NotConnectedPeer { + state: self, + peer_id: Cow::Owned(id), + }) + } + + /// Returns the first priority peer that we are not connected to. + /// + /// If multiple nodes are prioritized, which one is returned is unspecified. + pub fn priority_not_connected_peer_from_group(&mut self, group_id: &str) -> Option { + let id = self.priority_nodes.get(group_id) + .and_then(|group| group.iter() + .find(|id| self.nodes.get(id).map_or(false, |node| !node.connection_state.is_connected())) + .cloned()); + id.map(move |id| NotConnectedPeer { + state: self, + peer_id: Cow::Owned(id), + }) } /// Returns the peer with the highest reputation and that we are not connected to. @@ -187,21 +189,160 @@ impl PeersState { } Some(to_try) }) - .map(|(peer_id, state)| (peer_id.clone(), state)); + .map(|(peer_id, _)| peer_id.clone()); - if let Some((peer_id, state)) = outcome { + if let Some(peer_id) = outcome { Some(NotConnectedPeer { - state, + state: self, 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 } } + + fn disconnect(&mut self, peer_id: &PeerId) { + let is_priority = self.is_priority(peer_id); + if let Some(mut node) = self.nodes.get_mut(peer_id) { + if !is_priority { + match node.connection_state { + ConnectionState::In => self.num_in -= 1, + ConnectionState::Out => self.num_out -= 1, + ConnectionState::NotConnected => + debug_assert!(false, "State inconsistency: disconnecting a disconnected node") + } + } + node.connection_state = ConnectionState::NotConnected; + } else { + warn!(target: "peerset", "Attempting to disconnect unknown peer {}", peer_id); + } + } + + /// Sets the peer as connected with an outgoing connection. + fn try_outgoing(&mut self, peer_id: &PeerId) -> bool { + // 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. + let is_priority = self.is_priority(peer_id); + if self.num_out >= self.max_out && !is_priority { + return false; + } + + if let Some(mut peer) = self.nodes.get_mut(peer_id) { + peer.connection_state = ConnectionState::Out; + if !is_priority { + self.num_out += 1; + } + return true; + } + false + } + + /// 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. + fn try_accept_incoming(&mut self, peer_id: &PeerId) -> bool { + let is_priority = self.is_priority(peer_id); + // 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 && !is_priority { + return false; + } + if let Some(mut peer) = self.nodes.get_mut(peer_id) { + peer.connection_state = ConnectionState::In; + if !is_priority { + self.num_in += 1; + } + return true; + } + false + } + + /// Sets priority group + pub fn set_priority_group(&mut self, group_id: &str, peers: HashSet) { + // update slot counters + let all_other_groups: HashSet<_> = self.priority_nodes + .iter() + .filter(|(g, _)| *g != group_id) + .flat_map(|(_, id)| id.clone()) + .collect(); + let existing_group = self.priority_nodes.remove(group_id).unwrap_or_default(); + for id in existing_group { + // update slots for nodes that are no longer priority + if !all_other_groups.contains(&id) { + if let Some(peer) = self.nodes.get_mut(&id) { + match peer.connection_state { + ConnectionState::In => self.num_in += 1, + ConnectionState::Out => self.num_out += 1, + ConnectionState::NotConnected => {}, + } + } + } + } + + for id in &peers { + // update slots for nodes that become priority + if !all_other_groups.contains(&id) { + let peer = self.nodes.entry(id.clone()).or_default(); + match peer.connection_state { + ConnectionState::In => self.num_in -= 1, + ConnectionState::Out => self.num_out -= 1, + ConnectionState::NotConnected => {}, + } + } + } + self.priority_nodes.insert(group_id.into(), peers); + } + + /// Add a peer to a priority group. + pub fn add_to_priority_group(&mut self, group_id: &str, peer_id: PeerId) { + let mut peers = self.priority_nodes.get(group_id).cloned().unwrap_or_default(); + peers.insert(peer_id); + self.set_priority_group(group_id, peers); + } + + /// Remove a peer from a priority group. + pub fn remove_from_priority_group(&mut self, group_id: &str, peer_id: &PeerId) { + let mut peers = self.priority_nodes.get(group_id).cloned().unwrap_or_default(); + peers.remove(&peer_id); + self.set_priority_group(group_id, peers); + } + + /// Get priority group content. + pub fn get_priority_group(&self, group_id: &str) -> Option> { + self.priority_nodes.get(group_id).cloned() + } + + /// Check that node is any priority group. + fn is_priority(&self, peer_id: &PeerId) -> bool { + self.priority_nodes.iter().any(|(_, group)| group.contains(peer_id)) + } + + /// Returns the reputation value of the node. + fn reputation(&self, peer_id: &PeerId) -> i32 { + self.nodes.get(peer_id).map_or(0, |p| p.reputation) + } + + /// Sets the reputation of the peer. + fn set_reputation(&mut self, peer_id: &PeerId, value: i32) { + let node = self.nodes + .entry(peer_id.clone()) + .or_default(); + node.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. + fn add_reputation(&mut self, peer_id: &PeerId, modifier: i32) { + let node = self.nodes + .entry(peer_id.clone()) + .or_default(); + node.reputation = node.reputation.saturating_add(modifier); + } } /// Grants access to the state of a peer in the `PeersState`. @@ -250,12 +391,8 @@ impl<'a> Peer<'a> { /// A peer that is connected to us. pub struct ConnectedPeer<'a> { - state: &'a mut Node, + state: &'a mut PeersState, 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> { @@ -266,87 +403,36 @@ impl<'a> ConnectedPeer<'a> { /// 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; - + self.state.disconnect(&self.peer_id); 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 + self.state.reputation(&self.peer_id) } /// Sets the reputation of the peer. pub fn set_reputation(&mut self, value: i32) { - self.state.reputation = value; + self.state.set_reputation(&self.peer_id, 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); + self.state.add_reputation(&self.peer_id, modifier) } } /// A peer that is not connected to us. +#[derive(Debug)] pub struct NotConnectedPeer<'a> { - state: &'a mut Node, + state: &'a mut PeersState, 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> { @@ -360,41 +446,16 @@ impl<'a> NotConnectedPeer<'a> { /// /// 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. + /// Note that priority 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, + if self.state.try_outgoing(&self.peer_id) { + Ok(ConnectedPeer { + state: self.state, + peer_id: self.peer_id, + }) + } else { + Err(self) } } @@ -403,59 +464,26 @@ impl<'a> NotConnectedPeer<'a> { /// 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. + /// Note that priority 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, + if self.state.try_accept_incoming(&self.peer_id) { + Ok(ConnectedPeer { + state: self.state, + peer_id: self.peer_id, + }) + } else { + Err(self) } } - /// 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 + self.state.reputation(&self.peer_id) } /// Sets the reputation of the peer. pub fn set_reputation(&mut self, value: i32) { - self.state.reputation = value; + self.state.set_reputation(&self.peer_id, value) } /// Performs an arithmetic addition on the reputation score of that peer. @@ -463,8 +491,7 @@ impl<'a> NotConnectedPeer<'a> { /// 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); + self.state.add_reputation(&self.peer_id, modifier) } } @@ -477,25 +504,18 @@ pub struct UnknownPeer<'a> { 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 + /// The node 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"); - + let state = self.parent; 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, } } } @@ -521,14 +541,13 @@ mod tests { } #[test] - fn reserved_node_doesnt_use_slot() { + fn priority_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); + peers_state.set_priority_group("test", vec![id1.clone()].into_iter().collect()); + if let Peer::NotConnected(p) = peers_state.peer(&id1) { assert!(p.try_accept_incoming().is_ok()); } else { panic!() } @@ -550,23 +569,22 @@ mod tests { } #[test] - fn reserved_not_connected_peer() { + fn priority_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()); + assert!(peers_state.priority_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()); + assert!(peers_state.priority_not_connected_peer().is_none()); + peers_state.set_priority_group("test", vec![id1.clone()].into_iter().collect()); + assert!(peers_state.priority_not_connected_peer().is_some()); + peers_state.set_priority_group("test", vec![id2.clone(), id2.clone()].into_iter().collect()); + assert!(peers_state.priority_not_connected_peer().is_some()); + peers_state.set_priority_group("test", vec![].into_iter().collect()); + assert!(peers_state.priority_not_connected_peer().is_none()); } #[test] @@ -581,7 +599,7 @@ mod tests { 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(); + peers_state.peer(&id2).into_not_connected().unwrap().try_accept_incoming().unwrap(); 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(); @@ -591,24 +609,31 @@ mod tests { } #[test] - fn disconnect_reserved_doesnt_panic() { + fn disconnect_priority_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); + peers_state.set_priority_group("test", vec![id.clone()].into_iter().collect()); + let peer = peers_state.peer(&id).into_not_connected().unwrap().try_outgoing().unwrap(); peer.disconnect(); } #[test] - fn multiple_set_reserved_calls_doesnt_panic() { + fn multiple_priority_groups_slot_count() { 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(); + + if let Peer::Unknown(p) = peers_state.peer(&id) { + assert!(p.discover().try_accept_incoming().is_ok()); + } else { panic!() } + + assert_eq!(peers_state.num_in, 1); + peers_state.set_priority_group("test1", vec![id.clone()].into_iter().collect()); + assert_eq!(peers_state.num_in, 0); + peers_state.set_priority_group("test2", vec![id.clone()].into_iter().collect()); + assert_eq!(peers_state.num_in, 0); + peers_state.set_priority_group("test1", vec![].into_iter().collect()); + assert_eq!(peers_state.num_in, 0); + peers_state.set_priority_group("test2", vec![].into_iter().collect()); + assert_eq!(peers_state.num_in, 1); } } -- GitLab From 029a778243e79de872e85e01823f6806876febe0 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 3 Jun 2019 16:47:48 +0200 Subject: [PATCH 063/140] Nonlinear locking and cleanups (#2733) * Nonlinear locking and cleanups * Bump runtime version * Minor cleanup * Fix tests * Fix council tests * Fix flaw in turnout counting * fix: lock_voting_should_work_with_delegation test * chore: fix comment refering to unexisting function --- node/cli/src/chain_spec.rs | 16 +- node/executor/src/lib.rs | 4 +- node/runtime/src/lib.rs | 19 +- srml/council/src/lib.rs | 22 +- srml/democracy/src/lib.rs | 964 ++++++++++++++++++++++++------------- srml/support/src/lib.rs | 33 ++ srml/support/src/traits.rs | 37 +- 7 files changed, 688 insertions(+), 407 deletions(-) diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 336636fef8..18238eaa12 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -119,13 +119,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), invulnerables: initial_authorities.iter().map(|x| x.1.clone()).collect(), }), - democracy: Some(DemocracyConfig { - launch_period: 10 * MINUTES, // 1 day per public referendum - voting_period: 10 * MINUTES, // 3 days to discuss & vote on an active referendum - minimum_deposit: 50 * DOLLARS, // 12000 as the minimum deposit for a referendum - public_delay: 10 * MINUTES, - max_lock_periods: 6, - }), + democracy: Some(DemocracyConfig::default()), council_seats: Some(CouncilSeatsConfig { active_council: vec![], candidacy_bond: 10 * DOLLARS, @@ -303,13 +297,7 @@ pub fn testnet_genesis( stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), invulnerables: initial_authorities.iter().map(|x| x.1.clone()).collect(), }), - democracy: Some(DemocracyConfig { - launch_period: 9, - voting_period: 18, - minimum_deposit: 10, - public_delay: 0, - max_lock_periods: 6, - }), + democracy: Some(DemocracyConfig::default()), council_seats: Some(CouncilSeatsConfig { active_council: endowed_accounts.iter() .filter(|&endowed| initial_authorities.iter().find(|&(_, controller, _)| controller == endowed).is_none()) diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 6c4b93b2ad..8813850bbd 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -38,13 +38,13 @@ mod tests { NativeOrEncoded}; use node_primitives::{Hash, BlockNumber, AccountId}; use runtime_primitives::traits::{Header as HeaderT, Hash as HashT, Digest, DigestItem}; - use runtime_primitives::{generic::{self, Era}, ApplyOutcome, ApplyError, ApplyResult, Perbill}; + 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; diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 1e31e5400e..34a8a30524 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -21,7 +21,7 @@ #![recursion_limit="256"] use rstd::prelude::*; -use support::construct_runtime; +use support::{construct_runtime, parameter_types}; use substrate_primitives::u32_trait::{_2, _4}; use node_primitives::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, AuthorityId, Signature, AuthoritySignature @@ -58,7 +58,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 89, + spec_version: 90, impl_version: 90, apis: RUNTIME_API_VERSIONS, }; @@ -150,10 +150,23 @@ impl staking::Trait for Runtime { type Reward = (); } +const MINUTES: BlockNumber = 6; +const BUCKS: Balance = 1_000_000_000_000; + +parameter_types! { + pub const LaunchPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; + pub const VotingPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; + pub const MinimumDeposit: Balance = 100 * BUCKS; + pub const EnactmentPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; +} impl democracy::Trait for Runtime { - type Currency = Balances; type Proposal = Call; type Event = Event; + type Currency = Balances; + type EnactmentPeriod = EnactmentPeriod; + type LaunchPeriod = LaunchPeriod; + type VotingPeriod = VotingPeriod; + type MinimumDeposit = MinimumDeposit; } impl council::Trait for Runtime { diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index a13eb7e280..ac5396e4da 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -29,7 +29,7 @@ mod tests { // These re-exports are here for a reason, edit with care pub use super::*; pub use runtime_io::with_externalities; - use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch}; + use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch, parameter_types}; pub use substrate_primitives::H256; pub use primitives::BuildStorage; pub use primitives::traits::{BlakeTwo256, IdentityLookup}; @@ -81,10 +81,20 @@ mod tests { type TransferPayment = (); type DustRemoval = (); } + parameter_types! { + pub const LaunchPeriod: u64 = 1; + pub const VotingPeriod: u64 = 3; + pub const MinimumDeposit: u64 = 1; + pub const EnactmentPeriod: u64 = 0; + } impl democracy::Trait for Test { - type Currency = balances::Module; type Proposal = Call; type Event = Event; + type Currency = balances::Module; + type EnactmentPeriod = EnactmentPeriod; + type LaunchPeriod = LaunchPeriod; + type VotingPeriod = VotingPeriod; + type MinimumDeposit = MinimumDeposit; } impl seats::Trait for Test { type Event = Event; @@ -111,13 +121,7 @@ mod tests { creation_fee: 0, vesting: vec![], }.build_storage().unwrap().0); - t.extend(democracy::GenesisConfig::{ - launch_period: 1, - voting_period: 3, - minimum_deposit: 1, - public_delay: 0, - max_lock_periods: 6, - }.build_storage().unwrap().0); + t.extend(democracy::GenesisConfig::::default().build_storage().unwrap().0); t.extend(seats::GenesisConfig:: { candidacy_bond: 9, voter_bond: 3, diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index c2a9b849f6..1846f3462d 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -19,13 +19,17 @@ #![cfg_attr(not(feature = "std"), no_std)] use rstd::prelude::*; -use rstd::result; -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}; -use srml_support::traits::{Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, - OnFreeBalanceZero}; +use rstd::{result, convert::TryFrom}; +use primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv}; +use parity_codec::{Encode, Decode, Input, Output}; +use srml_support::{ + decl_module, decl_storage, decl_event, ensure, + StorageValue, StorageMap, Parameter, Dispatchable, IsSubType, EnumerableStorageMap, + traits::{ + Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, + OnFreeBalanceZero, Get + } +}; use srml_support::dispatch::Result; use system::ensure_signed; @@ -36,50 +40,235 @@ const DEMOCRACY_ID: LockIdentifier = *b"democrac"; /// A proposal index. pub type PropIndex = u32; + /// A referendum index. pub type ReferendumIndex = u32; -/// A number of lock periods. -pub type LockPeriods = i8; -const MAX_RECURSION_LIMIT: u32 = 16; - -/// A number of lock periods, plus a vote, one way or the other. -#[derive(Encode, Decode, Copy, Clone, Eq, PartialEq, Default)] +/// A value denoting the strength of conviction of a vote. +#[derive(Encode, Decode, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct Vote(i8); +pub enum Conviction { + /// 0.1x votes, unlocked. + None, + /// 1x votes, locked for an enactment period following a successful vote. + Locked1x, + /// 2x votes, locked for 2x enactment periods following a successful vote. + Locked2x, + /// 3x votes, locked for 4x... + Locked3x, + /// 4x votes, locked for 8x... + Locked4x, + /// 5x votes, locked for 16x... + Locked5x, +} -impl Vote { - /// Create a new instance. - pub fn new(aye: bool, multiplier: LockPeriods) -> Self { - let m = multiplier.max(1) - 1; - Vote(if aye { - -1 - m - } else { - m +impl Default for Conviction { + fn default() -> Self { + Conviction::None + } +} + +impl From for u8 { + fn from(c: Conviction) -> u8 { + match c { + Conviction::None => 0, + Conviction::Locked1x => 1, + Conviction::Locked2x => 2, + Conviction::Locked3x => 3, + Conviction::Locked4x => 4, + Conviction::Locked5x => 5, + } + } +} + +impl TryFrom for Conviction { + type Error = (); + fn try_from(i: u8) -> result::Result { + Ok(match i { + 0 => Conviction::None, + 1 => Conviction::Locked1x, + 2 => Conviction::Locked2x, + 3 => Conviction::Locked3x, + 4 => Conviction::Locked4x, + 5 => Conviction::Locked5x, + _ => return Err(()), }) } +} - /// Is this an aye vote? - pub fn is_aye(self) -> bool { - self.0 < 0 +impl Conviction { + /// The amount of time (in number of periods) that our conviction implies a successful voter's + /// balance should be locked for. + fn lock_periods(self) -> u32 { + match self { + Conviction::None => 0, + Conviction::Locked1x => 1, + Conviction::Locked2x => 2, + Conviction::Locked3x => 4, + Conviction::Locked4x => 8, + Conviction::Locked5x => 16, + } } - /// The strength (measured in lock periods). - pub fn multiplier(self) -> LockPeriods { - 1 + if self.0 < 0 { -(self.0 + 1) } else { self.0 } + /// The votes of a voter of the given `balance` with our conviction. + fn votes< + B: From + Zero + Copy + CheckedMul + CheckedDiv + Bounded + >(self, balance: B) -> (B, B) { + match self { + Conviction::None => { + let r = balance.checked_div(&10u8.into()).unwrap_or_else(Zero::zero); + (r, r) + } + x => ( + balance.checked_mul(&u8::from(x).into()).unwrap_or_else(B::max_value), + balance, + ) + } + } +} + +impl Bounded for Conviction { + fn min_value() -> Self { + Conviction::None + } + + fn max_value() -> Self { + Conviction::Locked5x + } +} + +const MAX_RECURSION_LIMIT: u32 = 16; + +/// A number of lock periods, plus a vote, one way or the other. +#[derive(Copy, Clone, Eq, PartialEq, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Vote { + pub aye: bool, + pub conviction: Conviction, +} + +impl Encode for Vote { + fn encode_to(&self, output: &mut T) { + output.push_byte(u8::from(self.conviction) | if self.aye { 0b1000_0000 } else { 0 }); + } +} + +impl Decode for Vote { + fn decode(input: &mut I) -> Option { + let b = input.read_byte()?; + Some(Vote { + aye: (b & 0b1000_0000) == 0b1000_0000, + conviction: Conviction::try_from(b & 0b0111_1111).ok()?, + }) } } type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; pub trait Trait: system::Trait + Sized { - type Currency: ReservableCurrency + LockableCurrency; - type Proposal: Parameter + Dispatchable + IsSubType>; - type Event: From> + Into<::Event>; + + /// Currency type for this module. + type Currency: ReservableCurrency + + LockableCurrency; + + /// The minimum period of locking and the period between a proposal being approved and enacted. + /// + /// It should generally be a little more than the unstake period to ensure that + /// voting stakers have an opportunity to remove themselves from the system in the case where + /// they are on the losing side of a vote. + type EnactmentPeriod: Get; + + /// How often (in blocks) new public referenda are launched. + type LaunchPeriod: Get; + + /// How often (in blocks) to check for new votes. + type VotingPeriod: Get; + + /// The minimum amount to be used as a deposit for a public referendum proposal. + type MinimumDeposit: Get>; +} + +/// Info regarding an ongoing referendum. +#[derive(Encode, Decode, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct ReferendumInfo { + /// When voting on this referendum will end. + end: BlockNumber, + /// The proposal being voted on. + proposal: Proposal, + /// The thresholding mechanism to determine whether it passed. + threshold: VoteThreshold, + /// The delay (in blocks) to wait after a successful referendum before deploying. + delay: BlockNumber, +} + +impl ReferendumInfo { + /// Create a new instance. + pub fn new( + end: BlockNumber, + proposal: Proposal, + threshold: VoteThreshold, + delay: BlockNumber + ) -> Self { + ReferendumInfo { end, proposal, threshold, delay } + } +} + +decl_storage! { + trait Store for Module as Democracy { + + /// The number of (public) proposals that have been made so far. + pub PublicPropCount get(public_prop_count) build(|_| 0 as PropIndex) : PropIndex; + /// The public proposals. Unsorted. + pub PublicProps get(public_props): Vec<(PropIndex, T::Proposal, T::AccountId)>; + /// Those who have locked a deposit. + pub DepositOf get(deposit_of): map PropIndex => Option<(BalanceOf, Vec)>; + + /// 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; + /// Information concerning any given referendum. + pub ReferendumInfoOf get(referendum_info): + map ReferendumIndex => Option<(ReferendumInfo)>; + /// Queue of successful referenda to be dispatched. + pub DispatchQueue get(dispatch_queue): + map T::BlockNumber => Vec>; + + /// Get the voters for the current proposal. + pub VotersFor get(voters_for): map ReferendumIndex => Vec; + + /// Get the vote in a given referendum of a particular voter. The result is meaningful only + /// if `voters_for` includes the voter when called with the referendum (you'll get the + /// default `Vote` value otherwise). If you don't want to check `voters_for`, then you can + /// also check for simple existence with `VoteOf::exists` first. + pub VoteOf get(vote_of): map (ReferendumIndex, T::AccountId) => Vote; + + /// Who is able to vote for whom. Value is the fund-holding account, key is the + /// vote-transaction-sending account. + pub Proxy get(proxy): map T::AccountId => Option; + + /// Get the account (and lock periods) to which another account is delegating vote. + pub Delegations get(delegations): linked_map T::AccountId => (T::AccountId, Conviction); + } } +decl_event!( + pub enum Event where Balance = BalanceOf, ::AccountId { + Proposed(PropIndex, Balance), + Tabled(PropIndex, Balance, Vec), + Started(ReferendumIndex, VoteThreshold), + Passed(ReferendumIndex), + NotPassed(ReferendumIndex), + Cancelled(ReferendumIndex), + Executed(ReferendumIndex, bool), + Delegated(AccountId, AccountId), + Undelegated(AccountId), + } +); + decl_module! { pub struct Module for enum Call where origin: T::Origin { fn deposit_event() = default; @@ -92,7 +281,7 @@ decl_module! { ) { let who = ensure_signed(origin)?; - ensure!(value >= Self::minimum_deposit(), "value too low"); + ensure!(value >= T::MinimumDeposit::get(), "value too low"); T::Currency::reserve(&who, value) .map_err(|_| "proposer's balance too low")?; @@ -118,24 +307,34 @@ decl_module! { >::insert(proposal, deposit); } - /// Vote in a referendum. If `vote.is_aye()`, the vote is to enact the proposal; + /// Vote in a referendum. If vote is aye, the vote is to enact the proposal; /// otherwise it is a vote to keep the status quo. - fn vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote) -> Result { + fn vote(origin, + #[compact] ref_index: ReferendumIndex, + vote: Vote + ) -> Result { let who = ensure_signed(origin)?; Self::do_vote(who, ref_index, vote) } - /// Vote in a referendum on behalf of a stash. If `vote.is_aye()`, the vote is to enact the proposal; - /// otherwise it is a vote to keep the status quo. - fn proxy_vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote) -> Result { + /// Vote in a referendum on behalf of a stash. If vote is aye, the vote is to enact + /// the proposal; otherwise it is a vote to keep the status quo. + fn proxy_vote(origin, + #[compact] ref_index: ReferendumIndex, + vote: Vote + ) -> Result { let who = Self::proxy(ensure_signed(origin)?).ok_or("not a proxy")?; Self::do_vote(who, ref_index, vote) } /// Start a referendum. - fn start_referendum(proposal: Box, threshold: VoteThreshold, delay: T::BlockNumber) -> Result { + fn start_referendum( + proposal: Box, + threshold: VoteThreshold, + delay: T::BlockNumber + ) -> Result { Self::inject_referendum( - >::block_number() + Self::voting_period(), + >::block_number() + T::VotingPeriod::get(), *proposal, threshold, delay, @@ -150,7 +349,10 @@ decl_module! { /// Cancel a proposal queued for enactment. pub fn cancel_queued(#[compact] when: T::BlockNumber, #[compact] which: u32) { let which = which as usize; - >::mutate(when, |items| if items.len() > which { items[which] = None }); + >::mutate( + when, + |items| if items.len() > which { items[which] = None } + ); } fn on_finalize(n: T::BlockNumber) { @@ -180,11 +382,17 @@ decl_module! { } /// Delegate vote. - pub fn delegate(origin, to: T::AccountId, lock_periods: LockPeriods) { + pub fn delegate(origin, to: T::AccountId, conviction: Conviction) { let who = ensure_signed(origin)?; - >::insert(who.clone(), (to.clone(), lock_periods.clone())); + >::insert(who.clone(), (to.clone(), conviction)); // Currency is locked indefinitely as long as it's delegated. - T::Currency::extend_lock(DEMOCRACY_ID, &who, Bounded::max_value(), T::BlockNumber::max_value(), WithdrawReason::Transfer.into()); + T::Currency::extend_lock( + DEMOCRACY_ID, + &who, + Bounded::max_value(), + T::BlockNumber::max_value(), + WithdrawReason::Transfer.into() + ); Self::deposit_event(RawEvent::Delegated(who, to)); } @@ -192,98 +400,22 @@ decl_module! { fn undelegate(origin) { let who = ensure_signed(origin)?; ensure!(>::exists(&who), "not delegated"); - let d = >::take(&who); + let (_, conviction) = >::take(&who); // 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 * (d.1 as u32).into(); - T::Currency::set_lock(DEMOCRACY_ID, &who, Bounded::max_value(), locked_until, WithdrawReason::Transfer.into()); + let locked_until = now + T::EnactmentPeriod::get() * conviction.lock_periods().into(); + T::Currency::set_lock( + DEMOCRACY_ID, + &who, + Bounded::max_value(), + locked_until, + WithdrawReason::Transfer.into() + ); Self::deposit_event(RawEvent::Undelegated(who)); } } } -/// Info regarding an ongoing referendum. -#[derive(Encode, Decode, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct ReferendumInfo { - /// When voting on this referendum will end. - end: BlockNumber, - /// The proposal being voted on. - proposal: Proposal, - /// The thresholding mechanism to determine whether it passed. - threshold: VoteThreshold, - /// The delay (in blocks) to wait after a successful referendum before deploying. - delay: BlockNumber, -} - -impl ReferendumInfo { - /// Create a new instance. - pub fn new(end: BlockNumber, proposal: Proposal, threshold: VoteThreshold, delay: BlockNumber) -> Self { - ReferendumInfo { end, proposal, threshold, delay } - } -} - -decl_storage! { - trait Store for Module as Democracy { - - /// The number of (public) proposals that have been made so far. - pub PublicPropCount get(public_prop_count) build(|_| 0 as PropIndex) : PropIndex; - /// The public proposals. Unsorted. - pub PublicProps get(public_props): Vec<(PropIndex, T::Proposal, T::AccountId)>; - /// 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 = 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. - pub PublicDelay get(public_delay) config(): T::BlockNumber; - /// The maximum number of additional lock periods a voter may offer to strengthen their vote. Multiples of `PublicDelay`. - 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 = 1000.into(); - - /// 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; - /// Information concerning any given referendum. - pub ReferendumInfoOf get(referendum_info): map ReferendumIndex => Option<(ReferendumInfo)>; - /// Queue of successful referenda to be dispatched. - pub DispatchQueue get(dispatch_queue): map T::BlockNumber => Vec>; - - /// Get the voters for the current proposal. - pub VotersFor get(voters_for): map ReferendumIndex => Vec; - - /// Get the vote in a given referendum of a particular voter. The result is meaningful only if `voters_for` includes the - /// voter when called with the referendum (you'll get the default `Vote` value otherwise). If you don't want to check - /// `voters_for`, then you can also check for simple existence with `VoteOf::exists` first. - pub VoteOf get(vote_of): map (ReferendumIndex, T::AccountId) => Vote; - - /// Who is able to vote for whom. Value is the fund-holding account, key is the vote-transaction-sending account. - pub Proxy get(proxy): map T::AccountId => Option; - - /// Get the account (and lock periods) to which another account is delegating vote. - pub Delegations get(delegations): linked_map T::AccountId => (T::AccountId, LockPeriods); - } -} - -decl_event!( - pub enum Event where Balance = BalanceOf, ::AccountId { - Proposed(PropIndex, Balance), - Tabled(PropIndex, Balance, Vec), - Started(ReferendumIndex, VoteThreshold), - Passed(ReferendumIndex), - NotPassed(ReferendumIndex), - Cancelled(ReferendumIndex), - Executed(ReferendumIndex, bool), - Delegated(AccountId, AccountId), - Undelegated(AccountId), - } -); - impl Module { // exposed immutables. @@ -299,7 +431,9 @@ impl Module { } /// Get all referenda currently active. - pub fn active_referenda() -> Vec<(ReferendumIndex, ReferendumInfo)> { + pub fn active_referenda() + -> Vec<(ReferendumIndex, ReferendumInfo)> + { let next = Self::next_tally(); let last = Self::referendum_count(); (next..last).into_iter() @@ -308,7 +442,9 @@ impl Module { } /// Get all referenda ready for tally at block `n`. - pub fn maturing_referenda_at(n: T::BlockNumber) -> Vec<(ReferendumIndex, ReferendumInfo)> { + 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() @@ -319,52 +455,75 @@ impl Module { /// Get the voters for the current proposal. pub fn tally(ref_index: ReferendumIndex) -> (BalanceOf, BalanceOf, BalanceOf) { - let (approve, against, capital): (BalanceOf, BalanceOf, BalanceOf) = Self::voters_for(ref_index).iter() - .map(|voter| ( - T::Currency::total_balance(voter), Self::vote_of((ref_index, voter.clone())) - )) - .map(|(bal, vote)| - if vote.is_aye() { - (bal * (vote.multiplier() as u32).into(), Zero::zero(), bal) - } else { - (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 (approve, against, capital): + (BalanceOf, BalanceOf, BalanceOf) = Self::voters_for(ref_index) + .iter() + .map(|voter| ( + T::Currency::total_balance(voter), Self::vote_of((ref_index, voter.clone())) + )) + .map(|(balance, Vote { aye, conviction })| { + let (votes, turnout) = conviction.votes(balance); + if aye { + (votes, Zero::zero(), turnout) + } else { + (Zero::zero(), votes, turnout) + } + }).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); (approve + del_approve, against + del_against, capital + del_capital) } /// Get the delegated voters for the current proposal. - /// I think this goes into a worker once https://github.com/paritytech/substrate/issues/1458 is done. + /// I think this goes into a worker once https://github.com/paritytech/substrate/issues/1458 is + /// done. fn tally_delegation(ref_index: ReferendumIndex) -> (BalanceOf, BalanceOf, BalanceOf) { - Self::voters_for(ref_index).iter() - .fold((Zero::zero(), Zero::zero(), Zero::zero()), |(approve_acc, against_acc, capital_acc), voter| { - let vote = Self::vote_of((ref_index, voter.clone())); - let (votes, balance) = Self::delegated_votes(ref_index, voter.clone(), vote.multiplier(), MAX_RECURSION_LIMIT); - if vote.is_aye() { - (approve_acc + votes, against_acc, capital_acc + balance) + Self::voters_for(ref_index).iter().fold( + (Zero::zero(), Zero::zero(), Zero::zero()), + |(approve_acc, against_acc, turnout_acc), voter| { + let Vote { aye, conviction } = Self::vote_of((ref_index, voter.clone())); + let (votes, turnout) = Self::delegated_votes( + ref_index, + voter.clone(), + conviction, + MAX_RECURSION_LIMIT + ); + if aye { + (approve_acc + votes, against_acc, turnout_acc + turnout) } else { - (approve_acc, against_acc + votes, capital_acc + balance) + (approve_acc, against_acc + votes, turnout_acc + turnout) } - }) + } + ) } fn delegated_votes( ref_index: ReferendumIndex, to: T::AccountId, - min_lock_periods: LockPeriods, + parent_conviction: Conviction, recursion_limit: u32, ) -> (BalanceOf, BalanceOf) { if recursion_limit == 0 { return (Zero::zero(), Zero::zero()); } >::enumerate() - .filter(|(delegator, (delegate, _))| *delegate == to && !>::exists(&(ref_index, delegator.clone()))) - .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) * (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) - }) + .filter(|(delegator, (delegate, _))| + *delegate == to && !>::exists(&(ref_index, delegator.clone())) + ).fold( + (Zero::zero(), Zero::zero()), + |(votes_acc, turnout_acc), (delegator, (_delegate, max_conviction))| { + let conviction = Conviction::min(parent_conviction, max_conviction); + let balance = T::Currency::total_balance(&delegator); + let (votes, turnout) = conviction.votes(balance); + let (del_votes, del_turnout) = Self::delegated_votes( + ref_index, + delegator, + conviction, + recursion_limit - 1 + ); + (votes_acc + votes + del_votes, turnout_acc + turnout + del_turnout) + } + ) } // Exposed mutables. @@ -375,8 +534,17 @@ impl Module { } /// Start a referendum. Can be called directly by the council. - pub fn internal_start_referendum(proposal: T::Proposal, threshold: VoteThreshold, delay: T::BlockNumber) -> result::Result { - >::inject_referendum(>::block_number() + >::voting_period(), proposal, threshold, delay) + pub fn internal_start_referendum( + proposal: T::Proposal, + threshold: VoteThreshold, + delay: T::BlockNumber + ) -> result::Result { + >::inject_referendum( + >::block_number() + T::VotingPeriod::get(), + proposal, + threshold, + delay + ) } /// Remove a referendum. Can be called directly by the council. @@ -389,7 +557,6 @@ impl Module { /// Actually enact a vote, if legit. fn do_vote(who: T::AccountId, ref_index: ReferendumIndex, vote: Vote) -> Result { - ensure!(vote.multiplier() <= Self::max_lock_periods(), "vote has too great a strength"); ensure!(Self::is_active_referendum(ref_index), "vote given for invalid referendum."); if !>::exists(&(ref_index, who.clone())) { >::mutate(ref_index, |voters| voters.push(who.clone())); @@ -406,12 +573,17 @@ impl Module { delay: T::BlockNumber, ) -> result::Result { let ref_index = Self::referendum_count(); - if ref_index > 0 && Self::referendum_info(ref_index - 1).map(|i| i.end > end).unwrap_or(false) { + if ref_index.checked_sub(1) + .and_then(Self::referendum_info) + .map(|i| i.end > end) + .unwrap_or(false) + { Err("Cannot inject a referendum that ends earlier than preceeding referendum")? } >::put(ref_index + 1); - >::insert(ref_index, ReferendumInfo { end, proposal, threshold, delay }); + let item = ReferendumInfo { end, proposal, threshold, delay }; + >::insert(ref_index, item); Self::deposit_event(RawEvent::Started(ref_index, threshold)); Ok(ref_index) } @@ -435,43 +607,59 @@ impl Module { let mut public_props = Self::public_props(); if let Some((winner_index, _)) = public_props.iter() .enumerate() - .max_by_key(|x| Self::locked_for((x.1).0).unwrap_or_else(Zero::zero)/*defensive only: All current public proposals have an amount locked*/) + .max_by_key(|x| Self::locked_for((x.1).0).unwrap_or_else(Zero::zero) + /* ^^ defensive only: All current public proposals have an amount locked*/) { let (prop_index, proposal, _) = public_props.swap_remove(winner_index); >::put(public_props); - if let Some((deposit, depositors)) = >::take(prop_index) {//: (BalanceOf, Vec) = + if let Some((deposit, depositors)) = >::take(prop_index) { // refund depositors for d in &depositors { T::Currency::unreserve(d, deposit); } Self::deposit_event(RawEvent::Tabled(prop_index, deposit, depositors)); - Self::inject_referendum(now + Self::voting_period(), proposal, VoteThreshold::SuperMajorityApprove, Self::public_delay())?; + Self::inject_referendum( + now + T::VotingPeriod::get(), + proposal, + VoteThreshold::SuperMajorityApprove, + T::EnactmentPeriod::get(), + )?; } } Ok(()) } - fn bake_referendum(now: T::BlockNumber, index: ReferendumIndex, info: ReferendumInfo) -> Result { + fn bake_referendum( + now: T::BlockNumber, + index: ReferendumIndex, + info: ReferendumInfo + ) -> Result { let (approve, against, capital) = Self::tally(index); let total_issuance = T::Currency::total_issuance(); let approved = info.threshold.approved(approve, against, capital, total_issuance); - let lock_period = Self::public_delay(); // Logic defined in https://www.slideshare.net/gavofyork/governance-in-polkadot-poc3 // Essentially, we extend the lock-period of the coins behind the winning votes to be the // vote strength times the public delay period from now. - for (a, vote) in Self::voters_for(index).into_iter() + for (a, Vote { conviction, .. }) in Self::voters_for(index).into_iter() .map(|a| (a.clone(), Self::vote_of((index, a)))) - // ^^^ defensive only: all items come from `voters`; for an item to be in `voters` there must be a vote registered; qed - .filter(|&(_, vote)| vote.is_aye() == approved) // Just the winning coins + // ^^^ defensive only: all items come from `voters`; for an item to be in `voters` + // there must be a vote registered; qed + .filter(|&(_, vote)| vote.aye == approved) // Just the winning coins { - // 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 * (vote.multiplier() as u32).into(); + // now plus: the base lock period multiplied by the number of periods this voter + // offered to lock should they win... + let locked_until = now + T::EnactmentPeriod::get() * conviction.lock_periods().into(); // ...extend their bondage until at least then. - T::Currency::extend_lock(DEMOCRACY_ID, &a, Bounded::max_value(), locked_until, WithdrawReason::Transfer.into()); + T::Currency::extend_lock( + DEMOCRACY_ID, + &a, + Bounded::max_value(), + locked_until, + WithdrawReason::Transfer.into() + ); } Self::clear_referendum(index); @@ -480,7 +668,10 @@ impl Module { if info.delay.is_zero() { Self::enact_proposal(info.proposal, index); } else { - >::mutate(now + info.delay, |q| q.push(Some((info.proposal, index)))); + >::mutate( + now + info.delay, + |q| q.push(Some((info.proposal, index))) + ); } } else { Self::deposit_event(RawEvent::NotPassed(index)); @@ -491,9 +682,10 @@ impl Module { } /// Current era is ending; we should finish up any proposals. + // TODO: move to `initialize_block fn end_block(now: T::BlockNumber) -> Result { // pick out another public referendum if it's time. - if (now % Self::launch_period()).is_zero() { + if (now % T::LaunchPeriod::get()).is_zero() { Self::launch_next(now.clone())?; } @@ -519,15 +711,19 @@ impl OnFreeBalanceZero for Module { mod tests { use super::*; use runtime_io::with_externalities; - use srml_support::{impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok}; + use srml_support::{ + impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok, parameter_types + }; use substrate_primitives::{H256, Blake2Hasher}; use primitives::BuildStorage; - use primitives::traits::{BlakeTwo256, IdentityLookup}; + use primitives::traits::{BlakeTwo256, IdentityLookup, Bounded}; use primitives::testing::{Digest, DigestItem, Header}; use balances::BalanceLock; - const AYE: Vote = Vote(-1); - const NAY: Vote = Vote(0); + const AYE: Vote = Vote{ aye: true, conviction: Conviction::None }; + const NAY: Vote = Vote{ aye: false, conviction: Conviction::None }; + const BIG_AYE: Vote = Vote{ aye: true, conviction: Conviction::Locked1x }; + const BIG_NAY: Vote = Vote{ aye: false, conviction: Conviction::Locked1x }; impl_outer_origin! { pub enum Origin for Test {} @@ -565,17 +761,23 @@ mod tests { type TransferPayment = (); type DustRemoval = (); } + parameter_types! { + pub const LaunchPeriod: u64 = 1; + pub const VotingPeriod: u64 = 1; + pub const MinimumDeposit: u64 = 1; + pub const EnactmentPeriod: u64 = 1; + } impl Trait for Test { - type Currency = balances::Module; type Proposal = Call; type Event = (); + type Currency = balances::Module; + type EnactmentPeriod = EnactmentPeriod; + type LaunchPeriod = LaunchPeriod; + type VotingPeriod = VotingPeriod; + type MinimumDeposit = MinimumDeposit; } fn new_test_ext() -> runtime_io::TestExternalities { - new_test_ext_with_public_delay(0) - } - - fn new_test_ext_with_public_delay(public_delay: u64) -> runtime_io::TestExternalities { let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; t.extend(balances::GenesisConfig::{ transaction_base_fee: 0, @@ -586,13 +788,7 @@ mod tests { creation_fee: 0, vesting: vec![], }.build_storage().unwrap().0); - t.extend(GenesisConfig::{ - launch_period: 1, - voting_period: 1, - minimum_deposit: 1, - public_delay, - max_lock_periods: 6, - }.build_storage().unwrap().0); + t.extend(GenesisConfig::::default().build_storage().unwrap().0); runtime_io::TestExternalities::new(t) } @@ -603,40 +799,9 @@ mod tests { #[test] fn params_should_work() { with_externalities(&mut new_test_ext(), || { - assert_eq!(Democracy::launch_period(), 1); - assert_eq!(Democracy::voting_period(), 1); - assert_eq!(Democracy::minimum_deposit(), 1); assert_eq!(Democracy::referendum_count(), 0); assert_eq!(Balances::free_balance(&42), 0); assert_eq!(Balances::total_issuance(), 210); - assert_eq!(Democracy::public_delay(), 0); - assert_eq!(Democracy::max_lock_periods(), 6); - }); - } - - #[test] - fn vote_should_work() { - assert_eq!(Vote::new(true, 0).multiplier(), 1); - assert_eq!(Vote::new(true, 1).multiplier(), 1); - assert_eq!(Vote::new(true, 2).multiplier(), 2); - assert_eq!(Vote::new(true, 0).is_aye(), true); - assert_eq!(Vote::new(true, 1).is_aye(), true); - assert_eq!(Vote::new(true, 2).is_aye(), true); - assert_eq!(Vote::new(false, 0).multiplier(), 1); - assert_eq!(Vote::new(false, 1).multiplier(), 1); - assert_eq!(Vote::new(false, 2).multiplier(), 2); - assert_eq!(Vote::new(false, 0).is_aye(), false); - assert_eq!(Vote::new(false, 1).is_aye(), false); - assert_eq!(Vote::new(false, 2).is_aye(), false); - } - - #[test] - fn invalid_vote_strength_should_not_work() { - with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_noop!(Democracy::vote(Origin::signed(1), r, Vote::new(true, 7)), "vote has too great a strength"); - assert_noop!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 7)), "vote has too great a strength"); }); } @@ -645,7 +810,15 @@ mod tests { } fn propose_set_balance(who: u64, value: u64, locked: u64) -> super::Result { - Democracy::propose(Origin::signed(who), Box::new(set_balance_proposal(value)), locked.into()) + Democracy::propose( + Origin::signed(who), + Box::new(set_balance_proposal(value)), locked.into() + ) + } + + fn next_block() { + assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + System::set_block_number(System::block_number() + 1); } #[test] @@ -675,9 +848,10 @@ mod tests { assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); } @@ -727,9 +901,10 @@ mod tests { assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); } @@ -741,12 +916,11 @@ mod tests { assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + next_block(); let r = 0; // Delegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); @@ -755,9 +929,10 @@ mod tests { assert_eq!(Democracy::vote_of((r, 1)), AYE); // Delegated vote is counted. - assert_eq!(Democracy::tally(r), (30, 0, 30)); + assert_eq!(Democracy::tally(r), (3, 0, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -770,14 +945,13 @@ mod tests { assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + next_block(); let r = 0; // Check behavior with cycle. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); - assert_ok!(Democracy::delegate(Origin::signed(3), 2, 100)); - assert_ok!(Democracy::delegate(Origin::signed(1), 3, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); + assert_ok!(Democracy::delegate(Origin::signed(3), 2, Conviction::max_value())); + assert_ok!(Democracy::delegate(Origin::signed(1), 3, Conviction::max_value())); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); @@ -785,8 +959,9 @@ mod tests { assert_eq!(Democracy::voters_for(r), vec![1]); // Delegated vote is counted. - assert_eq!(Democracy::tally(r), (60, 0, 60)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert_eq!(Democracy::tally(r), (6, 0, 6)); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -800,8 +975,7 @@ mod tests { assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + next_block(); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); @@ -810,16 +984,17 @@ mod tests { assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); // Delegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1, 2]); assert_eq!(Democracy::vote_of((r, 1)), AYE); // Delegated vote is not counted. - assert_eq!(Democracy::tally(r), (30, 0, 30)); + assert_eq!(Democracy::tally(r), (3, 0, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -833,11 +1008,10 @@ mod tests { assert_ok!(propose_set_balance(1, 2, 1)); // Delegate and undelegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); assert_ok!(Democracy::undelegate(Origin::signed(2))); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + next_block(); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); @@ -846,9 +1020,10 @@ mod tests { assert_eq!(Democracy::vote_of((r, 1)), AYE); // Delegated vote is not counted. - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -862,14 +1037,13 @@ mod tests { assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + next_block(); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); // Delegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); // Vote. assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); @@ -879,9 +1053,10 @@ mod tests { assert_eq!(Democracy::vote_of((r, 1)), AYE); // Delegated vote is not counted. - assert_eq!(Democracy::tally(r), (30, 0, 30)); + assert_eq!(Democracy::tally(r), (3, 0, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -950,21 +1125,12 @@ mod tests { assert_ok!(propose_set_balance(1, 2, 2)); assert_ok!(propose_set_balance(1, 4, 4)); assert_ok!(propose_set_balance(1, 3, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - - System::set_block_number(1); + next_block(); assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - assert_eq!(Balances::free_balance(&42), 4); - - System::set_block_number(2); + next_block(); assert_ok!(Democracy::vote(Origin::signed(1), 1, AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - assert_eq!(Balances::free_balance(&42), 3); - - System::set_block_number(3); + next_block(); assert_ok!(Democracy::vote(Origin::signed(1), 2, AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); }); } @@ -972,14 +1138,20 @@ mod tests { fn simple_passing_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -989,11 +1161,17 @@ mod tests { fn cancel_referendum_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_ok!(Democracy::cancel_referendum(r.into())); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 0); }); @@ -1003,14 +1181,20 @@ mod tests { fn simple_failing_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, NAY)); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), NAY); - assert_eq!(Democracy::tally(r), (0, 10, 10)); + assert_eq!(Democracy::tally(r), (0, 1, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 0); }); @@ -1020,17 +1204,23 @@ mod tests { fn controversial_voting_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - assert_ok!(Democracy::vote(Origin::signed(2), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(3), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(4), r, AYE)); - assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(1), r, BIG_AYE)); + assert_ok!(Democracy::vote(Origin::signed(2), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(3), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(4), r, BIG_AYE)); + assert_ok!(Democracy::vote(Origin::signed(5), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, BIG_AYE)); assert_eq!(Democracy::tally(r), (110, 100, 210)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -1040,7 +1230,12 @@ mod tests { fn delayed_enactment_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 1).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 1 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); assert_ok!(Democracy::vote(Origin::signed(3), r, AYE)); @@ -1048,102 +1243,181 @@ mod tests { assert_ok!(Democracy::vote(Origin::signed(5), r, AYE)); assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); - assert_eq!(Democracy::tally(r), (210, 0, 210)); + assert_eq!(Democracy::tally(r), (21, 0, 21)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); assert_eq!(Balances::free_balance(&42), 0); - System::set_block_number(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); } #[test] - fn lock_voting_should_work() { - with_externalities(&mut new_test_ext_with_public_delay(1), || { + fn controversial_low_turnout_voting_should_work() { + with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 6))); - assert_ok!(Democracy::vote(Origin::signed(2), r, Vote::new(true, 5))); - assert_ok!(Democracy::vote(Origin::signed(3), r, Vote::new(true, 4))); - assert_ok!(Democracy::vote(Origin::signed(4), r, Vote::new(true, 3))); - assert_ok!(Democracy::vote(Origin::signed(5), r, Vote::new(true, 2))); - assert_ok!(Democracy::vote(Origin::signed(6), r, Vote::new(false, 1))); - - assert_eq!(Democracy::tally(r), (440, 120, 210)); - - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(5), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, BIG_AYE)); - assert_eq!(Balances::locks(1), vec![]); - assert_eq!(Balances::locks(2), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 6, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(3), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 5, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(4), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 4, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(5), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 3, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(6), vec![]); + assert_eq!(Democracy::tally(r), (60, 50, 110)); - System::set_block_number(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(&42), 0); }); } #[test] - fn lock_voting_should_work_with_delegation() { - with_externalities(&mut new_test_ext_with_public_delay(1), || { - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 6))); - assert_ok!(Democracy::vote(Origin::signed(2), r, Vote::new(true, 5))); - assert_ok!(Democracy::vote(Origin::signed(3), r, Vote::new(true, 4))); - assert_ok!(Democracy::vote(Origin::signed(4), r, Vote::new(true, 3))); - assert_ok!(Democracy::delegate(Origin::signed(5), 2, 2)); - assert_ok!(Democracy::vote(Origin::signed(6), r, Vote::new(false, 1))); + fn passing_low_turnout_voting_should_work() { + with_externalities(&mut new_test_ext(), || { + assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::total_issuance(), 210); - assert_eq!(Democracy::tally(r), (440, 120, 210)); + System::set_block_number(1); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(4), r, BIG_AYE)); + assert_ok!(Democracy::vote(Origin::signed(5), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, BIG_AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert_eq!(Democracy::tally(r), (100, 50, 150)); - System::set_block_number(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); } #[test] - fn controversial_low_turnout_voting_should_work() { + fn lock_voting_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(1), r, Vote { + aye: false, + conviction: Conviction::Locked5x + })); + assert_ok!(Democracy::vote(Origin::signed(2), r, Vote { + aye: true, + conviction: Conviction::Locked4x + })); + assert_ok!(Democracy::vote(Origin::signed(3), r, Vote { + aye: true, + conviction: Conviction::Locked3x + })); + assert_ok!(Democracy::vote(Origin::signed(4), r, Vote { + aye: true, + conviction: Conviction::Locked2x + })); + assert_ok!(Democracy::vote(Origin::signed(5), r, Vote { + aye: false, + conviction: Conviction::Locked1x + })); + + assert_eq!(Democracy::tally(r), (250, 100, 150)); + + next_block(); - assert_eq!(Democracy::tally(r), (60, 50, 110)); - - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert_eq!(Balances::locks(1), vec![]); + assert_eq!(Balances::locks(2), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 9, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(3), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 5, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(4), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 3, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(5), vec![]); + + next_block(); - assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::free_balance(&42), 2); }); } #[test] - fn passing_low_turnout_voting_should_work() { + fn lock_voting_should_work_with_delegation() { with_externalities(&mut new_test_ext(), || { - assert_eq!(Balances::free_balance(&42), 0); - assert_eq!(Balances::total_issuance(), 210); - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(4), r, AYE)); - assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(1), r, Vote { + aye: false, + conviction: Conviction::Locked5x + })); + assert_ok!(Democracy::vote(Origin::signed(2), r, Vote { + aye: true, + conviction: Conviction::Locked4x + })); + assert_ok!(Democracy::vote(Origin::signed(3), r, Vote { + aye: true, + conviction: Conviction::Locked3x + })); + assert_ok!(Democracy::delegate(Origin::signed(4), 2, Conviction::Locked2x)); + assert_ok!(Democracy::vote(Origin::signed(5), r, Vote { + aye: false, + conviction: Conviction::Locked1x + })); + + assert_eq!(Democracy::tally(r), (250, 100, 150)); + + next_block(); - assert_eq!(Democracy::tally(r), (100, 50, 150)); - - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert_eq!(Balances::locks(1), vec![]); + assert_eq!(Balances::locks(2), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 9, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(3), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 5, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(4), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: u64::max_value(), + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(5), vec![]); + + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index 140b905e78..64256d876d 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -65,6 +65,39 @@ pub use self::dispatch::{Parameter, Dispatchable, Callable, IsSubType}; pub use self::double_map::StorageDoubleMapWithHasher; pub use runtime_io::{print, storage_root}; +/// 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; + $crate::parameter_types!{IMPL $name , $type , $value} + $crate::parameter_types!{ $( $rest )* } + ); + (const $name:ident: $type:ty = $value:expr; $( $rest:tt )*) => ( + struct $name; + $crate::parameter_types!{IMPL $name , $type , $value} + $crate::parameter_types!{ $( $rest )* } + ); + () => (); + (IMPL $name:ident , $type:ty , $value:expr) => { + impl $crate::traits::Get<$type> for $name { fn get() -> $type { $value } } + } +} + #[doc(inline)] pub use srml_support_procedural::decl_storage; diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index dd4398844c..a83af94836 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -14,7 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Traits for SRML +//! Traits for SRML. +//! +//! NOTE: If you're looking for `parameter_types`, it has moved in to the top-level module. use crate::rstd::result; use crate::codec::{Codec, Encode, Decode}; @@ -28,39 +30,6 @@ pub trait Get { 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; - $crate::parameter_types!{IMPL $name , $type , $value} - $crate::parameter_types!{ $( $rest )* } - ); - (const $name:ident: $type:ty = $value:expr; $( $rest:tt )*) => ( - struct $name; - $crate::parameter_types!{IMPL $name , $type , $value} - $crate::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. -- GitLab From 51ee761152c8bcaab3798772c40b3ea98b4a5e79 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 3 Jun 2019 20:26:17 +0200 Subject: [PATCH 064/140] Split specialization context from network context (#2745) * Split specialization context from network context * Line width --- core/network/src/lib.rs | 3 ++- core/network/src/protocol.rs | 15 +++++++++++---- core/network/src/specialization.rs | 25 +++++++++++++++++++++++-- core/network/src/test/mod.rs | 13 +++++++++---- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index e2def15425..5b438135ed 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -46,7 +46,8 @@ pub use service::{ NetworkService, NetworkWorker, FetchFuture, TransactionPool, ManageNetwork, NetworkMsg, SyncProvider, ExHashT, ReportHandle, }; -pub use protocol::{ProtocolStatus, PeerInfo, Context}; +pub use protocol::{ProtocolStatus, PeerInfo}; +pub use specialization::Context; pub use sync::{Status as SyncStatus, SyncState}; pub use network_libp2p::{ identity, multiaddr, diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index baca6f3bf6..e1fa38576a 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -32,7 +32,7 @@ use crate::message::{BlockAttributes, Direction, FromBlock, RequestId}; use crate::message::generic::{Message as GenericMessage, ConsensusMessage}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; use crate::on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; -use crate::specialization::NetworkSpecialization; +use crate::specialization::{NetworkSpecialization, Context as SpecializationContext}; use crate::sync::{ChainSync, Context as SyncContext, Status as SyncStatus, SyncState}; use crate::service::{TransactionPool, ExHashT}; use crate::config::Roles; @@ -281,9 +281,6 @@ pub trait Context { /// Send a consensus message to a peer. fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage); - - /// Send a chain-specific message to a peer. - fn send_chain_specific(&mut self, who: PeerId, message: Vec); } /// Protocol context. @@ -315,6 +312,16 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, GenericMessage::Consensus(consensus) ) } +} + +impl<'a, B: BlockT + 'a, H: ExHashT + 'a> SpecializationContext 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 send_chain_specific(&mut self, who: PeerId, message: Vec) { send_message( diff --git a/core/network/src/specialization.rs b/core/network/src/specialization.rs index 41d6c2edc8..2778146b52 100644 --- a/core/network/src/specialization.rs +++ b/core/network/src/specialization.rs @@ -18,7 +18,6 @@ use crate::PeerId; use runtime_primitives::traits::Block as BlockT; -use crate::protocol::Context; /// A specialization of the substrate network protocol. Handles events and sends messages. pub trait NetworkSpecialization: Send + Sync + 'static { @@ -32,7 +31,12 @@ pub trait NetworkSpecialization: Send + Sync + 'static { fn on_disconnect(&mut self, ctx: &mut Context, who: PeerId); /// Called when a network-specific message arrives. - fn on_message(&mut self, ctx: &mut Context, who: PeerId, message: &mut Option>); + fn on_message( + &mut self, + ctx: &mut Context, + who: PeerId, + message: &mut Option> + ); /// Called on abort. #[deprecated(note = "This method is never called; aborting corresponds to dropping the object")] @@ -46,6 +50,23 @@ pub trait NetworkSpecialization: Send + Sync + 'static { fn on_block_imported(&mut self, _ctx: &mut Context, _hash: B::Hash, _header: &B::Header) { } } +/// Context for a network-specific handler. +pub trait Context { + /// 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); + + /// Send a consensus message to a peer. + #[deprecated(note = "This method shouldn't have been part of the specialization API")] + fn send_consensus(&mut self, _who: PeerId, _consensus: crate::message::generic::ConsensusMessage) {} + + /// Send a chain-specific message to a peer. + fn send_chain_specific(&mut self, who: PeerId, message: Vec); +} + /// 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. diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 6a7a9ccddd..6103a6ecd9 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -50,7 +50,7 @@ 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::{NetworkLink, NetworkMsg, ProtocolMsg, TransactionPool}; -use crate::specialization::NetworkSpecialization; +use crate::specialization::{NetworkSpecialization, Context as SpecializationContext}; use test_client::{self, AccountKeyring}; pub use test_client::runtime::{Block, Extrinsic, Hash, Transfer}; @@ -101,15 +101,20 @@ impl NetworkSpecialization for DummySpecialization { vec![] } - fn on_connect(&mut self, _ctx: &mut Context, _peer_id: PeerId, _status: crate::message::Status) { + fn on_connect( + &mut self, + _ctx: &mut SpecializationContext, + _peer_id: PeerId, + _status: crate::message::Status + ) { } - fn on_disconnect(&mut self, _ctx: &mut Context, _peer_id: PeerId) { + fn on_disconnect(&mut self, _ctx: &mut SpecializationContext, _peer_id: PeerId) { } fn on_message( &mut self, - _ctx: &mut Context, + _ctx: &mut SpecializationContext, _peer_id: PeerId, _message: &mut Option>, ) { -- GitLab From 2a2a6806e339a05c28f177009a66481cca7aea7a Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Tue, 4 Jun 2019 08:48:22 +0200 Subject: [PATCH 065/140] Add support for tuples in `OnNewAccount` hook (#2765) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add support for tuples in `OnNewAccount` hook * Bump impl version * Use `for_each_tuple` with `OnNewAccount` hook * Update `OnFreeBalanceZero` to also use `for_each_tuple` * Fix spelling/typo * Bump spec again * Update srml/support/src/traits.rs Co-Authored-By: Bastian Köcher * Update srml/system/src/lib.rs Co-Authored-By: Bastian Köcher --- node/runtime/src/lib.rs | 2 +- srml/support/src/traits.rs | 28 +++++++++++++++++----------- srml/system/src/lib.rs | 20 +++++++++++++++++--- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 34a8a30524..e892ceda81 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 90, - impl_version: 90, + impl_version: 91, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index a83af94836..599de27c2e 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -24,6 +24,8 @@ use crate::runtime_primitives::traits::{ MaybeSerializeDebug, SimpleArithmetic }; +use super::for_each_tuple; + /// New trait for querying a single fixed value from a type. pub trait Get { /// Return a constant value. @@ -36,20 +38,24 @@ pub trait OnFreeBalanceZero { fn on_free_balance_zero(who: &AccountId); } -impl OnFreeBalanceZero for () { - fn on_free_balance_zero(_who: &AccountId) {} -} -impl< - AccountId, - X: OnFreeBalanceZero, - Y: OnFreeBalanceZero, -> OnFreeBalanceZero for (X, Y) { - fn on_free_balance_zero(who: &AccountId) { - X::on_free_balance_zero(who); - Y::on_free_balance_zero(who); +macro_rules! impl_on_free_balance_zero { + () => ( + impl OnFreeBalanceZero for () { + fn on_free_balance_zero(_: &AccountId) {} + } + ); + + ( $($t:ident)* ) => { + impl),*> OnFreeBalanceZero for ($($t,)*) { + fn on_free_balance_zero(who: &AccountId) { + $($t::on_free_balance_zero(who);)* + } + } } } +for_each_tuple!(impl_on_free_balance_zero); + /// Trait for a hook to get called when some balance has been minted, causing dilution. pub trait OnDilution { /// Some `portion` of the total balance just "grew" by `minted`. `portion` is the pre-growth diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index 7c4a95a30f..5a3094d821 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -85,7 +85,7 @@ use primitives::traits::Zero; use substrate_primitives::storage::well_known_keys; use srml_support::{ storage, decl_module, decl_event, decl_storage, StorageDoubleMap, StorageValue, - StorageMap, Parameter, + StorageMap, Parameter, for_each_tuple, }; use safe_mix::TripletMix; use parity_codec::{Encode, Decode}; @@ -102,10 +102,24 @@ pub trait OnNewAccount { fn on_new_account(who: &AccountId); } -impl OnNewAccount for () { - fn on_new_account(_who: &AccountId) {} +macro_rules! impl_on_new_account { + () => ( + impl OnNewAccount for () { + fn on_new_account(_: &AccountId) {} + } + ); + + ( $($t:ident)* ) => { + impl),*> OnNewAccount for ($($t,)*) { + fn on_new_account(who: &AccountId) { + $($t::on_new_account(who);)* + } + } + } } +for_each_tuple!(impl_on_new_account); + /// Determiner to say whether a given account is unused. pub trait IsDeadAccount { /// Is the given account dead? -- GitLab From d314fa6856d296fbe896ed9809b3adebf31076a7 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Tue, 4 Jun 2019 10:01:12 +0200 Subject: [PATCH 066/140] Pin states in memory so that they are not pruned away while still referenced (#2761) * State pinning in client * Canonicalization queue * Fixed prioritization queue * possible fix of "hash mismatch" * Check for pinned discarded states * Release state before finalization * Style * Style --- core/client/db/src/lib.rs | 117 +++++++++++++-- core/client/db/src/storage_cache.rs | 164 ++++++++++++---------- core/client/src/call_executor.rs | 12 +- core/client/src/cht.rs | 8 +- core/client/src/client.rs | 2 +- core/client/src/light/backend.rs | 18 +-- core/client/src/light/call_executor.rs | 6 +- core/state-db/src/lib.rs | 72 +++++++--- core/state-db/src/noncanonical.rs | 106 ++++++++++---- core/state-machine/src/backend.rs | 35 ++--- core/state-machine/src/lib.rs | 28 ++-- core/state-machine/src/proving_backend.rs | 16 +-- core/state-machine/src/trie_backend.rs | 2 +- 13 files changed, 392 insertions(+), 194 deletions(-) diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 82d570567b..dd38f10bcd 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -72,6 +72,97 @@ const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u32 = 32768; /// DB-backed patricia trie state, transaction type is an overlay of changes to commit. pub type DbState = state_machine::TrieBackend>, Blake2Hasher>; +pub struct RefTrackingState { + state: DbState, + storage: Arc>, + parent_hash: Option, +} + +impl RefTrackingState { + fn new(state: DbState, storage: Arc>, parent_hash: Option) -> RefTrackingState { + if let Some(hash) = &parent_hash { + storage.state_db.pin(hash); + } + RefTrackingState { + state, + parent_hash, + storage, + } + } +} + +impl Drop for RefTrackingState { + fn drop(&mut self) { + if let Some(hash) = &self.parent_hash { + self.storage.state_db.unpin(hash); + } + } +} + +impl StateBackend for RefTrackingState { + type Error = >::Error; + type Transaction = >::Transaction; + type TrieBackendStorage = >::TrieBackendStorage; + + fn storage(&self, key: &[u8]) -> Result>, Self::Error> { + self.state.storage(key) + } + + fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { + self.state.storage_hash(key) + } + + fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result>, Self::Error> { + self.state.child_storage(storage_key, key) + } + + fn exists_storage(&self, key: &[u8]) -> Result { + self.state.exists_storage(key) + } + + fn exists_child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result { + self.state.exists_child_storage(storage_key, key) + } + + fn for_keys_with_prefix(&self, prefix: &[u8], f: F) { + self.state.for_keys_with_prefix(prefix, f) + } + + fn for_keys_in_child_storage(&self, storage_key: &[u8], f: F) { + self.state.for_keys_in_child_storage(storage_key, f) + } + + fn storage_root(&self, delta: I) -> (H256, Self::Transaction) + where + I: IntoIterator, Option>)> + { + self.state.storage_root(delta) + } + + fn child_storage_root(&self, storage_key: &[u8], delta: I) -> (Vec, bool, Self::Transaction) + where + I: IntoIterator, Option>)>, + { + self.state.child_storage_root(storage_key, delta) + } + + fn pairs(&self) -> Vec<(Vec, Vec)> { + self.state.pairs() + } + + 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 as_trie_backend(&mut self) -> Option<&state_machine::TrieBackend> { + self.state.as_trie_backend() + } +} + /// Database settings. pub struct DatabaseSettings { /// Cache size in bytes. If `None` default is used. @@ -270,7 +361,7 @@ impl client::blockchain::ProvideCache for BlockchainDb { - old_state: CachingState, + old_state: CachingState, Block>, db_updates: PrefixedMemoryDB, storage_updates: Vec<(Vec, Option>)>, changes_trie_updates: MemoryDB, @@ -295,7 +386,7 @@ impl client::backend::BlockImportOperation for BlockImportOperation where Block: BlockT, { - type State = CachingState; + type State = CachingState, Block>; fn state(&self) -> Result, client::error::Error> { Ok(Some(&self.old_state)) @@ -922,6 +1013,8 @@ impl> Backend { let changes_trie_updates = operation.changes_trie_updates; self.changes_tries_storage.commit(&mut transaction, changes_trie_updates); + let cache = operation.old_state.release(); // release state reference so that it can be finalized + if finalized { // TODO: ensure best chain contains this block. @@ -953,7 +1046,7 @@ impl> Backend { meta_updates.push((hash, number, pending_block.leaf_state.is_best(), finalized)); - Some((number, hash, enacted, retracted, displaced_leaf, is_best)) + Some((number, hash, enacted, retracted, displaced_leaf, is_best, cache)) } else { None }; @@ -975,7 +1068,7 @@ impl> Backend { let write_result = self.storage.db.write(transaction).map_err(db_err); - if let Some((number, hash, enacted, retracted, displaced_leaf, is_best)) = imported { + if let Some((number, hash, enacted, retracted, displaced_leaf, is_best, mut cache)) = imported { if let Err(e) = write_result { let mut leaves = self.blockchain.leaves.write(); let mut undo = leaves.undo(); @@ -990,7 +1083,7 @@ impl> Backend { return Err(e) } - operation.old_state.sync_cache( + cache.sync_cache( &enacted, &retracted, operation.storage_updates, @@ -1090,7 +1183,7 @@ impl client::backend::AuxStore for Backend where Block: BlockT client::backend::Backend for Backend where Block: BlockT { type BlockImportOperation = BlockImportOperation; type Blockchain = BlockchainDb; - type State = CachingState; + type State = CachingState, Block>; type ChangesTrieStorage = DbChangesTrieStorage; fn begin_operation(&self) -> Result { @@ -1217,7 +1310,8 @@ impl client::backend::Backend for Backend whe BlockId::Hash(h) if h == Default::default() => { let genesis_storage = DbGenesisStorage::new(); let root = genesis_storage.0.clone(); - let state = DbState::new(Arc::new(genesis_storage), root); + let db_state = DbState::new(Arc::new(genesis_storage), root); + let state = RefTrackingState::new(db_state, self.storage.clone(), None); return Ok(CachingState::new(state, self.shared_cache.clone(), None)); }, _ => {} @@ -1228,7 +1322,8 @@ impl client::backend::Backend for Backend whe let hash = hdr.hash(); 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); + let db_state = DbState::new(self.storage.clone(), root); + let state = RefTrackingState::new(db_state, self.storage.clone(), Some(hash.clone())); Ok(CachingState::new(state, self.shared_cache.clone(), Some(hash))) } else { Err(client::error::Error::UnknownBlock(format!("State already discarded for {:?}", block))) @@ -1243,10 +1338,10 @@ impl client::backend::Backend for Backend whe !self.storage.state_db.is_pruned(hash, number.saturated_into::()) } - fn destroy_state(&self, mut state: Self::State) -> Result<(), client::error::Error> { - if let Some(hash) = state.parent_hash.clone() { + fn destroy_state(&self, state: Self::State) -> Result<(), client::error::Error> { + if let Some(hash) = state.cache.parent_hash.clone() { let is_best = || self.blockchain.meta.read().best_hash == hash; - state.sync_cache(&[], &[], vec![], None, None, is_best); + state.release().sync_cache(&[], &[], vec![], None, None, is_best); } Ok(()) } diff --git a/core/client/db/src/storage_cache.rs b/core/client/db/src/storage_cache.rs index bc0a179cf8..cc4670866c 100644 --- a/core/client/db/src/storage_cache.rs +++ b/core/client/db/src/storage_cache.rs @@ -99,6 +99,17 @@ struct LocalCache { hashes: HashMap>, } +/// Cache changes. +pub struct CacheChanges { + /// Shared canonical state cache. + shared_cache: SharedCache, + /// Local cache of values for this state. + local_cache: RwLock>, + /// Hash of the block on top of which this instance was created or + /// `None` if cache is disabled + pub parent_hash: Option, +} + /// State abstraction. /// Manages shared global state cache which reflects the canonical /// state as it is on the disk. @@ -109,56 +120,11 @@ struct LocalCache { pub struct CachingState, B: Block> { /// Backing state. state: S, - /// Shared canonical state cache. - shared_cache: SharedCache, - /// Local cache of values for this state. - local_cache: RwLock>, - /// Hash of the block on top of which this instance was created or - /// `None` if cache is disabled - pub parent_hash: Option, + /// Cache data. + pub cache: CacheChanges } -impl, B: Block> CachingState { - /// Create a new instance wrapping generic State and shared cache. - pub fn new(state: S, shared_cache: SharedCache, parent_hash: Option) -> CachingState { - CachingState { - state, - shared_cache, - local_cache: RwLock::new(LocalCache { - storage: Default::default(), - hashes: Default::default(), - }), - parent_hash: parent_hash, - } - } - - 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(); - } - } - +impl CacheChanges { /// 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 @@ -189,7 +155,7 @@ impl, B: Block> CachingState { m.is_canon = true; for a in &m.storage { trace!("Reverting enacted key {:?}", a); - CachingState::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); + CacheChanges::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); } false } else { @@ -205,7 +171,7 @@ impl, B: Block> CachingState { m.is_canon = false; for a in &m.storage { trace!("Retracted key {:?}", a); - CachingState::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); + CacheChanges::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); } false } else { @@ -228,7 +194,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() { - CachingState::::storage_insert(cache, k, v); + CacheChanges::::storage_insert(cache, k, v); } for (k, v) in local_cache.hashes.drain() { cache.hashes.insert(k, v); @@ -248,7 +214,7 @@ impl, B: Block> CachingState { modifications.insert(k.clone()); if is_best { cache.hashes.remove(&k); - CachingState::::storage_insert(cache, k, v); + CacheChanges::::storage_insert(cache, k, v); } } // Save modified storage. These are ordered by the block number. @@ -272,6 +238,50 @@ 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(); + } + } +} + +impl, B: Block> CachingState { + /// Create a new instance wrapping generic State and shared cache. + pub fn new(state: S, shared_cache: SharedCache, parent_hash: Option) -> CachingState { + CachingState { + state, + cache: CacheChanges { + shared_cache, + local_cache: RwLock::new(LocalCache { + storage: Default::default(), + hashes: Default::default(), + }), + parent_hash: parent_hash, + }, + } + } + /// Check if the key can be returned from cache by matching current block parent hash against canonical /// state and filtering out entries modified in later blocks. fn is_allowed( @@ -312,6 +322,11 @@ impl, B: Block> CachingState { trace!("Cache lookup skipped for {:?}: parent hash is unknown", key); false } + + /// Dispose state and return cache data. + pub fn release(self) -> CacheChanges { + self.cache + } } impl, B:Block> StateBackend for CachingState { @@ -320,13 +335,13 @@ impl, B:Block> StateBackend for CachingState Result>, Self::Error> { - let local_cache = self.local_cache.upgradable_read(); + let local_cache = self.cache.local_cache.upgradable_read(); if let Some(entry) = local_cache.storage.get(key).cloned() { trace!("Found in local cache: {:?}", key); return Ok(entry) } - let mut cache = self.shared_cache.lock(); - if Self::is_allowed(key, &self.parent_hash, &cache.modifications) { + let mut cache = self.cache.shared_cache.lock(); + if Self::is_allowed(key, &self.cache.parent_hash, &cache.modifications) { if let Some(entry) = cache.storage.get_mut(key).map(|a| a.clone()) { trace!("Found in shared cache: {:?}", key); return Ok(entry) @@ -339,13 +354,13 @@ impl, B:Block> StateBackend for CachingState Result, Self::Error> { - let local_cache = self.local_cache.upgradable_read(); + let local_cache = self.cache.local_cache.upgradable_read(); if let Some(entry) = local_cache.hashes.get(key).cloned() { trace!("Found hash in local cache: {:?}", key); return Ok(entry) } - let mut cache = self.shared_cache.lock(); - if Self::is_allowed(key, &self.parent_hash, &cache.modifications) { + let mut cache = self.cache.shared_cache.lock(); + if Self::is_allowed(key, &self.cache.parent_hash, &cache.modifications) { if let Some(entry) = cache.hashes.get_mut(key).map(|a| a.clone()) { trace!("Found hash in shared cache: {:?}", key); return Ok(entry) @@ -405,8 +420,8 @@ impl, B:Block> StateBackend for CachingState Option> { - self.state.try_into_trie_backend() + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { + self.state.as_trie_backend() } } @@ -436,22 +451,22 @@ mod tests { // blocks [ 3a(c) 2a(c) 2b 1b 1a(c) 0 ] // state [ 5 5 4 3 2 2 ] let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], Some(h0.clone()), Some(0), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], Some(h0.clone()), Some(0), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h0.clone())); - s.sync_cache(&[], &[], vec![], Some(h1a.clone()), Some(1), || true); + s.cache.sync_cache(&[], &[], vec![], Some(h1a.clone()), Some(1), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h0.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], Some(h1b.clone()), Some(1), || false); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], Some(h1b.clone()), Some(1), || false); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1b.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![4]))], Some(h2b.clone()), Some(2), || false); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![4]))], Some(h2b.clone()), Some(2), || false); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1a.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![5]))], Some(h2a.clone()), Some(2), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![5]))], Some(h2a.clone()), Some(2), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2a.clone())); - s.sync_cache(&[], &[], vec![], Some(h3a.clone()), Some(3), || true); + s.cache.sync_cache(&[], &[], vec![], Some(h3a.clone()), Some(3), || true); let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a.clone())); assert_eq!(s.storage(&key).unwrap().unwrap(), vec![5]); @@ -468,7 +483,14 @@ mod tests { // reorg to 3b // blocks [ 3b(c) 3a 2a 2b(c) 1b 1a 0 ] let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2b.clone())); - s.sync_cache(&[h1b.clone(), h2b.clone(), h3b.clone()], &[h1a.clone(), h2a.clone(), h3a.clone()], vec![], Some(h3b.clone()), Some(3), || true); + s.cache.sync_cache( + &[h1b.clone(), h2b.clone(), h3b.clone()], + &[h1a.clone(), h2a.clone(), h3a.clone()], + vec![], + Some(h3b.clone()), + Some(3), + || true + ); let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a.clone())); assert!(s.storage(&key).unwrap().is_none()); } @@ -482,11 +504,11 @@ mod tests { 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); + s.cache.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); + s.cache.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 */); } @@ -499,11 +521,11 @@ mod tests { 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); + s.cache.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); + s.cache.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/src/call_executor.rs b/core/client/src/call_executor.rs index 13ee96400f..bb59be44c3 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -117,17 +117,17 @@ where /// No changes are made. fn prove_at_state>( &self, - state: S, + mut state: S, overlay: &mut OverlayedChanges, method: &str, call_data: &[u8] ) -> Result<(Vec, Vec>), error::Error> { - let trie_state = state.try_into_trie_backend() + let trie_state = state.as_trie_backend() .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box )?; - self.prove_at_trie_state(&trie_state, overlay, method, call_data) + self.prove_at_trie_state(trie_state, overlay, method, call_data) } /// Execute a call to a contract on top of given trie state, gathering execution proof. @@ -239,18 +239,18 @@ where _ => {}, } - let state = self.backend.state_at(*at)?; + let mut state = self.backend.state_at(*at)?; match recorder { Some(recorder) => { - let trie_state = state.try_into_trie_backend() + let trie_state = state.as_trie_backend() .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box )?; let backend = state_machine::ProvingBackend::new_with_recorder( - &trie_state, + trie_state, recorder.clone() ); diff --git a/core/client/src/cht.rs b/core/client/src/cht.rs index 996a6b37f1..fc8920327e 100644 --- a/core/client/src/cht.rs +++ b/core/client/src/cht.rs @@ -101,14 +101,14 @@ pub fn build_proof( .into_iter() .map(|(k, v)| (None, k, Some(v))) .collect::>(); - let storage = InMemoryState::::default().update(transaction); - let trie_storage = storage.try_into_trie_backend() - .expect("InMemoryState::try_into_trie_backend always returns Some; qed"); + let mut storage = InMemoryState::::default().update(transaction); + let trie_storage = storage.as_trie_backend() + .expect("InMemoryState::as_trie_backend always returns Some; qed"); let mut total_proof = HashSet::new(); for block in blocks.into_iter() { debug_assert_eq!(block_to_cht_number(cht_size, block), Some(cht_num)); - let (value, proof) = prove_read_on_trie_backend(&trie_storage, &encode_cht_key(block))?; + let (value, proof) = prove_read_on_trie_backend(trie_storage, &encode_cht_key(block))?; assert!(value.is_some(), "we have just built trie that includes the value for block"); total_proof.extend(proof); } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 874cf7636b..1f19b96d3c 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -1277,7 +1277,7 @@ impl Client where /// Prepare in-memory header that is used in execution environment. fn prepare_environment_block(&self, parent: &BlockId) -> error::Result { - let parent_header = self.backend().blockchain().expect_header(*parent)?; + let parent_header = self.backend.blockchain().expect_header(*parent)?; Ok(<::Header as HeaderT>::new( self.backend.blockchain().expect_block_number_from_id(parent)? + One::one(), Default::default(), diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index bf5eb11f26..0c2279bf3d 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -38,13 +38,13 @@ use consensus::well_known_cache_keys; const IN_MEMORY_EXPECT_PROOF: &str = "InMemory state backend has Void error type and always suceeds; qed"; /// Light client backend. -pub struct Backend { +pub struct Backend { blockchain: Arc>, genesis_state: RwLock>>, } /// Light block (header and justification) import operation. -pub struct ImportOperation { +pub struct ImportOperation { header: Option, cache: HashMap>, leaf_state: NewBlockState, @@ -64,14 +64,14 @@ pub struct OnDemandState { } /// On-demand or in-memory genesis state. -pub enum OnDemandOrGenesisState { +pub enum OnDemandOrGenesisState { /// On-demand state - storage values are fetched from remote nodes. OnDemand(OnDemandState), /// Genesis state - storage values are stored in-memory. Genesis(InMemoryState), } -impl Backend { +impl Backend { /// Create new light backend. pub fn new(blockchain: Arc>) -> Self { Self { @@ -86,7 +86,7 @@ impl Backend { } } -impl AuxStore for Backend { +impl AuxStore for Backend { fn insert_aux< 'a, 'b: 'a, @@ -387,7 +387,7 @@ where Vec::new() } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { None } } @@ -482,10 +482,10 @@ where } } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { match self { - OnDemandOrGenesisState::OnDemand(state) => state.try_into_trie_backend(), - OnDemandOrGenesisState::Genesis(state) => state.try_into_trie_backend(), + OnDemandOrGenesisState::OnDemand(ref mut state) => state.as_trie_backend(), + OnDemandOrGenesisState::Genesis(ref mut state) => state.as_trie_backend(), } } } diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 5fb7e7308a..5b6d1b3a29 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -388,7 +388,7 @@ impl CallExecutor for /// Method is executed using passed header as environment' current block. /// Proof includes both environment preparation proof and method execution proof. pub fn prove_execution( - state: S, + mut state: S, header: Block::Header, executor: &E, method: &str, @@ -399,13 +399,13 @@ pub fn prove_execution( S: StateBackend, E: CallExecutor, { - let trie_state = state.try_into_trie_backend() + let trie_state = state.as_trie_backend() .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box)?; // prepare execution environment + record preparation proof let mut changes = Default::default(); let (_, init_proof) = executor.prove_at_trie_state( - &trie_state, + trie_state, &mut changes, "Core_initialize_block", &header.encode(), diff --git a/core/state-db/src/lib.rs b/core/state-db/src/lib.rs index 8d9cf9c965..8986dda32d 100644 --- a/core/state-db/src/lib.rs +++ b/core/state-db/src/lib.rs @@ -37,7 +37,7 @@ use std::fmt; use parking_lot::RwLock; use parity_codec as codec; use codec::Codec; -use std::collections::HashSet; +use std::collections::{VecDeque, HashMap, hash_map::Entry}; use noncanonical::NonCanonicalOverlay; use pruning::RefWindow; use log::trace; @@ -78,6 +78,8 @@ pub enum Error { InvalidBlockNumber, /// Trying to insert block with unknown parent. InvalidParent, + /// Canonicalization would discard pinned state. + DiscardingPinned, } impl fmt::Debug for Error { @@ -88,6 +90,7 @@ impl fmt::Debug for Error { Error::InvalidBlock => write!(f, "Trying to canonicalize invalid block"), Error::InvalidBlockNumber => write!(f, "Trying to insert block with invalid number"), Error::InvalidParent => write!(f, "Trying to insert block with unknown parent"), + Error::DiscardingPinned => write!(f, "Trying to discard pinned state"), } } } @@ -112,7 +115,7 @@ pub struct CommitSet { } /// Pruning constraints. If none are specified pruning is -#[derive(Default, Debug, Clone)] +#[derive(Default, Debug, Clone, Eq, PartialEq)] pub struct Constraints { /// Maximum blocks. Defaults to 0 when unspecified, effectively keeping only non-canonical states. pub max_blocks: Option, @@ -121,7 +124,7 @@ pub struct Constraints { } /// Pruning mode. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Eq, PartialEq)] pub enum PruningMode { /// Maintain a pruning window. Constrained(Constraints), @@ -165,13 +168,14 @@ fn to_meta_key(suffix: &[u8], data: &S) -> Vec { struct StateDbSync { mode: PruningMode, non_canonical: NonCanonicalOverlay, + canonicalization_queue: VecDeque, pruning: Option>, - pinned: HashSet, + pinned: HashMap, } impl StateDbSync { pub fn new(mode: PruningMode, db: &D) -> Result, Error> { - trace!("StateDb settings: {:?}", mode); + trace!(target: "state-db", "StateDb settings: {:?}", mode); let non_canonical: NonCanonicalOverlay = NonCanonicalOverlay::new(db)?; let pruning: Option> = match mode { PruningMode::Constrained(Constraints { @@ -186,6 +190,7 @@ impl StateDbSync { non_canonical, pruning, pinned: Default::default(), + canonicalization_queue: Default::default(), }) } @@ -206,21 +211,30 @@ impl StateDbSync { } pub fn canonicalize_block(&mut self, hash: &BlockHash) -> Result, Error> { - let mut commit = match self.mode { - PruningMode::ArchiveAll => { - CommitSet::default() - }, - PruningMode::ArchiveCanonical => { - let mut commit = self.non_canonical.canonicalize(hash)?; - commit.data.deleted.clear(); - commit - }, - PruningMode::Constrained(_) => { - self.non_canonical.canonicalize(hash)? - }, - }; - if let Some(ref mut pruning) = self.pruning { - pruning.note_canonical(hash, &mut commit); + let mut commit = CommitSet::default(); + if self.mode == PruningMode::ArchiveAll { + return Ok(commit) + } + self.canonicalization_queue.push_back(hash.clone()); + while let Some(hash) = self.canonicalization_queue.front().cloned() { + if self.pinned.contains_key(&hash) { + break; + } + match self.non_canonical.canonicalize(&hash, &self.pinned, &mut commit) { + Ok(()) => { + self.canonicalization_queue.pop_front(); + if self.mode == PruningMode::ArchiveCanonical { + commit.data.deleted.clear(); + } + } + Err(Error::DiscardingPinned) => { + break; + } + Err(e) => return Err(e), + }; + if let Some(ref mut pruning) = self.pruning { + pruning.note_canonical(&hash, &mut commit); + } } self.prune(&mut commit); Ok(commit) @@ -255,7 +269,7 @@ impl StateDbSync { } let pinned = &self.pinned; - if pruning.next_hash().map_or(false, |h| pinned.contains(&h)) { + if pruning.next_hash().map_or(false, |h| pinned.contains_key(&h)) { break; } pruning.prune_one(commit); @@ -278,11 +292,23 @@ impl StateDbSync { } pub fn pin(&mut self, hash: &BlockHash) { - self.pinned.insert(hash.clone()); + trace!(target: "state-db", "Pinned block: {:?}", hash); + *self.pinned.entry(hash.clone()).or_default() += 1; } pub fn unpin(&mut self, hash: &BlockHash) { - self.pinned.remove(hash); + match self.pinned.entry(hash.clone()) { + Entry::Occupied(mut entry) => { + *entry.get_mut() -= 1; + if *entry.get() == 0 { + trace!(target: "state-db", "Unpinned block: {:?}", hash); + entry.remove(); + } else { + trace!(target: "state-db", "Releasing reference for {:?}", hash); + } + }, + Entry::Vacant(_) => {}, + } } pub fn get(&self, key: &Key, db: &D) -> Result, Error> diff --git a/core/state-db/src/noncanonical.rs b/core/state-db/src/noncanonical.rs index da957335ba..0d43389a0b 100644 --- a/core/state-db/src/noncanonical.rs +++ b/core/state-db/src/noncanonical.rs @@ -230,13 +230,20 @@ impl NonCanonicalOverlay { Ok(commit) } - fn discard_journals(&self, level_index: usize, discarded_journals: &mut Vec>, hash: &BlockHash) { + fn discard_journals( + &self, + level_index: usize, + discarded_journals: &mut Vec>, + discarded_blocks: &mut Vec, + hash: &BlockHash + ) { if let Some(level) = self.levels.get(level_index) { level.iter().for_each(|overlay| { let parent = self.parents.get(&overlay.hash).expect("there is a parent entry for each entry in levels; qed").clone(); if parent == *hash { discarded_journals.push(overlay.journal_key.clone()); - self.discard_journals(level_index + 1, discarded_journals, &overlay.hash); + discarded_blocks.push(overlay.hash.clone()); + self.discard_journals(level_index + 1, discarded_journals, discarded_blocks, &overlay.hash); } }); } @@ -268,7 +275,12 @@ impl NonCanonicalOverlay { /// Select a top-level root and canonicalized it. Discards all sibling subtrees and the root. /// Returns a set of changes that need to be added to the DB. - pub fn canonicalize(&mut self, hash: &BlockHash) -> Result, Error> { + pub fn canonicalize( + &mut self, + hash: &BlockHash, + pinned: &HashMap, + commit: &mut CommitSet, + ) -> Result<(), Error> { trace!(target: "state-db", "Canonicalizing {:?}", hash); let level = self.levels.get(self.pending_canonicalizations.len()).ok_or_else(|| Error::InvalidBlock)?; let index = level @@ -276,26 +288,40 @@ impl NonCanonicalOverlay { .position(|overlay| overlay.hash == *hash) .ok_or_else(|| Error::InvalidBlock)?; - let mut commit = CommitSet::default(); let mut discarded_journals = Vec::new(); - for (i, overlay) in level.into_iter().enumerate() { - if i == index { - // that's the one we need to canonicalize - commit.data.inserted = overlay.inserted.iter() - .map(|k| (k.clone(), self.values.get(k).expect("For each key in verlays there's a value in values").1.clone())) - .collect(); - commit.data.deleted = overlay.deleted.clone(); - } else { - self.discard_journals(self.pending_canonicalizations.len() + 1, &mut discarded_journals, &overlay.hash); + let mut discarded_blocks = Vec::new(); + for (i, overlay) in level.iter().enumerate() { + if i != index { + self.discard_journals( + self.pending_canonicalizations.len() + 1, + &mut discarded_journals, + &mut discarded_blocks, + &overlay.hash + ); } discarded_journals.push(overlay.journal_key.clone()); + discarded_blocks.push(overlay.hash.clone()); } + + for hash in discarded_blocks.into_iter() { + if pinned.contains_key(&hash) { + trace!(target: "state-db", "Refusing to discard pinned state {:?}", hash); + return Err(Error::DiscardingPinned) + } + } + + // get the one we need to canonicalize + let overlay = &level[index]; + commit.data.inserted.extend(overlay.inserted.iter() + .map(|k| (k.clone(), self.values.get(k).expect("For each key in overlays there's a value in values").1.clone()))); + commit.data.deleted.extend(overlay.deleted.clone()); + commit.meta.deleted.append(&mut discarded_journals); let canonicalized = (hash.clone(), self.front_block_number() + self.pending_canonicalizations.len() as u64); commit.meta.inserted.push((to_meta_key(LAST_CANONICAL, &()), canonicalized.encode())); trace!(target: "state-db", "Discarding {} records", commit.meta.deleted.len()); self.pending_canonicalizations.push(hash.clone()); - Ok(commit) + Ok(()) } fn apply_canonicalizations(&mut self) { @@ -385,10 +411,10 @@ impl NonCanonicalOverlay { #[cfg(test)] mod tests { - use std::io; + use std::{collections::HashMap, io}; use primitives::H256; use super::{NonCanonicalOverlay, to_journal_key}; - use crate::ChangeSet; + use crate::{ChangeSet, CommitSet}; use crate::test::{make_db, make_changeset}; fn contains(overlay: &NonCanonicalOverlay, key: u64) -> bool { @@ -409,7 +435,8 @@ mod tests { fn canonicalize_empty_panics() { let db = make_db(&[]); let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); - overlay.canonicalize::(&H256::default()).unwrap(); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&H256::default(), &HashMap::default(), &mut commit).unwrap(); } #[test] @@ -453,7 +480,8 @@ mod tests { let db = make_db(&[]); let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); overlay.insert::(&h1, 1, &H256::default(), ChangeSet::default()).unwrap(); - overlay.canonicalize::(&h2).unwrap(); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); } #[test] @@ -468,7 +496,8 @@ mod tests { assert_eq!(insertion.meta.inserted.len(), 2); assert_eq!(insertion.meta.deleted.len(), 0); db.commit(&insertion); - let finalization = overlay.canonicalize::(&h1).unwrap(); + let mut finalization = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut finalization).unwrap(); assert_eq!(finalization.data.inserted.len(), changeset.inserted.len()); assert_eq!(finalization.data.deleted.len(), changeset.deleted.len()); assert_eq!(finalization.meta.inserted.len(), 1); @@ -501,7 +530,9 @@ mod tests { let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); db.commit(&overlay.insert::(&h1, 10, &H256::default(), make_changeset(&[3, 4], &[2])).unwrap()); db.commit(&overlay.insert::(&h2, 11, &h1, make_changeset(&[5], &[3])).unwrap()); - db.commit(&overlay.canonicalize::(&h1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); @@ -526,7 +557,9 @@ mod tests { assert!(contains(&overlay, 5)); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 2); - db.commit(&overlay.canonicalize::(&h1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); assert!(contains(&overlay, 5)); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 2); @@ -535,7 +568,9 @@ mod tests { assert_eq!(overlay.parents.len(), 1); assert!(!contains(&overlay, 5)); assert!(contains(&overlay, 7)); - db.commit(&overlay.canonicalize::(&h2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); assert_eq!(overlay.parents.len(), 0); @@ -552,7 +587,9 @@ mod tests { db.commit(&overlay.insert::(&h_1, 1, &H256::default(), c_1).unwrap()); db.commit(&overlay.insert::(&h_2, 1, &H256::default(), c_2).unwrap()); assert!(contains(&overlay, 1)); - db.commit(&overlay.canonicalize::(&h_1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); assert!(contains(&overlay, 1)); overlay.apply_pending(); assert!(!contains(&overlay, 1)); @@ -569,8 +606,10 @@ mod tests { db.commit(&overlay.insert::(&h1, 1, &H256::default(), changeset.clone()).unwrap()); db.commit(&overlay.insert::(&h2, 2, &h1, changeset.clone()).unwrap()); overlay.apply_pending(); - db.commit(&overlay.canonicalize::(&h1).unwrap()); - db.commit(&overlay.canonicalize::(&h2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); db.commit(&overlay.insert::(&h3, 3, &h2, changeset.clone()).unwrap()); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); @@ -639,7 +678,9 @@ mod tests { assert_eq!(overlay.last_canonicalized, overlay2.last_canonicalized); // canonicalize 1. 2 and all its children should be discarded - db.commit(&overlay.canonicalize::(&h_1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 6); @@ -657,8 +698,15 @@ mod tests { assert!(db.get_meta(&to_journal_key(2, 2)).unwrap().is_none()); assert!(db.get_meta(&to_journal_key(2, 3)).unwrap().is_none()); + // check that discarding pinned state produces an error. + let mut commit = CommitSet::default(); + let pinned = vec![(h_1_1_1, 1)].into_iter().collect(); + assert!(overlay.canonicalize::(&h_1_2, &pinned, &mut commit).is_err()); + // canonicalize 1_2. 1_1 and all its children should be discarded - db.commit(&overlay.canonicalize::(&h_1_2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1_2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); assert_eq!(overlay.parents.len(), 3); @@ -673,7 +721,9 @@ mod tests { assert!(!overlay.have_block(&h_1_1_1)); // canonicalize 1_2_2 - db.commit(&overlay.canonicalize::(&h_1_2_2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1_2_2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); assert_eq!(overlay.parents.len(), 0); diff --git a/core/state-machine/src/backend.rs b/core/state-machine/src/backend.rs index fd143a553e..81529c6da3 100644 --- a/core/state-machine/src/backend.rs +++ b/core/state-machine/src/backend.rs @@ -106,7 +106,7 @@ pub trait Backend { } /// Try convert into trie backend. - fn try_into_trie_backend(self) -> Option>; + fn as_trie_backend(&mut self) -> Option<&TrieBackend>; /// 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. @@ -185,31 +185,33 @@ impl error::Error for Void { /// In-memory backend. Fully recomputes tries on each commit but useful for /// tests. -#[derive(Eq)] -pub struct InMemory { +pub struct InMemory { inner: HashMap>, HashMap, Vec>>, + trie: Option, H>>, _hasher: PhantomData, } -impl Default for InMemory { +impl Default for InMemory { fn default() -> Self { InMemory { inner: Default::default(), + trie: None, _hasher: PhantomData, } } } -impl Clone for InMemory { +impl Clone for InMemory { fn clone(&self) -> Self { InMemory { inner: self.inner.clone(), + trie: None, _hasher: PhantomData, } } } -impl PartialEq for InMemory { +impl PartialEq for InMemory { fn eq(&self, other: &Self) -> bool { self.inner.eq(&other.inner) } @@ -230,27 +232,29 @@ impl InMemory { } } -impl From>, HashMap, Vec>>> for InMemory { +impl From>, HashMap, Vec>>> for InMemory { fn from(inner: HashMap>, HashMap, Vec>>) -> Self { InMemory { inner: inner, + trie: None, _hasher: PhantomData, } } } -impl From, Vec>> for InMemory { +impl From, Vec>> for InMemory { fn from(inner: HashMap, Vec>) -> Self { let mut expanded = HashMap::new(); expanded.insert(None, inner); InMemory { inner: expanded, + trie: None, _hasher: PhantomData, } } } -impl From>, Vec, Option>)>> for InMemory { +impl From>, Vec, Option>)>> for InMemory { fn from(inner: Vec<(Option>, Vec, Option>)>) -> Self { let mut expanded: HashMap>, HashMap, Vec>> = HashMap::new(); for (child_key, key, value) in inner { @@ -365,16 +369,14 @@ impl Backend for InMemory { .collect() } - fn try_into_trie_backend( - self - )-> Option> { + fn as_trie_backend(&mut self)-> Option<&TrieBackend> { 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 { + for (storage_key, map) in &self.inner { if let Some(storage_key) = storage_key.as_ref() { - let ch = insert_into_memory_db::(&mut mdb, map.into_iter())?; + let ch = insert_into_memory_db::(&mut mdb, map.clone().into_iter())?; new_child_roots.push((storage_key.clone(), ch.as_ref().into())); } else { root_map = Some(map); @@ -384,14 +386,15 @@ impl Backend for InMemory { if let Some(map) = root_map.take() { root = Some(insert_into_memory_db::( &mut mdb, - map.into_iter().chain(new_child_roots.into_iter()) + map.clone().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())?, }; - Some(TrieBackend::new(mdb, root)) + self.trie = Some(TrieBackend::new(mdb, root)); + self.trie.as_ref() } } diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index f16c3db14e..9f0e20ce01 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -669,7 +669,7 @@ impl<'a, H, N, B, T, O, Exec> StateMachine<'a, H, N, B, T, O, Exec> where /// Prove execution using the given state backend, overlayed changes, and call executor. pub fn prove_execution( - backend: B, + mut backend: B, overlay: &mut OverlayedChanges, exec: &Exec, method: &str, @@ -681,9 +681,9 @@ where Exec: CodeExecutor, H::Out: Ord + 'static, { - let trie_backend = backend.try_into_trie_backend() + let trie_backend = backend.as_trie_backend() .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; - prove_execution_on_trie_backend(&trie_backend, overlay, exec, method, call_data) + prove_execution_on_trie_backend(trie_backend, overlay, exec, method, call_data) } /// Prove execution using the given trie backend, overlayed changes, and call executor. @@ -778,7 +778,7 @@ where /// Generate storage read proof. pub fn prove_read( - backend: B, + mut backend: B, key: &[u8] ) -> Result<(Option>, Vec>), Box> where @@ -786,16 +786,16 @@ where H: Hasher, H::Out: Ord { - let trie_backend = backend.try_into_trie_backend() + let trie_backend = backend.as_trie_backend() .ok_or_else( ||Box::new(ExecutionError::UnableToGenerateProof) as Box )?; - prove_read_on_trie_backend(&trie_backend, key) + prove_read_on_trie_backend(trie_backend, key) } /// Generate child storage read proof. pub fn prove_child_read( - backend: B, + mut backend: B, storage_key: &[u8], key: &[u8], ) -> Result<(Option>, Vec>), Box> @@ -804,9 +804,9 @@ where H: Hasher, H::Out: Ord { - let trie_backend = backend.try_into_trie_backend() + let trie_backend = backend.as_trie_backend() .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; - prove_child_read_on_trie_backend(&trie_backend, storage_key, key) + prove_child_read_on_trie_backend(trie_backend, storage_key, key) } @@ -1100,7 +1100,8 @@ mod tests { b"abc".to_vec() => b"2".to_vec(), b"bbb".to_vec() => b"3".to_vec() ]; - let backend = InMemory::::from(initial).try_into_trie_backend().unwrap(); + let mut state = InMemory::::from(initial); + let backend = state.as_trie_backend().unwrap(); let mut overlay = OverlayedChanges { committed: map![ b"aba".to_vec() => OverlayedValue::from(Some(b"1312".to_vec())), @@ -1115,7 +1116,7 @@ mod tests { { let changes_trie_storage = InMemoryChangesTrieStorage::::new(); - 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()); ext.clear_prefix(b"ab"); } overlay.commit_prospective(); @@ -1136,12 +1137,13 @@ mod tests { #[test] fn set_child_storage_works() { - let backend = InMemory::::default().try_into_trie_backend().unwrap(); + let mut state = InMemory::::default(); + let backend = state.as_trie_backend().unwrap(); let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut overlay = OverlayedChanges::default(); let mut ext = Ext::new( &mut overlay, - &backend, + backend, Some(&changes_trie_storage), NeverOffchainExt::new() ); diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index c23838bc21..f9472ed747 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -184,7 +184,7 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.backend.child_storage_root(storage_key, delta) } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { None } } @@ -269,16 +269,16 @@ mod tests { fn proof_recorded_and_checked() { let contents = (0..64).map(|i| (None, vec![i], Some(vec![i]))).collect::>(); let in_memory = InMemory::::default(); - let in_memory = in_memory.update(contents); + let mut in_memory = in_memory.update(contents); let in_memory_root = in_memory.storage_root(::std::iter::empty()).0; (0..64).for_each(|i| assert_eq!(in_memory.storage(&[i]).unwrap().unwrap(), vec![i])); - let trie = in_memory.try_into_trie_backend().unwrap(); + let trie = in_memory.as_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); + let proving = ProvingBackend::new(trie); assert_eq!(proving.storage(&[42]).unwrap().unwrap(), vec![42]); let proof = proving.extract_proof(); @@ -302,7 +302,7 @@ mod tests { .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 mut 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())) @@ -320,7 +320,7 @@ mod tests { vec![i] )); - let trie = in_memory.try_into_trie_backend().unwrap(); + let trie = in_memory.as_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!( @@ -328,7 +328,7 @@ mod tests { vec![i] )); - let proving = ProvingBackend::new(&trie); + let proving = ProvingBackend::new(trie); assert_eq!(proving.storage(&[42]).unwrap().unwrap(), vec![42]); let proof = proving.extract_proof(); @@ -343,7 +343,7 @@ mod tests { assert_eq!(proof_check.storage(&[41]).unwrap().unwrap(), vec![41]); assert_eq!(proof_check.storage(&[64]).unwrap(), None); - let proving = ProvingBackend::new(&trie); + let proving = ProvingBackend::new(trie); assert_eq!(proving.child_storage(&own1[..], &[64]), Ok(Some(vec![64]))); let proof = proving.extract_proof(); diff --git a/core/state-machine/src/trie_backend.rs b/core/state-machine/src/trie_backend.rs index 00c0aca006..0c57cf3682 100644 --- a/core/state-machine/src/trie_backend.rs +++ b/core/state-machine/src/trie_backend.rs @@ -179,7 +179,7 @@ impl, H: Hasher> Backend for TrieBackend where (root, is_default, write_overlay) } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { Some(self) } } -- GitLab From 6ea53d8614e7dd46f21d912bbcb2b8b1555df636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 4 Jun 2019 10:14:46 +0200 Subject: [PATCH 067/140] Generate docs for all workspace crates (#2773) --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 55c83328d4..f29e1b0dc8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -178,7 +178,7 @@ build-rust-doc-release: script: - ./scripts/build.sh - rm -f ./crate-docs/index.html # use it as an indicator if the job succeeds - - time cargo +nightly doc --release --verbose + - time cargo +nightly doc --release --all --verbose - cp -R ./target/doc ./crate-docs - echo "" > ./crate-docs/index.html - sccache -s -- GitLab From 46121f7c073f1b6ee34718bcaacf09e0f8fb395a Mon Sep 17 00:00:00 2001 From: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> Date: Tue, 4 Jun 2019 09:59:47 -0400 Subject: [PATCH 068/140] Add runtime support for `PreRuntime` and `Consensus` digests (#2757) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Try to fix runtime panic Does not work * Fix trivial typo * Add runtime support for `PreRuntime` and `Consensus` digests Fixes 6e253c899e67ce4e29b70e5eca3a3763fa42233f * Fix silly compile error. * Fix overly-long lines Also remove some in-progress code that would not wind up being useful anyway. * Respond to review comments * delete `unset RUSTC_WRAPPER` from scripts/common.sh * delete unnecessary `use aura::AURA_ENGINE_ID` from `node/runtime/src/lib.rs` * add comments explaining why `PreRuntime` and `Consensus` must be special-cased in `core/sr-primitives/lib.rs` * switch to using `$crate::rstd::marker::PhantomData` in `impl_outer_log!` * improve documentation of `DigestItem::Seal` * Fix compilation and add proof that we do not panic Also fix some warnings. * Apply suggestions from code review Mostly for readability Co-Authored-By: Sergei Pepyakin * Apply suggestions from code review Co-Authored-By: Bastian Köcher * $crate::rstd::marker::PhantomData → Default::default() The import is still needed, as `Default::default()` can’t be used in patterns. * Bump `spec_version` Also do some reformatting. --- core/sr-primitives/src/generic/digest.rs | 8 +- core/sr-primitives/src/lib.rs | 114 +++++++++++++++++++---- core/sr-sandbox/without_std.rs | 2 +- node-template/runtime/src/lib.rs | 2 +- node/runtime/src/lib.rs | 6 +- srml/aura/src/lib.rs | 18 ++++ srml/babe/src/lib.rs | 22 ++++- srml/consensus/src/lib.rs | 1 + srml/contract/src/account_db.rs | 4 +- 9 files changed, 144 insertions(+), 33 deletions(-) diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index 8f7055b843..79a2991e5f 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -74,13 +74,14 @@ pub enum DigestItem { /// be generated by the native code of any consensus engine, but this is not /// checked (yet). Consensus(ConsensusEngineId, Vec), - /// Put a Seal on it. + /// Put a Seal on it. This is only used by native code, and is never seen + /// by runtimes. Seal(ConsensusEngineId, SealSignature), /// A pre-runtime digest. /// /// These are messages from the consensus engine to the runtime, although /// the consensus engine can (and should) read them itself to avoid - /// code and state duplication. It is erroneous for a runtime to produce + /// code and state duplication. It is erroneous for a runtime to produce /// these, but this is not (yet) checked. PreRuntime(ConsensusEngineId, Vec), /// Any 'non-system' digest item, opaque to the native code. @@ -110,7 +111,8 @@ pub enum DigestItemRef<'a, Hash: 'a, AuthorityId: 'a, SealSignature: 'a> { /// be generated by the native code of any consensus engine, but this is not /// checked (yet). Consensus(&'a ConsensusEngineId, &'a Vec), - /// Put a Seal on it. + /// Put a Seal on it. This is only used by native code, and is never seen + /// by runtimes. Seal(&'a ConsensusEngineId, &'a SealSignature), /// A pre-runtime digest. /// diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index e6cf9142ad..55e03e47f3 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -25,6 +25,8 @@ pub use parity_codec as codec; #[cfg(feature = "std")] #[doc(hidden)] pub use serde; +#[doc(hidden)] +pub use rstd; #[cfg(feature = "std")] pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; @@ -341,8 +343,8 @@ impl ::rstd::ops::Deref for PerU128 { type Target = u128; fn deref(&self) -> &u128 { - &self.0 - } + &self.0 + } } impl codec::CompactAs for PerU128 { @@ -611,6 +613,69 @@ macro_rules! impl_outer_config { } } +// NOTE [`PreRuntime` and `Consensus` are special] +// +// We MUST treat `PreRuntime` and `Consensus` variants specially, as they: +// +// * have more parameters (both in `generic::DigestItem` and in runtimes) +// * have a `PhantomData` parameter in the runtime, but not in `generic::DigestItem` + +#[macro_export] +#[doc(hidden)] +macro_rules! __parse_pattern_2 { + (PreRuntime $module:ident $internal:ident $v1:ident $v2:ident) => { + $internal::$module($module::RawLog::PreRuntime(ref $v1, ref $v2, $crate::rstd::marker::PhantomData)) + }; + (Consensus $module:ident $internal:ident $v1:ident $v2:ident) => { + $internal::$module($module::RawLog::Consensus(ref $v1, ref $v2, $crate::rstd::marker::PhantomData)) + }; + ($name:ident $module:ident $internal:ident $v1:ident $v2:ident) => { + $internal::$module($module::RawLog::$name(ref $v1)) + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __parse_pattern { + (PreRuntime $engine_id:pat, $binder:pat) => { + $crate::generic::DigestItem::PreRuntime($engine_id, $binder) + }; + (Consensus $engine_id:pat, $binder:pat) => { + $crate::generic::DigestItem::Consensus($engine_id, $binder) + }; + ($name:ident $engine_id:pat, $binder:pat) => { + $crate::generic::DigestItem::$name($binder) + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __parse_expr { + (PreRuntime $engine_id:expr, $module:ident $internal:ident $binder:expr) => { + $internal::$module($module::RawLog::PreRuntime($engine_id, $binder, Default::default())) + }; + (Consensus $engine_id:expr, $module:ident $internal:ident $binder:expr) => { + $internal::$module($module::RawLog::Consensus($engine_id, $binder, Default::default())) + }; + ($name:ident $engine_id:expr, $module:ident $internal:ident $binder:expr) => { + $internal::$module($module::RawLog::$name($binder)) + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __parse_expr_2 { + (PreRuntime $module:ident $internal:ident $v1:ident $v2:ident) => { + $crate::generic::DigestItemRef::PreRuntime($v1, $v2) + }; + (Consensus $module:ident $internal:ident $v1:ident $v2:ident) => { + $crate::generic::DigestItemRef::Consensus($v1, $v2) + }; + ($name:ident $module:ident $internal:ident $v1:ident $v2:ident) => { + $crate::generic::DigestItemRef::$name($v1) + }; +} + /// Generates enum that contains all possible log entries for the runtime. /// Every individual module of the runtime that is mentioned, must /// expose a `Log` and `RawLog` enums. @@ -631,7 +696,7 @@ macro_rules! impl_outer_log { ( $(#[$attr:meta])* pub enum $name:ident ($internal:ident: DigestItem<$( $genarg:ty ),*>) for $trait:ident { - $( $module:ident $(<$instance:path>)? ( $( $sitem:ident ),* ) ),* + $( $module:ident $(<$instance:path>)? ( $( $sitem:tt ),* ) ),* } ) => { /// Wrapper for all possible log entries for the `$trait` runtime. Provides binary-compatible @@ -650,7 +715,7 @@ macro_rules! impl_outer_log { #[allow(non_camel_case_types)] pub enum InternalLog { $( - $module($module::Log<$trait $(, $instance)? >), + $module($module::Log <$trait $(, $instance)?>), )* } @@ -662,8 +727,8 @@ macro_rules! impl_outer_log { fn dref<'a>(&'a self) -> Option<$crate::generic::DigestItemRef<'a, $($genarg),*>> { match self.0 { $($( - $internal::$module($module::RawLog::$sitem(ref v)) => - Some($crate::generic::DigestItemRef::$sitem(v)), + $crate::__parse_pattern_2!($sitem $module $internal a b) => + Some($crate::__parse_expr_2!($sitem $module $internal a b)), )*)* _ => None, } @@ -688,22 +753,31 @@ macro_rules! impl_outer_log { } impl From<$crate::generic::DigestItem<$($genarg),*>> for $name { - /// Converts `generic::DigestItem` into `$name`. If `generic::DigestItem` represents - /// a system item which is supported by the runtime, it is returned. - /// Otherwise we expect a `Other` log item. Trying to convert from anything other - /// will lead to panic in runtime, since the runtime does not supports this 'system' - /// log item. + /// Converts `generic::DigestItem` into `$name`. If + /// `generic::DigestItem` represents a system item which is + /// supported by the runtime, it is returned. Otherwise we expect a + /// `Other`, `PreDigest`, or `Consensus` log item. Trying to convert + /// from anything else will lead to panic at runtime, since the + /// runtime does not supports this 'system' log item. #[allow(unreachable_patterns)] fn from(gen: $crate::generic::DigestItem<$($genarg),*>) -> Self { match gen { $($( - $crate::generic::DigestItem::$sitem(value) => - $name($internal::$module($module::RawLog::$sitem(value))), + $crate::__parse_pattern!($sitem b, a) => + $name($crate::__parse_expr!($sitem b, $module $internal a)), )*)* - _ => gen.as_other() - .and_then(|value| $crate::codec::Decode::decode(&mut &value[..])) - .map($name) - .expect("not allowed to fail in runtime"), + _ => { + if let Some(s) = gen.as_other() + .and_then(|value| $crate::codec::Decode::decode(&mut &value[..])) + .map($name) + { + s + } else { + panic!("we only reach here if the runtime did not handle a digest; \ + runtimes are required to handle all digests they receive; qed" + ) + } + } } } } @@ -732,16 +806,16 @@ macro_rules! impl_outer_log { } $( - impl From<$module::Log<$trait $(, $instance)? >> for $name { + impl From<$module::Log<$trait $(, $instance)?>> for $name { /// Converts single module log item into `$name`. fn from(x: $module::Log<$trait $(, $instance)? >) -> Self { $name(x.into()) } } - impl From<$module::Log<$trait $(, $instance)? >> for InternalLog { + impl From<$module::Log<$trait $(, $instance)?>> for InternalLog { /// Converts single module log item into `$internal`. - fn from(x: $module::Log<$trait $(, $instance)? >) -> Self { + fn from(x: $module::Log<$trait $(, $instance)?>) -> Self { InternalLog::$module(x) } } diff --git a/core/sr-sandbox/without_std.rs b/core/sr-sandbox/without_std.rs index 070ca1ddf1..894ba43eb0 100755 --- a/core/sr-sandbox/without_std.rs +++ b/core/sr-sandbox/without_std.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use rstd::prelude::*; -use rstd::{slice, marker, mem}; +use rstd::{slice, marker, mem, vec}; use rstd::rc::Rc; use codec::{Decode, Encode}; use primitives::sandbox as sandbox_primitives; diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index b09fe7d787..19f5f36862 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -200,7 +200,7 @@ construct_runtime!( System: system::{default, Log(ChangesTrieRoot)}, Timestamp: timestamp::{Module, Call, Storage, Config, Inherent}, Consensus: consensus::{Module, Call, Storage, Config, Log(AuthoritiesChange), Inherent}, - Aura: aura::{Module}, + Aura: aura::{Module, Log(PreRuntime)}, Indices: indices, Balances: balances, Sudo: sudo, diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index e892ceda81..c31c6b41cc 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,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: 90, - impl_version: 91, + spec_version: 91, + impl_version: 92, apis: RUNTIME_API_VERSIONS, }; @@ -227,7 +227,7 @@ construct_runtime!( UncheckedExtrinsic = UncheckedExtrinsic { System: system::{default, Log(ChangesTrieRoot)}, - Aura: aura::{Module, Inherent(Timestamp)}, + Aura: aura::{Module, Inherent(Timestamp), Log(PreRuntime)}, Timestamp: timestamp::{Module, Call, Storage, Config, Inherent}, Consensus: consensus::{Module, Call, Storage, Config, Log(AuthoritiesChange), Inherent}, Indices: indices, diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index 3b557e2944..bc46e98ec2 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -51,15 +51,19 @@ pub use timestamp; use rstd::{result, prelude::*}; +use parity_codec::{Encode, Decode}; use srml_support::storage::StorageValue; use srml_support::{decl_storage, decl_module}; use primitives::traits::{SaturatedConversion, Saturating, Zero, One}; use timestamp::OnTimestampSet; +use rstd::marker::PhantomData; #[cfg(feature = "std")] use timestamp::TimestampInherentData; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; +#[cfg(feature = "std")] +use serde::Serialize; mod mock; mod tests; @@ -89,6 +93,20 @@ impl AuraInherentData for InherentData { } } +/// Logs in this module. +pub type Log = RawLog; + +/// Logs in this module. +/// +/// The type parameter distinguishes logs belonging to two different runtimes, +/// which should not be mixed. +#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[derive(Encode, Decode, PartialEq, Eq, Clone)] +pub enum RawLog { + /// AuRa inherent digests + PreRuntime([u8; 4], Vec, PhantomData), +} + /// Provides the slot duration inherent data for `Aura`. #[cfg(feature = "std")] pub struct InherentDataProvider { diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index 3e36481151..e969dee74b 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -17,19 +17,21 @@ //! Consensus extension module for BABE consensus. #![cfg_attr(not(feature = "std"), no_std)] -#![forbid(unsafe_code, warnings)] +#![forbid(unsafe_code)] pub use timestamp; -use rstd::{result, prelude::*}; +use rstd::{result, prelude::*, marker::PhantomData}; 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 parity_codec::{Encode, Decode}; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; +#[cfg(feature = "std")] +use serde::Serialize; /// The BABE inherent identifier. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"babeslot"; @@ -56,6 +58,20 @@ impl BabeInherentData for InherentData { } } +/// Logs in this module. +pub type Log = RawLog; + +/// Logs in this module. +/// +/// The type parameter distinguishes logs belonging to two different runtimes, +/// which should not be mixed. +#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[derive(Encode, Decode, PartialEq, Eq, Clone)] +pub enum RawLog { + /// BABE inherent digests + PreRuntime([u8; 4], Vec, PhantomData), +} + /// Provides the slot duration inherent data for BABE. #[cfg(feature = "std")] pub struct InherentDataProvider { diff --git a/srml/consensus/src/lib.rs b/srml/consensus/src/lib.rs index 696b9d75f4..4613981ec5 100644 --- a/srml/consensus/src/lib.rs +++ b/srml/consensus/src/lib.rs @@ -221,6 +221,7 @@ impl>> InherentOfflineReport for InstantFinalityRepo } } +/// Logs in this module. pub type Log = RawLog< ::SessionKey, >; diff --git a/srml/contract/src/account_db.rs b/srml/contract/src/account_db.rs index 5cae9f05dc..2421eab00a 100644 --- a/srml/contract/src/account_db.rs +++ b/srml/contract/src/account_db.rs @@ -177,10 +177,10 @@ impl AccountDb for DirectAccountDb { } pub struct OverlayAccountDb<'a, T: Trait + 'a> { local: RefCell>, - underlying: &'a AccountDb, + underlying: &'a dyn AccountDb, } impl<'a, T: Trait> OverlayAccountDb<'a, T> { - pub fn new(underlying: &'a AccountDb) -> OverlayAccountDb<'a, T> { + pub fn new(underlying: &'a dyn AccountDb) -> OverlayAccountDb<'a, T> { OverlayAccountDb { local: RefCell::new(ChangeSet::new()), underlying, -- GitLab From a7dd2559a7658f11eed101efdcfc26dd8b57a9b5 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 4 Jun 2019 16:09:46 +0200 Subject: [PATCH 069/140] Client::info() no longer returns a Result (#2776) --- core/cli/src/informant.rs | 133 +++++++++--------- core/client/db/src/lib.rs | 14 +- core/client/db/src/light.rs | 14 +- .../client/src/block_builder/block_builder.rs | 4 +- core/client/src/blockchain.rs | 2 +- core/client/src/client.rs | 61 ++++---- core/client/src/in_mem.rs | 6 +- core/client/src/light/blockchain.rs | 6 +- core/client/src/light/fetcher.rs | 8 +- core/consensus/aura/src/lib.rs | 2 +- core/consensus/babe/src/lib.rs | 2 +- core/finality-grandpa/src/environment.rs | 4 +- core/finality-grandpa/src/finality_proof.rs | 2 +- core/finality-grandpa/src/import.rs | 6 +- core/finality-grandpa/src/lib.rs | 27 ++-- core/finality-grandpa/src/light_import.rs | 9 +- core/finality-grandpa/src/observer.rs | 13 +- core/finality-grandpa/src/tests.rs | 26 ++-- core/network/src/chain.rs | 4 +- core/network/src/protocol.rs | 29 ++-- core/network/src/sync.rs | 16 +-- core/network/src/test/mod.rs | 12 +- core/network/src/test/sync.rs | 24 ++-- core/rpc/src/author/mod.rs | 4 +- core/rpc/src/chain/mod.rs | 8 +- core/rpc/src/state/mod.rs | 10 +- core/service/src/chain_ops.rs | 6 +- core/service/src/lib.rs | 9 +- core/service/test/src/lib.rs | 8 +- core/sr-api-macros/benches/bench.rs | 12 +- core/sr-api-macros/tests/runtime_calls.rs | 28 ++-- core/test-client/src/trait_tests.rs | 6 +- node/cli/src/service.rs | 2 +- 33 files changed, 239 insertions(+), 278 deletions(-) diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index 6149d6c95b..607ab9ae85 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -53,79 +53,76 @@ where C: Components { let display_notifications = network.status().for_each(move |sync_status| { - if let Ok(info) = client.info() { - 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); - last_update = time::Instant::now(); - let (status, target) = match (sync_status.sync.state, sync_status.sync.best_seen_block) { - (SyncState::Idle, _) => ("Idle".into(), "".into()), - (SyncState::Downloading, None) => (format!("Syncing{}", speed()), "".into()), - (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed()), format!(", target=#{}", n)), - }; - last_number = Some(best_number); - let txpool_status = txpool.status(); - 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!( - target: "substrate", - "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", - Colour::White.bold().paint(&status), - target, - Colour::White.bold().paint(format!("{}", sync_status.num_peers)), - Colour::White.paint(format!("{}", best_number)), - best_hash, - Colour::White.paint(format!("{}", finalized_number)), - info.chain.finalized_hash, - TransferRateFormat(bandwidth_download), - TransferRateFormat(bandwidth_upload), - ); - - #[allow(deprecated)] - 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 = network.network_state(); - - telemetry!( - SUBSTRATE_INFO; - "system.interval"; - "network_state" => network_state, - "status" => format!("{}{}", status, target), - "peers" => num_peers, - "height" => best_number, - "best" => ?best_hash, - "txcount" => txpool_status.ready, - "cpu" => cpu_usage, - "memory" => memory, - "finalized_height" => finalized_number, - "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"); - } + let info = client.info(); + 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); + last_update = time::Instant::now(); + let (status, target) = match (sync_status.sync.state, sync_status.sync.best_seen_block) { + (SyncState::Idle, _) => ("Idle".into(), "".into()), + (SyncState::Downloading, None) => (format!("Syncing{}", speed()), "".into()), + (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed()), format!(", target=#{}", n)), + }; + last_number = Some(best_number); + let txpool_status = txpool.status(); + 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!( + target: "substrate", + "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", + Colour::White.bold().paint(&status), + target, + Colour::White.bold().paint(format!("{}", sync_status.num_peers)), + Colour::White.paint(format!("{}", best_number)), + best_hash, + Colour::White.paint(format!("{}", finalized_number)), + info.chain.finalized_hash, + TransferRateFormat(bandwidth_download), + TransferRateFormat(bandwidth_upload), + ); + + #[allow(deprecated)] + 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 = network.network_state(); + + telemetry!( + SUBSTRATE_INFO; + "system.interval"; + "network_state" => network_state, + "status" => format!("{}{}", status, target), + "peers" => num_peers, + "height" => best_number, + "best" => ?best_hash, + "txcount" => txpool_status.ready, + "cpu" => cpu_usage, + "memory" => memory, + "finalized_height" => finalized_number, + "finalized_hash" => ?info.chain.finalized_hash, + "bandwidth_download" => bandwidth_download, + "bandwidth_upload" => bandwidth_upload, + "used_state_cache_size" => used_state_cache_size, + ); Ok(()) }); let client = service.client(); - let mut last = match client.info() { - Ok(info) => Some((info.chain.best_number, info.chain.best_hash)), - Err(e) => { warn!("Error getting best block information: {:?}", e); None } + let mut last = { + let info = client.info(); + Some((info.chain.best_number, info.chain.best_hash)) }; let display_block_import = client.import_notification_stream().for_each(move |n| { diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index dd38f10bcd..a253cc6783 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -271,15 +271,15 @@ impl client::blockchain::HeaderBackend for BlockchainDb Result, client::error::Error> { + fn info(&self) -> client::blockchain::Info { let meta = self.meta.read(); - Ok(client::blockchain::Info { + client::blockchain::Info { best_hash: meta.best_hash, best_number: meta.best_number, genesis_hash: meta.genesis_hash, finalized_hash: meta.finalized_hash, finalized_number: meta.finalized_number, - }) + } } fn status(&self, id: BlockId) -> Result { @@ -742,7 +742,7 @@ impl> Backend { } // insert all other headers + bodies + justifications - let info = self.blockchain.info().unwrap(); + let info = self.blockchain.info(); for (number, hash, header) in headers { let id = BlockId::Hash(hash); let justification = self.blockchain.justification(id).unwrap(); @@ -1258,8 +1258,8 @@ impl client::backend::Backend for Backend whe } fn revert(&self, n: NumberFor) -> Result, client::error::Error> { - let mut best = self.blockchain.info()?.best_number; - let finalized = self.blockchain.info()?.finalized_number; + 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 }; @@ -1463,7 +1463,7 @@ mod tests { }; let backend = Backend::::from_kvdb(backing, PruningMode::keep_blocks(1), 0, 16777216).unwrap(); - assert_eq!(backend.blockchain().info().unwrap().best_number, 9); + assert_eq!(backend.blockchain().info().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 16b0fc616a..e0f2153a13 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -155,15 +155,15 @@ impl BlockchainHeaderBackend for LightStorage utils::read_header(&*self.db, columns::KEY_LOOKUP, columns::HEADER, id) } - fn info(&self) -> ClientResult> { + fn info(&self) -> BlockchainInfo { let meta = self.meta.read(); - Ok(BlockchainInfo { + BlockchainInfo { best_hash: meta.best_hash, best_number: meta.best_number, genesis_hash: meta.genesis_hash, finalized_hash: meta.finalized_hash, finalized_number: meta.finalized_number, - }) + } } fn status(&self, id: BlockId) -> ClientResult { @@ -655,12 +655,12 @@ pub(crate) mod tests { fn returns_info() { let db = LightStorage::new_test(); let genesis_hash = insert_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); - let info = db.info().unwrap(); + let info = db.info(); assert_eq!(info.best_hash, genesis_hash); assert_eq!(info.best_number, 0); assert_eq!(info.genesis_hash, genesis_hash); let best_hash = insert_block(&db, HashMap::new(), || default_header(&genesis_hash, 1)); - let info = db.info().unwrap(); + let info = db.info(); assert_eq!(info.best_hash, best_hash); assert_eq!(info.best_number, 1); assert_eq!(info.genesis_hash, genesis_hash); @@ -1034,12 +1034,12 @@ pub(crate) mod tests { fn database_is_reopened() { let db = LightStorage::new_test(); let hash0 = insert_final_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); - assert_eq!(db.info().unwrap().best_hash, hash0); + assert_eq!(db.info().best_hash, hash0); assert_eq!(db.header(BlockId::Hash(hash0)).unwrap().unwrap().hash(), hash0); let db = db.db; let db = LightStorage::from_kvdb(db).unwrap(); - assert_eq!(db.info().unwrap().best_hash, hash0); + assert_eq!(db.info().best_hash, hash0); assert_eq!(db.header(BlockId::Hash::(hash0)).unwrap().unwrap().hash(), hash0); } diff --git a/core/client/src/block_builder/block_builder.rs b/core/client/src/block_builder/block_builder.rs index eb7d81f978..4564c29aae 100644 --- a/core/client/src/block_builder/block_builder.rs +++ b/core/client/src/block_builder/block_builder.rs @@ -44,9 +44,7 @@ where /// Create a new instance of builder from the given client, building on the /// latest block. pub fn new(api: &'a A, inherent_digests: DigestFor) -> error::Result { - api.info().and_then(|i| - Self::at_block(&BlockId::Hash(i.best_hash), api, false, inherent_digests) - ) + Self::at_block(&BlockId::Hash(api.info().best_hash), api, false, inherent_digests) } /// Create a new instance of builder from the given client using a diff --git a/core/client/src/blockchain.rs b/core/client/src/blockchain.rs index d168ecda19..05210fc9ad 100644 --- a/core/client/src/blockchain.rs +++ b/core/client/src/blockchain.rs @@ -30,7 +30,7 @@ pub trait HeaderBackend: Send + Sync { /// Get block header. Returns `None` if block is not found. fn header(&self, id: BlockId) -> Result>; /// Get blockchain info. - fn info(&self) -> Result>; + fn info(&self) -> Info; /// Get block status. fn status(&self, id: BlockId) -> Result; /// Get block number by hash. Returns `None` if the header is not in the chain. diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 1f19b96d3c..0d8f8aa548 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -497,7 +497,7 @@ impl Client where if first > last_num { return Err(error::Error::ChangesTrieAccessFailed("Invalid changes trie range".into())); } - let finalized_number = self.backend.blockchain().info()?.finalized_number; + let finalized_number = self.backend.blockchain().info().finalized_number; let oldest = storage.oldest_changes_trie_block(&config, finalized_number); let first = ::std::cmp::max(first, oldest); Ok(Some((first, last))) @@ -523,7 +523,7 @@ impl Client where hash: convert_hash(&last_hash), number: last_number, }, - self.backend.blockchain().info()?.best_number, + self.backend.blockchain().info().best_number, &key.0) .and_then(|r| r.map(|r| r.map(|(block, tx)| (block, tx))).collect::>()) .map_err(|err| error::Error::ChangesTrieAccessFailed(err)) @@ -608,7 +608,7 @@ impl Client where }; let max_number = ::std::cmp::min( - self.backend.blockchain().info()?.best_number, + self.backend.blockchain().info().best_number, self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(max))?, ); @@ -879,7 +879,7 @@ impl Client where } let (last_best, last_best_number) = { - let info = self.backend.blockchain().info()?; + let info = self.backend.blockchain().info(); (info.best_hash, info.best_number) }; @@ -1152,7 +1152,7 @@ impl Client where justification: Option, notify: bool, ) -> error::Result<()> { - let last_best = self.backend.blockchain().info()?.best_hash; + let last_best = self.backend.blockchain().info().best_hash; let to_finalize_hash = self.backend.blockchain().expect_block_hash_from_id(&id)?; self.apply_finality_with_block_hash(operation, to_finalize_hash, justification, last_best, notify) } @@ -1165,7 +1165,7 @@ impl Client where /// while performing major synchronization work. pub fn finalize_block(&self, id: BlockId, justification: Option, notify: bool) -> error::Result<()> { self.lock_import_and_run(|operation| { - let last_best = self.backend.blockchain().info()?.best_hash; + let last_best = self.backend.blockchain().info().best_hash; let to_finalize_hash = self.backend.blockchain().expect_block_hash_from_id(&id)?; self.apply_finality_with_block_hash(operation, to_finalize_hash, justification, last_best, notify) }) @@ -1178,13 +1178,13 @@ impl Client where } /// Get blockchain info. - pub fn info(&self) -> error::Result> { - let info = self.backend.blockchain().info().map_err(|e| error::Error::from_blockchain(Box::new(e)))?; - Ok(ClientInfo { + pub fn info(&self) -> ClientInfo { + let info = self.backend.blockchain().info(); + ClientInfo { chain: info, best_queued_hash: None, best_queued_number: None, - }) + } } /// Get block status. @@ -1246,7 +1246,7 @@ impl Client where } }; - let genesis_hash = self.backend.blockchain().info()?.genesis_hash; + let genesis_hash = self.backend.blockchain().info().genesis_hash; if genesis_hash == target_hash { return Ok(Vec::new()); } let mut current_hash = target_hash; @@ -1269,7 +1269,7 @@ impl Client where } fn changes_trie_config(&self) -> Result, Error> { - Ok(self.backend.state_at(BlockId::Number(self.backend.blockchain().info()?.best_number))? + Ok(self.backend.state_at(BlockId::Number(self.backend.blockchain().info().best_number))? .storage(well_known_keys::CHANGES_TRIE_CONFIG) .map_err(|e| error::Error::from_state(Box::new(e)))? .and_then(|c| Decode::decode(&mut &*c))) @@ -1298,7 +1298,7 @@ impl ChainHeaderBackend for Client wher self.backend.blockchain().header(id) } - fn info(&self) -> error::Result> { + fn info(&self) -> blockchain::Info { self.backend.blockchain().info() } @@ -1448,7 +1448,7 @@ impl CurrentHeight for Client where { type BlockNumber = ::Number; fn current_height(&self) -> Self::BlockNumber { - self.backend.blockchain().info().map(|i| i.best_number).unwrap_or_else(|_| Zero::zero()) + self.backend.blockchain().info().best_number } } @@ -1524,10 +1524,7 @@ where } fn best_block_header(&self) -> error::Result<::Header> { - let info : ChainInfo = match self.backend.blockchain().info() { - Ok(i) => i, - Err(e) => return Err(error::Error::from_blockchain(Box::new(e))) - }; + let info : ChainInfo = self.backend.blockchain().info(); Ok(self.backend.blockchain().header(BlockId::Hash(info.best_hash))? .expect("Best block header must always exist")) } @@ -1569,7 +1566,7 @@ where // 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 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())))?; @@ -1816,14 +1813,14 @@ pub(crate) mod tests { assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Alice.into() ).unwrap(), 1000 ); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Ferdie.into() ).unwrap(), 0 @@ -1838,7 +1835,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_number, 1); + assert_eq!(client.info().chain.best_number, 1); } #[test] @@ -1856,18 +1853,18 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_number, 1); + assert_eq!(client.info().chain.best_number, 1); assert!(client.state_at(&BlockId::Number(1)).unwrap().pairs() != client.state_at(&BlockId::Number(0)).unwrap().pairs()); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Alice.into() ).unwrap(), 958 ); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Ferdie.into() ).unwrap(), 42 @@ -1896,7 +1893,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_number, 1); + assert_eq!(client.info().chain.best_number, 1); assert!(client.state_at(&BlockId::Number(1)).unwrap().pairs() != client.state_at(&BlockId::Number(0)).unwrap().pairs()); assert_eq!(client.body(&BlockId::Number(1)).unwrap().unwrap().len(), 1) } @@ -1908,7 +1905,7 @@ pub(crate) mod tests { let client = test_client::new(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; #[allow(deprecated)] let longest_chain_select = test_client::client::LongestChain::new( client.backend().clone(), @@ -2029,7 +2026,7 @@ pub(crate) mod tests { let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; let uncles1 = client.uncles(a4.hash(), 10).unwrap(); assert_eq!(vec![b2.hash(), d2.hash()], uncles1); @@ -2065,7 +2062,7 @@ pub(crate) mod tests { let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; #[allow(deprecated)] let longest_chain_select = test_client::client::LongestChain::new( Arc::new(client.backend().as_in_memory()), @@ -2152,9 +2149,9 @@ pub(crate) mod tests { let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_hash, a5.hash()); + assert_eq!(client.info().chain.best_hash, a5.hash()); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; #[allow(deprecated)] let longest_chain_select = test_client::client::LongestChain::new( Arc::new(client.backend().as_in_memory()), @@ -2385,7 +2382,7 @@ pub(crate) mod tests { let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; #[allow(deprecated)] let longest_chain_select = test_client::client::LongestChain::new( Arc::new(client.backend().as_in_memory()), diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index 1172939b34..6c11d0ed57 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -297,15 +297,15 @@ impl HeaderBackend for Blockchain { })) } - fn info(&self) -> error::Result> { + fn info(&self) -> blockchain::Info { let storage = self.storage.read(); - Ok(blockchain::Info { + blockchain::Info { best_hash: storage.best_hash, best_number: storage.best_number, genesis_hash: storage.genesis_hash, finalized_hash: storage.finalized_hash, finalized_number: storage.finalized_number, - }) + } } fn status(&self, id: BlockId) -> error::Result { diff --git a/core/client/src/light/blockchain.rs b/core/client/src/light/blockchain.rs index b231f7e8aa..62c13db5a4 100644 --- a/core/client/src/light/blockchain.rs +++ b/core/client/src/light/blockchain.rs @@ -134,7 +134,7 @@ impl BlockchainHeaderBackend for Blockchain where Bloc } } - fn info(&self) -> ClientResult> { + fn info(&self) -> BlockchainInfo { self.storage.info() } @@ -223,8 +223,8 @@ pub mod tests { Err(ClientError::Backend("Test error".into())) } - fn info(&self) -> ClientResult> { - Err(ClientError::Backend("Test error".into())) + fn info(&self) -> Info { + panic!("Test error") } fn status(&self, _id: BlockId) -> ClientResult { diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index 0a8a05b850..f25a2acd30 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -668,8 +668,8 @@ pub mod tests { test_client::LocalExecutor::new(None) ); let local_checker = &local_checker as &FetchChecker; - let max = remote_client.info().unwrap().chain.best_number; - let max_hash = remote_client.info().unwrap().chain.best_hash; + let max = remote_client.info().chain.best_number; + let max_hash = remote_client.info().chain.best_hash; for (index, (begin, end, key, expected_result)) in test_cases.into_iter().enumerate() { let begin_hash = remote_client.block_hash(begin).unwrap().unwrap(); @@ -764,8 +764,8 @@ pub mod tests { test_client::LocalExecutor::new(None) ); let local_checker = &local_checker as &FetchChecker; - let max = remote_client.info().unwrap().chain.best_number; - let max_hash = remote_client.info().unwrap().chain.best_hash; + let max = remote_client.info().chain.best_number; + let max_hash = remote_client.info().chain.best_hash; let (begin, end, key, _) = test_cases[0].clone(); let begin_hash = remote_client.block_hash(begin).unwrap().unwrap(); diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 36c51c8cff..263381d5f1 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -943,7 +943,7 @@ mod tests { fn authorities_call_works() { let client = test_client::new(); - assert_eq!(client.info().unwrap().chain.best_number, 0); + assert_eq!(client.info().chain.best_number, 0); assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ Keyring::Alice.into(), Keyring::Bob.into(), diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 81b4be4137..969c7b8593 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -1058,7 +1058,7 @@ mod tests { drop(env_logger::try_init()); let client = test_client::new(); - assert_eq!(client.info().unwrap().chain.best_number, 0); + assert_eq!(client.info().chain.best_number, 0); assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ Keyring::Alice.into(), Keyring::Bob.into(), diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index ed50629f47..4aab32be8a 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -662,7 +662,7 @@ where #[allow(deprecated)] let blockchain = self.inner.backend().blockchain(); - let status = blockchain.info()?; + let status = blockchain.info(); if number <= status.finalized_number && blockchain.hash(number)? == Some(hash) { // This can happen after a forced change (triggered by the finality tracker when finality is stalled), since // the voter will be restarted at the median last finalized block, which can be lower than the local best @@ -812,7 +812,7 @@ pub(crate) fn finalize_block, E, RA>( // finalization to remote nodes if !justification_required { if let Some(justification_period) = justification_period { - let last_finalized_number = client.info()?.chain.finalized_number; + let last_finalized_number = client.info().chain.finalized_number; justification_required = (!last_finalized_number.is_zero() || number - last_finalized_number == justification_period) && (last_finalized_number / justification_period != number / justification_period); diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index 4ad1844358..e8af599279 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -268,7 +268,7 @@ pub(crate) fn prove_finality, B: BlockchainBackend, RA, PRA, SC> JustificationImport type Error = ConsensusError; fn on_start(&self, link: &::consensus_common::import_queue::Link) { - let chain_info = match self.inner.info() { - Ok(info) => info.chain, - _ => return, - }; + let chain_info = self.inner.info().chain; // request justifications for all pending changes for which change blocks have already been imported let authorities = self.authority_set.inner().read(); @@ -320,7 +317,6 @@ where #[allow(deprecated)] let best_finalized_number = self.inner.backend().blockchain().info() - .map_err(|e| ConsensusError::ClientImport(e.to_string()))? .finalized_number; let canon_number = best_finalized_number.min(median_last_finalized_number); diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index aee6c16d13..2a1da15499 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -316,7 +316,7 @@ where { use runtime_primitives::traits::Zero; - let chain_info = client.info()?; + let chain_info = client.info(); let genesis_hash = chain_info.chain.genesis_hash; let persistent_data = aux_schema::load_persistent( @@ -431,15 +431,13 @@ fn register_finality_tracker_inherent_data_provider Err(std::borrow::Cow::Owned(e.to_string())), - Ok(info) => { - telemetry!(CONSENSUS_INFO; "afg.finalized"; - "finalized_number" => ?info.finalized_number, - "finalized_hash" => ?info.finalized_hash, - ); - Ok(info.finalized_number) - }, + { + let info = client.backend().blockchain().info(); + telemetry!(CONSENSUS_INFO; "afg.finalized"; + "finalized_number" => ?info.finalized_number, + "finalized_hash" => ?info.finalized_hash, + ); + Ok(info.finalized_number) } })) .map_err(|err| consensus_common::Error::InherentData(err.into())) @@ -579,10 +577,7 @@ pub fn run_grandpa_voter, N, RA, SC, X>( let mut maybe_voter = match &*env.voter_set_state.read() { VoterSetState::Live { completed_rounds, .. } => { - let chain_info = match client.info() { - Ok(i) => i, - Err(e) => return future::Either::B(future::err(Error::Client(e))), - }; + let chain_info = client.info(); let last_finalized = ( chain_info.chain.finalized_hash, @@ -691,7 +686,7 @@ pub fn run_grandpa_voter, N, RA, SC, X>( } }; - future::Either::A(poll_voter.select2(voter_commands_rx).then(move |res| match res { + poll_voter.select2(voter_commands_rx).then(move |res| match res { Ok(future::Either::A(((), _))) => { // voters don't conclude naturally; this could reasonably be an error. Ok(FutureLoop::Break(())) @@ -716,7 +711,7 @@ pub fn run_grandpa_voter, N, RA, SC, X>( // some command issued internally. handle_voter_command(command, voter_commands_rx) }, - })) + }) }); let voter_work = voter_work diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index 9e257e9ccc..73bc3411fe 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -63,7 +63,7 @@ pub fn light_block_import, RA, PRA>( PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, { - let info = client.info()?; + let info = client.info(); #[allow(deprecated)] let import_data = load_aux_import_data(info.chain.finalized_hash, &**client.backend(), api)?; Ok(GrandpaLightBlockImport { @@ -145,10 +145,7 @@ impl, RA> FinalityProofImport 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 chain_info = self.client.info().chain; let data = self.data.read(); for (pending_number, pending_hash) in data.consensus_changes.pending_changes() { @@ -620,7 +617,7 @@ pub mod tests { origin: BlockOrigin::Own, header: Header { number: 1, - parent_hash: client.info().unwrap().chain.best_hash, + parent_hash: client.info().chain.best_hash, state_root: Default::default(), digest: Default::default(), extrinsics_root: Default::default(), diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index 3fc9665a8d..f172e58ee9 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -31,7 +31,7 @@ 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, + LinkHalf, Network, aux_schema::PersistentData, VoterCommand, VoterSetState, }; use crate::authorities::SharedAuthoritySet; use crate::communication::NetworkBridge; @@ -191,12 +191,7 @@ pub fn run_grandpa_observer, N, RA, SC>( &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; + let last_finalized_number = client.info().chain.finalized_number; // create observer for the current set let observer = grandpa_observer( @@ -250,7 +245,7 @@ pub fn run_grandpa_observer, N, RA, SC>( }; // run observer and listen to commands (switch authorities or pause) - future::Either::A(observer.select2(voter_commands_rx).then(move |res| match res { + 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(())) @@ -275,7 +270,7 @@ pub fn run_grandpa_observer, N, RA, SC>( // some command issued internally handle_voter_command(command, voter_commands_rx) }, - })) + }) }); let observer_work = observer_work diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 5b4fa9155a..ef04396b5f 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -561,7 +561,7 @@ fn finalize_3_voters_no_observers() { net.sync(); for i in 0..3 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 20, + assert_eq!(net.peer(i).client().info().chain.best_number, 20, "Peer #{} failed to sync", i); } @@ -673,7 +673,7 @@ fn transition_3_voters_twice_1_full_observer() { for (i, peer) in net.lock().peers().iter().enumerate() { 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, + assert_eq!(full_client.info().chain.best_number, 1, "Peer #{} failed to sync", i); let set: AuthoritySet = crate::aux_schema::load_authorities( @@ -895,7 +895,7 @@ fn sync_justifications_on_change_blocks() { net.sync(); for i in 0..4 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 25, + assert_eq!(net.peer(i).client().info().chain.best_number, 25, "Peer #{} failed to sync", i); } @@ -966,7 +966,7 @@ fn finalizes_multiple_pending_changes_in_order() { // all peers imported both change blocks for i in 0..6 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 30, + assert_eq!(net.peer(i).client().info().chain.best_number, 30, "Peer #{} failed to sync", i); } @@ -986,7 +986,7 @@ fn doesnt_vote_on_the_tip_of_the_chain() { net.sync(); for i in 0..3 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 100, + assert_eq!(net.peer(i).client().info().chain.best_number, 100, "Peer #{} failed to sync", i); } @@ -1016,7 +1016,7 @@ fn force_change_to_new_set() { { // add a forced transition at block 12. - let parent_hash = net.lock().peer(0).client().info().unwrap().chain.best_hash; + let parent_hash = net.lock().peer(0).client().info().chain.best_hash; forced_transitions.lock().insert(parent_hash, (0, ScheduledChange { next_authorities: voters.clone(), delay: 10, @@ -1033,7 +1033,7 @@ fn force_change_to_new_set() { net.lock().sync(); for (i, peer) in net.lock().peers().iter().enumerate() { - assert_eq!(peer.client().info().unwrap().chain.best_number, 26, + assert_eq!(peer.client().info().chain.best_number, 26, "Peer #{} failed to sync", i); let full_client = peer.client().as_full().expect("only full clients are used in test"); @@ -1172,7 +1172,7 @@ fn voter_persists_its_votes() { net.peer(0).push_blocks(20, false); net.sync(); - assert_eq!(net.peer(0).client().info().unwrap().chain.best_number, 20, + assert_eq!(net.peer(0).client().info().chain.best_number, 20, "Peer #{} failed to sync", 0); let mut runtime = current_thread::Runtime::new().unwrap(); @@ -1289,7 +1289,7 @@ fn voter_persists_its_votes() { net.lock().peer(0).push_blocks(20, false); net.lock().sync(); - assert_eq!(net.lock().peer(0).client().info().unwrap().chain.best_number, 40, + assert_eq!(net.lock().peer(0).client().info().chain.best_number, 40, "Peer #{} failed to sync", 0); #[allow(deprecated)] @@ -1366,7 +1366,7 @@ fn finalize_3_voters_1_light_observer() { net.sync(); for i in 0..4 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 20, + assert_eq!(net.peer(i).client().info().chain.best_number, 20, "Peer #{} failed to sync", i); } @@ -1412,7 +1412,7 @@ fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { 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 { + while net.lock().peer(1).client().info().chain.finalized_number != 1 { net.lock().tick_peer(1); net.lock().sync_without_disconnects(); } @@ -1455,7 +1455,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ // add a forced transition at block 5. if FORCE_CHANGE { - let parent_hash = net.lock().peer(0).client().info().unwrap().chain.best_hash; + let parent_hash = net.lock().peer(0).client().info().chain.best_hash; forced_transitions.lock().insert(parent_hash, (0, ScheduledChange { next_authorities: voters.clone(), delay: 3, @@ -1482,7 +1482,7 @@ fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_differ // check block, finalized on light client assert_eq!( - runner_net.lock().peer(3).client().info().unwrap().chain.finalized_number, + runner_net.lock().peer(3).client().info().chain.finalized_number, if FORCE_CHANGE { 0 } else { 10 }, ); } diff --git a/core/network/src/chain.rs b/core/network/src/chain.rs index f7ce4f9d5c..76096a44aa 100644 --- a/core/network/src/chain.rs +++ b/core/network/src/chain.rs @@ -28,7 +28,7 @@ use primitives::{H256, Blake2Hasher, storage::StorageKey}; /// Local client abstraction for the network. pub trait Client: Send + Sync { /// Get blockchain info. - fn info(&self) -> Result, Error>; + fn info(&self) -> ClientInfo; /// Get block status. fn block_status(&self, id: &BlockId) -> Result; @@ -81,7 +81,7 @@ impl Client for SubstrateClient where Block: BlockT, RA: Send + Sync { - fn info(&self) -> Result, Error> { + fn info(&self) -> ClientInfo { (self as &SubstrateClient).info() } diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index e1fa38576a..b660e097a1 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -399,7 +399,7 @@ impl, H: ExHashT> Protocol { checker: Arc>, specialization: S, ) -> error::Result> { - let info = chain.info()?; + let info = chain.info(); let sync = ChainSync::new(config.roles, &info); Ok(Protocol { tick_timeout: tokio_timer::Interval::new_interval(TICK_TIMEOUT), @@ -861,8 +861,7 @@ impl, H: ExHashT> Protocol { .context_data .chain .info() - .ok() - .and_then(|info| info.best_queued_number) + .best_queued_number .unwrap_or_else(|| Zero::zero()); let blocks_difference = self_best_block .checked_sub(&status.best_number) @@ -1008,18 +1007,18 @@ impl, H: ExHashT> Protocol { /// Send Status message 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, - min_supported_version: MIN_VERSION, - genesis_hash: info.chain.genesis_hash, - roles: self.config.roles.into(), - best_number: info.chain.best_number, - best_hash: info.chain.best_hash, - chain_status: self.specialization.status(), - }; - self.send_message(network_out, who, GenericMessage::Status(status)) - } + let info = self.context_data.chain.info(); + let status = message::generic::Status { + version: CURRENT_VERSION, + min_supported_version: MIN_VERSION, + genesis_hash: info.chain.genesis_hash, + roles: self.config.roles.into(), + best_number: info.chain.best_number, + best_hash: info.chain.best_hash, + chain_status: self.specialization.status(), + }; + + self.send_message(network_out, who, GenericMessage::Status(status)) } fn on_block_announce( diff --git a/core/network/src/sync.rs b/core/network/src/sync.rs index e451372847..27a412ca0e 100644 --- a/core/network/src/sync.rs +++ b/core/network/src/sync.rs @@ -829,18 +829,10 @@ impl ChainSync { self.queue_blocks.clear(); self.best_importing_number = Zero::zero(); self.blocks.clear(); - match protocol.client().info() { - Ok(info) => { - self.best_queued_hash = info.best_queued_hash.unwrap_or(info.chain.best_hash); - self.best_queued_number = info.best_queued_number.unwrap_or(info.chain.best_number); - debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); - }, - Err(e) => { - debug!(target:"sync", "Error reading blockchain: {:?}", e); - self.best_queued_hash = self.genesis_hash; - self.best_queued_number = Zero::zero(); - } - } + let info = protocol.client().info(); + self.best_queued_hash = info.best_queued_hash.unwrap_or(info.chain.best_hash); + self.best_queued_number = info.best_queued_number.unwrap_or(info.chain.best_number); + debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); let ids: Vec = self.peers.drain().map(|(id, _)| id).collect(); for id in ids { self.new_peer(protocol, id); diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 6103a6ecd9..b47cef11ac 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -163,7 +163,7 @@ impl PeersClient { } } - pub fn info(&self) -> ClientResult> { + pub fn info(&self) -> ClientInfo { match *self { PeersClient::Full(ref client) => client.info(), PeersClient::Light(ref client) => client.info(), @@ -465,7 +465,7 @@ impl> Peer { /// Called after blockchain has been populated to updated current state. fn start(&self) { // Update the sync state to the latest chain state. - let info = self.client.info().expect("In-mem client does not fail"); + let info = self.client.info(); let header = self .client .header(&BlockId::Hash(info.chain.best_hash)) @@ -538,7 +538,7 @@ impl> Peer { /// Send block import notifications. fn send_import_notifications(&self) { - let info = self.client.info().expect("In-mem client does not fail"); + let info = self.client.info(); let mut best_hash = self.best_hash.lock(); match *best_hash { @@ -554,7 +554,7 @@ impl> Peer { /// Send block finalization notifications. fn send_finality_notifications(&self) { - let info = self.client.info().expect("In-mem client does not fail"); + let info = self.client.info(); let mut finalized_hash = self.finalized_hash.lock(); match *finalized_hash { @@ -625,7 +625,7 @@ impl> Peer { pub fn generate_blocks(&self, count: usize, origin: BlockOrigin, edit_block: F) -> H256 where F: FnMut(BlockBuilder) -> Block { - let best_hash = self.client.info().unwrap().chain.best_hash; + let best_hash = self.client.info().chain.best_hash; self.generate_blocks_at(BlockId::Hash(best_hash), count, origin, edit_block) } @@ -674,7 +674,7 @@ impl> Peer { /// Push blocks to the peer (simplified: with or without a TX) pub fn push_blocks(&self, count: usize, with_tx: bool) -> H256 { - let best_hash = self.client.info().unwrap().chain.best_hash; + let best_hash = self.client.info().chain.best_hash; self.push_blocks_at(BlockId::Hash(best_hash), count, with_tx) } diff --git a/core/network/src/test/sync.rs b/core/network/src/test/sync.rs index 50b00ac62a..1e9e2948f3 100644 --- a/core/network/src/test/sync.rs +++ b/core/network/src/test/sync.rs @@ -320,8 +320,8 @@ fn own_blocks_are_announced() { net.peer(0).on_block_imported(header.hash(), &header); net.sync(); - 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); + assert_eq!(net.peer(0).client.as_in_memory_backend().blockchain().info().best_number, 1); + assert_eq!(net.peer(1).client.as_in_memory_backend().blockchain().info().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)); @@ -356,9 +356,9 @@ fn blocks_are_not_announced_by_light_nodes() { // peer 0 has the best chain // peer 1 has the best chain // peer 2 has genesis-chain only - 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); + assert_eq!(net.peer(0).client.info().chain.best_number, 1); + assert_eq!(net.peer(1).client.info().chain.best_number, 1); + assert_eq!(net.peer(2).client.info().chain.best_number, 0); } #[test] @@ -371,13 +371,13 @@ fn can_sync_small_non_best_forks() { // small fork + reorg on peer 1. net.peer(0).push_blocks_at(BlockId::Number(30), 2, true); - let small_hash = net.peer(0).client().info().unwrap().chain.best_hash; + let small_hash = net.peer(0).client().info().chain.best_hash; net.peer(0).push_blocks_at(BlockId::Number(30), 10, false); - assert_eq!(net.peer(0).client().info().unwrap().chain.best_number, 40); + assert_eq!(net.peer(0).client().info().chain.best_number, 40); // peer 1 only ever had the long fork. net.peer(1).push_blocks(10, false); - assert_eq!(net.peer(1).client().info().unwrap().chain.best_number, 40); + assert_eq!(net.peer(1).client().info().chain.best_number, 40); 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_none()); @@ -386,7 +386,7 @@ fn can_sync_small_non_best_forks() { // synchronization: 0 synced to longer chain and 1 didn't sync to small chain. - assert_eq!(net.peer(0).client().info().unwrap().chain.best_number, 40); + assert_eq!(net.peer(0).client().info().chain.best_number, 40); 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()); @@ -416,8 +416,8 @@ fn can_not_sync_from_light_peer() { 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; + let full0_info = net.peer(0).client.info().chain; + let light_info = net.peer(1).client.info().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); @@ -430,7 +430,7 @@ fn can_not_sync_from_light_peer() { 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); + assert_eq!(net.peer(2).client.info().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); diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index 59641e8466..4e3bc96ca9 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -110,7 +110,7 @@ impl AuthorApi, BlockHash

> for Author whe fn submit_extrinsic(&self, ext: Bytes) -> Result> { let xt = Decode::decode(&mut &ext[..]).ok_or(error::Error::BadFormat)?; - let best_block_hash = self.client.info()?.chain.best_hash; + 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() @@ -144,7 +144,7 @@ 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 best_block_hash = self.client.info().chain.best_hash; let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..]) .ok_or(error::Error::BadFormat)?; self.pool diff --git a/core/rpc/src/chain/mod.rs b/core/rpc/src/chain/mod.rs index 9dd7ad84b8..90c833e3fd 100644 --- a/core/rpc/src/chain/mod.rs +++ b/core/rpc/src/chain/mod.rs @@ -124,7 +124,7 @@ impl Chain where { fn unwrap_or_best(&self, hash: Option) -> Result { Ok(match hash.into() { - None => self.client.info()?.chain.best_hash, + None => self.client.info().chain.best_hash, Some(hash) => hash, }) } @@ -188,13 +188,13 @@ impl ChainApi, Block::Hash, Block::Header, Sig fn block_hash(&self, number: Option>>) -> Result> { Ok(match number { - None => Some(self.client.info()?.chain.best_hash), + 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()), }) } fn finalized_head(&self) -> Result { - Ok(self.client.info()?.chain.finalized_hash) + Ok(self.client.info().chain.finalized_hash) } fn subscribe_new_head(&self, _metadata: Self::Metadata, subscriber: Subscriber) { @@ -214,7 +214,7 @@ impl ChainApi, Block::Hash, Block::Header, Sig fn subscribe_finalized_heads(&self, _meta: Self::Metadata, subscriber: Subscriber) { self.subscribe_headers( subscriber, - || Ok(Some(self.client.info()?.chain.finalized_hash)), + || Ok(Some(self.client.info().chain.finalized_hash)), || self.client.finality_notification_stream() .map(|notification| notification.header), ) diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs index 98d62d678d..ebb45d6b5f 100644 --- a/core/rpc/src/state/mod.rs +++ b/core/rpc/src/state/mod.rs @@ -322,7 +322,7 @@ impl State where E: CallExecutor, { fn unwrap_or_best(&self, hash: Option) -> Result { - crate::helpers::unwrap_or_else(|| Ok(self.client.info()?.chain.best_hash), hash) + crate::helpers::unwrap_or_else(|| Ok(self.client.info().chain.best_hash), hash) } } @@ -449,7 +449,7 @@ impl StateApi for State where // initial values let initial = stream::iter_result(keys .map(|keys| { - let block = self.client.info().map(|info| info.chain.best_hash).unwrap_or_default(); + let block = self.client.info().chain.best_hash; let changes = keys .into_iter() .map(|key| self.storage(key.clone(), Some(block.clone()).into()) @@ -506,9 +506,9 @@ impl StateApi for State where let stream = stream .map_err(|e| warn!("Error creating storage notification stream: {:?}", e)) .filter_map(move |_| { - let version = client.info().and_then(|info| { - client.runtime_version_at(&BlockId::hash(info.chain.best_hash)) - }) + let info = client.info(); + let version = client + .runtime_version_at(&BlockId::hash(info.chain.best_hash)) .map_err(error::Error::from) .map_err(Into::into); if previous_version != version { diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index 4df3b06cdf..3be3b9b17a 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -52,7 +52,7 @@ pub fn export_blocks( let last = match to { Some(v) if v.is_zero() => One::one(), Some(v) => v, - None => client.info()?.chain.best_number, + None => client.info().chain.best_number, }; if last < block { @@ -186,7 +186,7 @@ pub fn import_blocks( blocks_imported += 1; } - info!("Imported {} blocks. Best: #{}", block_count, client.info()?.chain.best_number); + info!("Imported {} blocks. Best: #{}", block_count, client.info().chain.best_number); Ok(()) } @@ -200,7 +200,7 @@ pub fn revert_chain( { let client = new_client::(&config)?; let reverted = client.revert(blocks)?; - let info = client.info()?.chain; + let info = client.info().chain; if reverted.is_zero() { info!("There aren't any non-finalized blocks to revert."); diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index cb65ece34e..0e16d2e7be 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -156,7 +156,7 @@ impl Service { select_chain.clone(), )?); let finality_proof_provider = Components::build_finality_proof_provider(client.clone())?; - let chain_info = client.info()?.chain; + let chain_info = client.info().chain; let version = config.full_version(); info!("Highest known block at #{}", chain_info.best_number); @@ -479,12 +479,7 @@ pub struct TransactionPoolAdapter { impl TransactionPoolAdapter { fn best_block_id(&self) -> Option>> { - self.client.info() - .map(|info| BlockId::hash(info.chain.best_hash)) - .map_err(|e| { - debug!("Error getting best block: {:?}", e); - }) - .ok() + Some(BlockId::hash(self.client.info().chain.best_hash)) } } diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index 88425e1956..9b73cfa14c 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -250,11 +250,11 @@ where 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 == NUM_BLOCKS.into() + service.client().info().chain.best_number == NUM_BLOCKS.into() ); info!("Checking extrinsic propagation"); let first_service = network.full_nodes[0].1.clone(); - let best_block = BlockId::number(first_service.client().info().unwrap().chain.best_number); + let best_block = BlockId::number(first_service.client().info().chain.best_number); first_service.transaction_pool().submit_one(&best_block, extrinsic_factory(&first_service)).unwrap(); network.run_until_all_full(|_index, service| service.transaction_pool().ready().count() == 1 @@ -278,7 +278,7 @@ pub fn consensus(spec: FactoryChainSpec, authorities: Vec) 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 >= (NUM_BLOCKS / 2).into() + service.client().info().chain.finalized_number >= (NUM_BLOCKS / 2).into() }); info!("Adding more peers"); network.insert_nodes(&temp, NUM_NODES / 2, 0, vec![]); @@ -286,6 +286,6 @@ pub fn consensus(spec: FactoryChainSpec, authorities: Vec) 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 >= NUM_BLOCKS.into() + service.client().info().chain.finalized_number >= NUM_BLOCKS.into() ); } diff --git a/core/sr-api-macros/benches/bench.rs b/core/sr-api-macros/benches/bench.rs index f467721789..55399fb4d8 100644 --- a/core/sr-api-macros/benches/bench.rs +++ b/core/sr-api-macros/benches/bench.rs @@ -23,14 +23,14 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("add one with same runtime api", |b| { let client = test_client::new(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| runtime_api.benchmark_add_one(&block_id, &1)) }); c.bench_function("add one with recreating runtime api", |b| { let client = test_client::new(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_add_one(&block_id, &1)) }); @@ -38,7 +38,7 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("vector add one with same runtime api", |b| { let client = test_client::new(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); let data = vec![0; 1000]; b.iter_with_large_drop(|| runtime_api.benchmark_vector_add_one(&block_id, &data)) @@ -46,7 +46,7 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("vector add one with recreating runtime api", |b| { let client = test_client::new(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); let data = vec![0; 1000]; b.iter_with_large_drop(|| client.runtime_api().benchmark_vector_add_one(&block_id, &data)) @@ -54,13 +54,13 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("calling function by function pointer in wasm", |b| { let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_indirect_call(&block_id).unwrap()) }); c.bench_function("calling function in wasm", |b| { let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_direct_call(&block_id).unwrap()) }); } diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index ff462d9e2a..f4d87ca8ca 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -34,7 +34,7 @@ use codec::Encode; fn calling_function_with_strat(strat: ExecutionStrategy) { let client = test_client::new_with_execution_strategy(strat); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.benchmark_add_one(&block_id, &1).unwrap(), 2); } @@ -54,7 +54,7 @@ fn calling_wasm_runtime_function() { fn calling_native_runtime_function_with_non_decodable_parameter() { let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); runtime_api.fail_convert_parameter(&block_id, DecodeFails::new()).unwrap(); } @@ -63,7 +63,7 @@ fn calling_native_runtime_function_with_non_decodable_parameter() { fn calling_native_runtime_function_with_non_decodable_return_value() { let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); runtime_api.fail_convert_return_value(&block_id).unwrap(); } @@ -71,7 +71,7 @@ fn calling_native_runtime_function_with_non_decodable_return_value() { fn calling_native_runtime_signature_changed_function() { let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.function_signature_changed(&block_id).unwrap(), 1); } @@ -80,7 +80,7 @@ fn calling_native_runtime_signature_changed_function() { fn calling_wasm_runtime_signature_changed_old_function() { let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); #[allow(deprecated)] let res = runtime_api.function_signature_changed_before_version_2(&block_id).unwrap(); @@ -91,7 +91,7 @@ fn calling_wasm_runtime_signature_changed_old_function() { fn calling_with_both_strategy_and_fail_on_wasm_should_return_error() { 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); + let block_id = BlockId::Number(client.info().chain.best_number); assert!(runtime_api.fail_on_wasm(&block_id).is_err()); } @@ -99,7 +99,7 @@ fn calling_with_both_strategy_and_fail_on_wasm_should_return_error() { fn calling_with_both_strategy_and_fail_on_native_should_work() { 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); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_native(&block_id).unwrap(), 1); } @@ -108,7 +108,7 @@ fn calling_with_both_strategy_and_fail_on_native_should_work() { fn calling_with_native_else_wasm_and_faild_on_wasm_should_work() { let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeElseWasm); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_wasm(&block_id).unwrap(), 1); } @@ -116,7 +116,7 @@ fn calling_with_native_else_wasm_and_faild_on_wasm_should_work() { fn calling_with_native_else_wasm_and_fail_on_native_should_work() { let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeElseWasm); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_native(&block_id).unwrap(), 1); } @@ -124,7 +124,7 @@ fn calling_with_native_else_wasm_and_fail_on_native_should_work() { fn use_trie_function() { let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.use_trie(&block_id).unwrap(), 2); } @@ -132,7 +132,7 @@ fn use_trie_function() { 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); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.get_block_number(&block_id).unwrap(), 1); } @@ -140,7 +140,7 @@ fn initialize_block_works() { 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); + let block_id = BlockId::Number(client.info().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); } @@ -149,7 +149,7 @@ fn initialize_block_is_called_only_once() { 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); + let block_id = BlockId::Number(client.info().chain.best_number); assert!(runtime_api.without_initialize_block(&block_id).unwrap()); } @@ -157,7 +157,7 @@ fn initialize_block_is_skipped() { 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 block_id = BlockId::Number(client.info().chain.best_number); #[allow(deprecated)] let storage_root = LongestChain::new(client.backend().clone(), client.import_lock()) .best_chain().unwrap().state_root().clone(); diff --git a/core/test-client/src/trait_tests.rs b/core/test-client/src/trait_tests.rs index c1df6ffdf8..a7ef1a01f6 100644 --- a/core/test-client/src/trait_tests.rs +++ b/core/test-client/src/trait_tests.rs @@ -43,7 +43,7 @@ pub fn test_leaves_for_backend(backend: Arc) where let client = new_with_backend(backend.clone(), false); let blockchain = backend.blockchain(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; assert_eq!( blockchain.leaves().unwrap(), @@ -223,7 +223,7 @@ pub fn test_children_for_backend(backend: Arc) where let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; let children1 = blockchain.children(a4.hash()).unwrap(); assert_eq!(vec![a5.hash()], children1); @@ -313,7 +313,7 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc = vec![&*alice, &*bob]; let dummy_runtime = ::tokio::runtime::Runtime::new().unwrap(); let block_factory = |service: &::FullService| { - let block_id = BlockId::number(service.client().info().unwrap().chain.best_number); + let block_id = BlockId::number(service.client().info().chain.best_number); let parent_header = service.client().header(&block_id).unwrap().unwrap(); let consensus_net = ConsensusNetwork::new(service.network(), service.client().clone()); let proposer_factory = consensus::ProposerFactory { -- GitLab From e8739300ae3f7f2e7b72f64668573275f2806ea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 4 Jun 2019 18:43:55 +0200 Subject: [PATCH 070/140] JSON-RPC client generation (#2778) * Bump jsonrpc & generate clients. * Initial version of JSON-RPC client. * Re-wort * Remove spurious `#[derive(Encode, Decode)]` They did not compile, since `Encode` and `Decode` are deliberately not implemented for `usize`. Fixes #2742. * Re-write rpc-client example. * Update to jsonrpc=12.0.0 * Remove unnecessary import * Bump version. * Revert version bump. * Bump again. --- Cargo.lock | 177 ++++++++++++++++++++++++--------- Cargo.toml | 1 + core/rpc-servers/Cargo.toml | 6 +- core/rpc-servers/src/lib.rs | 6 +- core/rpc/Cargo.toml | 7 +- core/rpc/src/author/hash.rs | 6 +- core/rpc/src/author/mod.rs | 15 +-- core/rpc/src/chain/error.rs | 3 + core/rpc/src/chain/mod.rs | 23 +++-- core/rpc/src/chain/number.rs | 6 +- core/rpc/src/state/error.rs | 5 + core/rpc/src/state/mod.rs | 23 +++-- core/rpc/src/system/helpers.rs | 6 +- core/rpc/src/system/mod.rs | 4 +- core/sr-version/src/lib.rs | 4 +- node/rpc-client/Cargo.toml | 14 +++ node/rpc-client/src/main.rs | 70 +++++++++++++ node/runtime/src/lib.rs | 2 +- 18 files changed, 282 insertions(+), 96 deletions(-) create mode 100644 node/rpc-client/Cargo.toml create mode 100644 node/rpc-client/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 7f8f7bd555..a1b630d428 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1267,9 +1267,25 @@ dependencies = [ "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "jsonrpc-client-transports" +version = "12.0.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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.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.91 (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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "jsonrpc-core" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1279,11 +1295,20 @@ dependencies = [ "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "jsonrpc-core-client" +version = "12.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "jsonrpc-client-transports 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "jsonrpc-derive" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1291,36 +1316,37 @@ dependencies = [ [[package]] name = "jsonrpc-http-server" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hyper 0.12.29 (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)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 12.0.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-pubsub" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-server-utils" -version = "10.1.0" +version = "12.0.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)", "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)", + "jsonrpc-core 12.0.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.10.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1331,16 +1357,15 @@ dependencies = [ [[package]] name = "jsonrpc-ws-server" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "error-chain 0.12.1 (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)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 12.0.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)", + "parking_lot 0.8.0 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1832,6 +1857,14 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.3.9" @@ -2097,6 +2130,19 @@ dependencies = [ "substrate-serializer 2.0.0", ] +[[package]] +name = "node-rpc-client" +version = "2.0.0" +dependencies = [ + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core-client 12.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 2.0.0", + "substrate-rpc 2.0.0", +] + [[package]] name = "node-runtime" version = "2.0.0" @@ -2383,23 +2429,6 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parity-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.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.19 (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" @@ -2427,6 +2456,16 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" @@ -2462,6 +2501,21 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.54 (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.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.5" @@ -2952,6 +3006,11 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "scopeguard" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "security-framework" version = "0.3.1" @@ -4316,9 +4375,10 @@ dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.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-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)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core-client 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-derive 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 12.0.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.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)", @@ -4344,9 +4404,9 @@ dependencies = [ name = "substrate-rpc-servers" version = "2.0.0" dependencies = [ - "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)", + "jsonrpc-http-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-ws-server 12.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.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -5032,7 +5092,7 @@ name = "twox-hash" version = "1.3.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)", + "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5429,6 +5489,23 @@ dependencies = [ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ws" +version = "0.8.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)", + "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.19 (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)", + "sha-1 0.8.1 (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" @@ -5643,12 +5720,14 @@ dependencies = [ "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" "checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" -"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 jsonrpc-client-transports 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0245e08f98d627a579cdee6a2138d05ab64f6093efbcdeec50805d121ee13c0c" +"checksum jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "288dca7f9713710a29e485076b9340156cb701edb46a881f5d0c31aa4f5b9143" +"checksum jsonrpc-core-client 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05e499e393aaa97cf5ff3a7444549c94a6d27e70be1c300b865187d722f1b426" +"checksum jsonrpc-derive 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b65eafb36286a4251c9a1d4cdf4e9a7cf8fa4f7bf991383e42f0cf26908767" +"checksum jsonrpc-http-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea8b3996f19dc6dd90d928c81d30b3ce9535840487734290da9fae3b3185db5d" +"checksum jsonrpc-pubsub 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fcdd238ecccde73faea93760b068f3fe3ca84caeb6b5414c2aabd4f008dad418" +"checksum jsonrpc-server-utils 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "036a53ffa47533dcccf1e1bb16abb0f45ef9a2dc9a63654d2d2cd199b80ad33e" +"checksum jsonrpc-ws-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "977ea40f077c027553e4112d750114b9e5cc7bcf5642512838abc2a9b322bd23" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "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" @@ -5684,6 +5763,7 @@ dependencies = [ "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 lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "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" @@ -5726,13 +5806,14 @@ dependencies = [ "checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "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 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "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 parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" "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" @@ -5790,6 +5871,7 @@ dependencies = [ "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 scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" "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" @@ -5920,6 +6002,7 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ec91ea61b83ce033c43c06c52ddc7532f465c0153281610d44c58b74083aee1a" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "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" diff --git a/Cargo.toml b/Cargo.toml index 3ccbb1c26d..5710d08aff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -82,6 +82,7 @@ members = [ "node/executor", "node/primitives", "node/runtime", + "node/rpc-client", "node-template", "subkey", "test-utils/chain-spec-builder", diff --git a/core/rpc-servers/Cargo.toml b/core/rpc-servers/Cargo.toml index 41cfb6aeea..bca094b572 100644 --- a/core/rpc-servers/Cargo.toml +++ b/core/rpc-servers/Cargo.toml @@ -5,9 +5,9 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -http = { package = "jsonrpc-http-server", version = "10.0.1" } -pubsub = { package = "jsonrpc-pubsub", version = "10.0.1" } -ws = { package = "jsonrpc-ws-server", version = "10.0.1" } +http = { package = "jsonrpc-http-server", version = "12.0.0" } +pubsub = { package = "jsonrpc-pubsub", version = "12.0.0" } +ws = { package = "jsonrpc-ws-server", version = "12.0.0" } log = "0.4" serde = "1.0" substrate-rpc = { path = "../rpc" } diff --git a/core/rpc-servers/src/lib.rs b/core/rpc-servers/src/lib.rs index 2c0672ac9c..adf560ce5a 100644 --- a/core/rpc-servers/src/lib.rs +++ b/core/rpc-servers/src/lib.rs @@ -89,9 +89,9 @@ pub fn start_ws( .allowed_origins(map_cors(cors)) .start(addr) .map_err(|err| match err { - ws::Error(ws::ErrorKind::Io(io), _) => io, - ws::Error(ws::ErrorKind::ConnectionClosed, _) => io::ErrorKind::BrokenPipe.into(), - ws::Error(e, _) => { + ws::Error::Io(io) => io, + ws::Error::ConnectionClosed => io::ErrorKind::BrokenPipe.into(), + e => { error!("{}", e); io::ErrorKind::Other.into() } diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index d69d7e17be..a7337858d8 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -6,9 +6,10 @@ edition = "2018" [dependencies] derive_more = "0.14.0" -jsonrpc-core = "10.0.1" -jsonrpc-pubsub = "10.0.1" -jsonrpc-derive = "10.0.2" +jsonrpc-core = "12.0.0" +jsonrpc-core-client = "12.0.0" +jsonrpc-pubsub = "12.0.0" +jsonrpc-derive = "12.0.0" log = "0.4" parking_lot = "0.7.1" parity-codec = "3.3" diff --git a/core/rpc/src/author/hash.rs b/core/rpc/src/author/hash.rs index 96addf8ebc..a01e26de3c 100644 --- a/core/rpc/src/author/hash.rs +++ b/core/rpc/src/author/hash.rs @@ -14,13 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +//! Extrinsic helpers for author RPC module. + use primitives::Bytes; -use serde::Deserialize; +use serde::{Serialize, Deserialize}; /// RPC Extrinsic or hash /// /// Allows to refer to extrinsic either by its raw representation or its hash. -#[derive(Debug, Deserialize)] +#[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum ExtrinsicOrHash { /// The hash of the extrinsic. diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index 4e3bc96ca9..5594984d0e 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -16,6 +16,12 @@ //! Substrate block-author/full-node API. +pub mod error; +pub mod hash; + +#[cfg(test)] +mod tests; + use std::sync::Arc; use client::{self, Client}; @@ -27,6 +33,7 @@ use log::warn; use parity_codec::{Encode, Decode}; use primitives::{Bytes, Blake2Hasher, H256}; use runtime_primitives::{generic, traits}; +use self::error::Result; use transaction_pool::{ txpool::{ ChainApi as PoolChainApi, @@ -38,13 +45,7 @@ use transaction_pool::{ }, }; -pub mod error; -mod hash; - -#[cfg(test)] -mod tests; - -use self::error::Result; +pub use self::gen_client::Client as AuthorClient; /// Substrate authoring RPC API #[rpc] diff --git a/core/rpc/src/chain/error.rs b/core/rpc/src/chain/error.rs index ffd94f4649..ad63af9add 100644 --- a/core/rpc/src/chain/error.rs +++ b/core/rpc/src/chain/error.rs @@ -14,6 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . + +//! Error helpers for Chain RPC module. + use client; use crate::rpc; use crate::errors; diff --git a/core/rpc/src/chain/mod.rs b/core/rpc/src/chain/mod.rs index 90c833e3fd..3594ed48e3 100644 --- a/core/rpc/src/chain/mod.rs +++ b/core/rpc/src/chain/mod.rs @@ -16,27 +16,28 @@ //! Substrate blockchain API. +pub mod error; +pub mod number; + +#[cfg(test)] +mod tests; + use std::sync::Arc; -use log::warn; use client::{self, Client, BlockchainEvents}; +use crate::rpc::Result as RpcResult; +use crate::rpc::futures::{stream, Future, Sink, Stream}; +use crate::subscriptions::Subscriptions; use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; +use log::warn; use primitives::{H256, Blake2Hasher}; -use crate::rpc::Result as RpcResult; -use crate::rpc::futures::{stream, Future, Sink, Stream}; use runtime_primitives::generic::{BlockId, SignedBlock}; use runtime_primitives::traits::{Block as BlockT, Header, NumberFor}; - -use crate::subscriptions::Subscriptions; - -mod error; -#[cfg(test)] -mod tests; -mod number; - use self::error::Result; +pub use self::gen_client::Client as ChainClient; + /// Substrate blockchain API #[rpc] pub trait ChainApi { diff --git a/core/rpc/src/chain/number.rs b/core/rpc/src/chain/number.rs index f927d51f14..df796d5e6d 100644 --- a/core/rpc/src/chain/number.rs +++ b/core/rpc/src/chain/number.rs @@ -14,7 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use serde::Deserialize; +//! Chain RPC Block number type. + +use serde::{Serialize, Deserialize}; use std::{convert::TryFrom, fmt::Debug}; use primitives::U256; @@ -25,7 +27,7 @@ use primitives::U256; /// or we attempt to parse given hex value. /// We do that for consistency with the returned type, default generic header /// serializes block number as hex to avoid overflows in JavaScript. -#[derive(Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(untagged)] pub enum NumberOrHex { /// The original header number type of block. diff --git a/core/rpc/src/state/error.rs b/core/rpc/src/state/error.rs index 30b3315b7b..4b9d30b36b 100644 --- a/core/rpc/src/state/error.rs +++ b/core/rpc/src/state/error.rs @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +//! State RPC errors. + use client; use crate::rpc; use crate::errors; @@ -29,8 +31,11 @@ pub enum Error { /// Provided block range couldn't be resolved to a list of blocks. #[display(fmt = "Cannot resolve a block range ['{:?}' ... '{:?}]. {}", from, to, details)] InvalidBlockRange { + /// Beginning of the block range. from: String, + /// End of the block range. to: String, + /// Details of the error message. details: String, }, } diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs index ebb45d6b5f..e52d318d9f 100644 --- a/core/rpc/src/state/mod.rs +++ b/core/rpc/src/state/mod.rs @@ -16,36 +16,37 @@ //! Substrate state API. +pub mod error; + +#[cfg(test)] +mod tests; + use std::{ collections::{BTreeMap, HashMap}, ops::Range, sync::Arc, }; -use log::{warn, trace}; use client::{self, Client, CallExecutor, BlockchainEvents, runtime_api::Metadata}; +use crate::rpc::Result as RpcResult; +use crate::rpc::futures::{stream, Future, Sink, Stream}; +use crate::subscriptions::Subscriptions; use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; -use primitives::{H256, Blake2Hasher, Bytes}; +use log::{warn, trace}; use primitives::hexdisplay::HexDisplay; use primitives::storage::{self, StorageKey, StorageData, StorageChangeSet}; -use crate::rpc::Result as RpcResult; -use crate::rpc::futures::{stream, Future, Sink, Stream}; +use primitives::{H256, Blake2Hasher, Bytes}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ Block as BlockT, Header, ProvideRuntimeApi, NumberFor, SaturatedConversion }; use runtime_version::RuntimeVersion; +use self::error::Result; use state_machine::{self, ExecutionStrategy}; -use crate::subscriptions::Subscriptions; - -mod error; -#[cfg(test)] -mod tests; - -use self::error::Result; +pub use self::gen_client::Client as StateClient; /// Substrate state API #[rpc] diff --git a/core/rpc/src/system/helpers.rs b/core/rpc/src/system/helpers.rs index 82c7773b5b..00e2ba9f40 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::Serialize; +use serde::{Serialize, Deserialize}; use serde_json::{Value, map::Map}; /// Node properties @@ -37,7 +37,7 @@ pub struct SystemInfo { } /// Health struct returned by the RPC -#[derive(Debug, PartialEq, Serialize)] +#[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Health { /// Number of connected peers @@ -51,7 +51,7 @@ pub struct Health { } /// Network Peer information -#[derive(Debug, PartialEq, Serialize)] +#[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PeerInfo { /// Peer ID diff --git a/core/rpc/src/system/mod.rs b/core/rpc/src/system/mod.rs index 46cbc99fab..8aac02b77d 100644 --- a/core/rpc/src/system/mod.rs +++ b/core/rpc/src/system/mod.rs @@ -17,8 +17,8 @@ //! Substrate system API. pub mod error; +pub mod helpers; -mod helpers; #[cfg(test)] mod tests; @@ -30,6 +30,8 @@ use runtime_primitives::traits::{self, Header as HeaderT}; use self::error::Result; pub use self::helpers::{Properties, SystemInfo, Health, PeerInfo}; +pub use self::gen_client::Client as SystemClient; + /// Substrate system RPC API #[rpc] pub trait SystemApi { diff --git a/core/sr-version/src/lib.rs b/core/sr-version/src/lib.rs index 071b893404..179146cc84 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::Serialize; +use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] use std::fmt; #[cfg(feature = "std")] @@ -63,7 +63,7 @@ macro_rules! create_apis_vec { /// In particular: bug fixes should result in an increment of `spec_version` and possibly `authoring_version`, /// absolutely not `impl_version` since they change the semantics of the runtime. #[derive(Clone, PartialEq, Eq, Encode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Decode))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize, Decode))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] pub struct RuntimeVersion { /// Identifies the different Substrate runtimes. There'll be at least polkadot and node. diff --git a/node/rpc-client/Cargo.toml b/node/rpc-client/Cargo.toml new file mode 100644 index 0000000000..ea255808e4 --- /dev/null +++ b/node/rpc-client/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "node-rpc-client" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +env_logger = "0.6" +futures = "0.1.26" +hyper = "0.12" +jsonrpc-core-client = { version = "12.0.0", features = ["http", "ws"] } +log = "0.4" +node-primitives = { path = "../primitives" } +substrate-rpc = { path = "../../core/rpc", version = "2.0.0" } diff --git a/node/rpc-client/src/main.rs b/node/rpc-client/src/main.rs new file mode 100644 index 0000000000..fe057bcbea --- /dev/null +++ b/node/rpc-client/src/main.rs @@ -0,0 +1,70 @@ +// 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 . + +#![warn(missing_docs)] + +//! Example substrate RPC client code. +//! +//! This module shows how you can write a Rust RPC client that connects to a running +//! substrate node and use staticly typed RPC wrappers. + +use futures::Future; +use hyper::rt; +use node_primitives::Hash; +use substrate_rpc::author::{ + AuthorClient, + hash::ExtrinsicOrHash, +}; +use jsonrpc_core_client::{ + transports::http, + RpcError, +}; + +fn main() { + env_logger::init(); + + rt::run(rt::lazy(|| { + let uri = "http://localhost:9933"; + + http::connect(uri) + .and_then(|client: AuthorClient| { + remove_all_extrinsics(client) + }) + .map_err(|e| { + println!("Error: {:?}", e); + }) + })) +} + +/// Remove all pending extrinsics from the node. +/// +/// The example code takes `AuthorClient` and first: +/// 1. Calls the `pending_extrinsics` method to get all extrinsics in the pool. +/// 2. Then calls `remove_extrinsic` passing the obtained raw extrinsics. +/// +/// As the resul of running the code the entire content of the transaction pool is going +/// to be removed and the extrinsics are going to be temporarily banned. +fn remove_all_extrinsics(client: AuthorClient) -> impl Future { + client.pending_extrinsics() + .and_then(move |pending| { + client.remove_extrinsic( + pending.into_iter().map(|tx| ExtrinsicOrHash::Extrinsic(tx.into())).collect() + ) + }) + .map(|removed| { + println!("Removed extrinsics: {:?}", removed); + }) +} diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index c31c6b41cc..bad1fb9def 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 91, - impl_version: 92, + impl_version: 93, apis: RUNTIME_API_VERSIONS, }; -- GitLab From 45cff87d6e74e813aa9ae5a0e9bf76dbbb5ee3c2 Mon Sep 17 00:00:00 2001 From: Joshy Orndorff Date: Tue, 4 Jun 2019 12:48:50 -0400 Subject: [PATCH 071/140] WIP: Treasury reference docs (#2557) * Some initial re-organization. * Text looking decent. No Example Yet. * Clarify that using block rewards is jsut an example. * Clarify the purpose of OnDilution. * Update lib.rs --- srml/treasury/src/lib.rs | 82 ++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 37 deletions(-) diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index 39253ac4d9..cd9e781f66 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -15,47 +15,55 @@ // along with Substrate. If not, see . //! # Treasury Module -//! -//! The `treasury` module keeps account of currency in a `pot` and manages the subsequent -//! deployment of these funds. -//! +//! +//! The Treasury module provides a "pot" of funds that can be managed by stakeholders in the +//! system and a structure for making spending proposals from this pot. +//! +//! - [`treasury::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! //! ## 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 itself provides the pot to store funds, and a means for stakeholders to +//! propose, approve, and deny expendatures. The chain will need to provide a method (e.g. +//! inflation, fees) for collecting funds. +//! +//! By way of example, the Council could vote to fund the Treasury with a portion of the block +//! reward and use the funds to pay developers. +//! +//! ### Terminology +//! +//! - **Proposal:** A suggestion to allocate funds from the pot to a beneficiary. +//! - **Beneficiary:** An account who will receive the funds from a proposal iff +//! the proposal is approved. +//! - **Deposit:** Funds that a proposer must lock when making a proposal. The +//! deposit will be returned or slashed if the proposal is approved or rejected +//! respectively. +//! - **Pot:** Unspent funds accumulated by the treasury 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`. -//! +//! +//! - `OnDilution` - When new funds are minted to reward the deployment of other existing funds, +//! a corresponding amount of tokens are minted into the treasury so that the tokens being rewarded +//! do not represent a higher portion of total supply. For example, in the default substrate node, +//! when validators are rewarded new tokens for staking, they do not hold a higher portion of total +//! tokens. Rather, tokens are added to the treasury to keep the portion of tokens staked constant. +//! //! ## Interface -//! +//! //! ### Dispatchable Functions -//! -//! - `propose_spend` - Propose a spending proposal and stake a proposal deposit. +//! +//! - `propose_spend` - Make a spending proposal and stake the required 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. -//! +//! - `reject_proposal` - Reject a proposal, slashing the deposit. +//! - `approve_proposal` - Accept the proposal, returning the deposit. +//! +//! ## GenesisConfig +//! +//! The Treasury module depends on the [`GenesisConfig`](./struct.GenesisConfig.html). #![cfg_attr(not(feature = "std"), no_std)] @@ -183,8 +191,8 @@ decl_storage! { trait Store for Module as Treasury { // Config... - /// Proportion of funds that should be bonded in order to place a proposal. An accepted - /// proposal gets these back. A rejected proposal doesn't. + /// Fraction of a proposal's value that should be bonded in order to place the proposal. + /// An accepted proposal gets these back. A rejected proposal does not. ProposalBond get(proposal_bond) config(): Permill; /// Minimum amount of funds that should be placed in a deposit for making a proposal. -- GitLab From ec62d24c602912f07bbc416711376d9b8e5782c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 4 Jun 2019 20:09:49 +0200 Subject: [PATCH 072/140] Fix tons of warnings in newest nightly (#2784) * Fix tons of warnings in newest nightly * Fix sr-api-macro doc tests --- core/basic-authorship/src/basic_authorship.rs | 6 +- core/cli/src/lib.rs | 4 +- core/cli/src/params.rs | 4 +- core/client/db/src/cache/list_storage.rs | 6 +- core/client/db/src/cache/mod.rs | 6 +- core/client/db/src/lib.rs | 23 ++++--- core/client/db/src/light.rs | 8 +-- core/client/db/src/utils.rs | 25 ++++--- core/client/src/blockchain.rs | 4 +- core/client/src/call_executor.rs | 4 +- core/client/src/children.rs | 4 +- core/client/src/client.rs | 14 ++-- core/client/src/error.rs | 6 +- core/client/src/in_mem.rs | 6 +- core/client/src/leaves.rs | 2 +- core/client/src/light/blockchain.rs | 8 +-- core/client/src/light/call_executor.rs | 2 +- core/client/src/light/fetcher.rs | 12 ++-- core/consensus/aura/src/lib.rs | 6 +- core/consensus/babe/src/lib.rs | 4 +- core/consensus/common/src/block_import.rs | 8 +-- core/consensus/common/src/error.rs | 2 +- core/consensus/common/src/import_queue.rs | 22 +++--- core/executor/src/native_executor.rs | 4 +- core/executor/src/wasm_executor.rs | 4 +- core/executor/src/wasm_utils.rs | 2 +- .../src/communication/gossip.rs | 10 +-- core/finality-grandpa/src/finality_proof.rs | 14 ++-- core/finality-grandpa/src/import.rs | 4 +- core/finality-grandpa/src/light_import.rs | 18 ++--- core/finality-grandpa/src/tests.rs | 9 ++- core/keyring/src/sr25519.rs | 2 +- core/network/src/config.rs | 6 +- core/network/src/consensus_gossip.rs | 68 ++++++++++++------- core/network/src/on_demand_layer.rs | 4 +- core/network/src/protocol.rs | 10 +-- core/network/src/service.rs | 24 +++---- core/network/src/specialization.rs | 10 +-- core/network/src/sync.rs | 40 +++++------ core/network/src/sync/extra_requests.rs | 10 +-- core/network/src/test/mod.rs | 21 +++--- core/offchain/src/lib.rs | 2 +- core/primitives/src/hexdisplay.rs | 4 +- core/primitives/src/lib.rs | 2 +- core/primitives/src/offchain.rs | 8 +-- core/primitives/src/sr25519.rs | 18 +++-- core/rpc/src/author/error.rs | 2 +- core/rpc/src/system/mod.rs | 4 +- core/service/src/chain_ops.rs | 2 +- core/service/src/components.rs | 12 ++-- core/service/src/lib.rs | 4 +- core/sr-api-macros/src/lib.rs | 15 +++- core/sr-api-macros/tests/decl_and_impl.rs | 6 +- core/sr-io/with_std.rs | 4 +- core/sr-primitives/src/generic/mod.rs | 4 +- core/state-machine/src/basic.rs | 6 +- core/state-machine/src/changes_trie/mod.rs | 2 +- core/state-machine/src/ext.rs | 2 +- core/state-machine/src/lib.rs | 61 +++++++++-------- core/state-machine/src/proving_backend.rs | 10 +-- core/state-machine/src/testing.rs | 4 +- .../state-machine/src/trie_backend_essence.rs | 10 +-- core/telemetry/src/lib.rs | 10 +-- core/transaction-pool/graph/src/error.rs | 2 +- core/trie/src/lib.rs | 6 +- core/trie/src/node_header.rs | 4 +- core/trie/src/trie_stream.rs | 4 +- core/util/fork-tree/src/lib.rs | 2 +- srml/aura/src/lib.rs | 1 - srml/contract/src/exec.rs | 2 +- srml/contract/src/tests.rs | 8 +-- srml/indices/src/address.rs | 2 +- subkey/src/vanity.rs | 6 +- 73 files changed, 359 insertions(+), 316 deletions(-) diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 87d0b8f92b..166a89447e 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -56,7 +56,7 @@ pub trait AuthoringApi: Send + Sync + ProvideRuntimeApi where /// Build a block on top of the given block, with inherent extrinsics and /// inherent digests pre-pushed. - fn build_block) -> ()>( + fn build_block) -> ()>( &self, at: &BlockId, inherent_data: InherentData, @@ -91,7 +91,7 @@ impl AuthoringApi for SubstrateClient where type Block = Block; type Error = client::error::Error; - fn build_block) -> ()>( + fn build_block) -> ()>( &self, at: &BlockId, inherent_data: InherentData, @@ -162,7 +162,7 @@ pub struct Proposer { parent_id: BlockId, parent_number: <::Header as HeaderT>::Number, transaction_pool: Arc>, - now: Box time::Instant>, + now: Box time::Instant>, } impl consensus_common::Proposer<::Block> for Proposer where diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 3619e6491a..c14c962591 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -617,7 +617,7 @@ where let to = cli.to; let json = cli.json; - let file: Box = match cli.output { + let file: Box = match cli.output { Some(filename) => Box::new(File::create(filename)?), None => Box::new(stdout()), }; @@ -640,7 +640,7 @@ where { let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; - let file: Box = match cli.input { + let file: Box = match cli.input { Some(filename) => Box::new(File::open(filename)?), None => Box::new(stdin()), }; diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 7439cc02c0..0cdc633188 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -476,7 +476,7 @@ impl Keyring { } /// Default to verbosity level 0, if none is provided. -fn parse_telemetry_endpoints(s: &str) -> Result<(String, u8), Box> { +fn parse_telemetry_endpoints(s: &str) -> Result<(String, u8), Box> { let pos = s.find(' '); match pos { None => { @@ -512,7 +512,7 @@ impl From for Option> { } /// Parse cors origins -fn parse_cors(s: &str) -> Result> { +fn parse_cors(s: &str) -> Result> { let mut is_all = false; let mut origins = Vec::new(); for part in s.split(',') { diff --git a/core/client/db/src/cache/list_storage.rs b/core/client/db/src/cache/list_storage.rs index 6271f892bc..af0b74066c 100644 --- a/core/client/db/src/cache/list_storage.rs +++ b/core/client/db/src/cache/list_storage.rs @@ -97,19 +97,19 @@ pub struct DbColumns { pub struct DbStorage { name: Vec, meta_key: Vec, - db: Arc, + db: Arc, columns: DbColumns, } impl DbStorage { /// Create new database-backed list cache storage. - pub fn new(name: Vec, db: Arc, columns: DbColumns) -> Self { + pub fn new(name: Vec, db: Arc, columns: DbColumns) -> Self { let meta_key = meta::key(&name); DbStorage { name, meta_key, db, columns } } /// Get reference to the database. - pub fn db(&self) -> &Arc { &self.db } + pub fn db(&self) -> &Arc { &self.db } /// Get reference to the database columns. pub fn columns(&self) -> &DbColumns { &self.columns } diff --git a/core/client/db/src/cache/mod.rs b/core/client/db/src/cache/mod.rs index d79b01ab6b..64d3c4a25e 100644 --- a/core/client/db/src/cache/mod.rs +++ b/core/client/db/src/cache/mod.rs @@ -77,7 +77,7 @@ impl CacheItemT for T where T: Clone + Decode + Encode + PartialEq {} /// Database-backed blockchain data cache. pub struct DbCache { cache_at: HashMap, self::list_storage::DbStorage>>, - db: Arc, + db: Arc, key_lookup_column: Option, header_column: Option, authorities_column: Option, @@ -88,7 +88,7 @@ pub struct DbCache { impl DbCache { /// Create new cache. pub fn new( - db: Arc, + db: Arc, key_lookup_column: Option, header_column: Option, authorities_column: Option, @@ -150,7 +150,7 @@ impl DbCache { fn get_cache_helper<'a, Block: BlockT>( cache_at: &'a mut HashMap, self::list_storage::DbStorage>>, name: CacheKeyId, - db: &Arc, + db: &Arc, key_lookup: Option, header: Option, cache: Option, diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index a253cc6783..302cdfd083 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -70,7 +70,7 @@ const CANONICALIZATION_DELAY: u64 = 4096; const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u32 = 32768; /// DB-backed patricia trie state, transaction type is an overlay of changes to commit. -pub type DbState = state_machine::TrieBackend>, Blake2Hasher>; +pub type DbState = state_machine::TrieBackend>, Blake2Hasher>; pub struct RefTrackingState { state: DbState, @@ -213,7 +213,7 @@ struct PendingBlock { } // wrapper that implements trait required for state_db -struct StateMetaDb<'a>(&'a KeyValueDB); +struct StateMetaDb<'a>(&'a dyn KeyValueDB); impl<'a> state_db::MetaDb for StateMetaDb<'a> { type Error = io::Error; @@ -225,13 +225,13 @@ impl<'a> state_db::MetaDb for StateMetaDb<'a> { /// Block database pub struct BlockchainDb { - db: Arc, + db: Arc, meta: Arc, Block::Hash>>>, leaves: RwLock>>, } impl BlockchainDb { - fn new(db: Arc) -> Result { + fn new(db: Arc) -> Result { let meta = read_meta::(&*db, columns::META, columns::HEADER)?; let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?; Ok(BlockchainDb { @@ -340,7 +340,7 @@ impl client::blockchain::Backend for BlockchainDb { Ok(self.meta.read().finalized_hash.clone()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } @@ -354,7 +354,7 @@ impl client::blockchain::Backend for BlockchainDb { } impl client::blockchain::ProvideCache for BlockchainDb { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } @@ -473,7 +473,7 @@ where Block: BlockT, } struct StorageDb { - pub db: Arc, + pub db: Arc, pub state_db: StateDb>, } @@ -512,7 +512,7 @@ impl state_machine::Storage for DbGenesisStorage { } pub struct DbChangesTrieStorage { - db: Arc, + db: Arc, meta: Arc, Block::Hash>>>, min_blocks_to_keep: Option, _phantom: ::std::marker::PhantomData, @@ -693,7 +693,12 @@ impl> Backend { ).expect("failed to create test-db") } - fn from_kvdb(db: Arc, pruning: PruningMode, canonicalization_delay: u64, state_cache_size: usize) -> 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(); diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index e0f2153a13..b3398bfdff 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -59,7 +59,7 @@ const CHANGES_TRIE_CHT_PREFIX: u8 = 1; /// Light blockchain storage. Stores most recent headers + CHTs for older headers. /// Locks order: meta, leaves, cache. pub struct LightStorage { - db: Arc, + db: Arc, meta: RwLock, Block::Hash>>, leaves: RwLock>>, cache: Arc>, @@ -96,7 +96,7 @@ impl LightStorage Self::from_kvdb(db as Arc<_>).expect("failed to create test-db") } - fn from_kvdb(db: Arc) -> ClientResult { + fn from_kvdb(db: Arc) -> ClientResult { let meta = read_meta::(&*db, columns::META, columns::HEADER)?; let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?; let cache = DbCache::new( @@ -557,7 +557,7 @@ impl LightBlockchainStorage for LightStorage Ok(self.meta.read().finalized_hash.clone()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { Some(self.cache.clone()) } } @@ -888,7 +888,7 @@ pub(crate) mod tests { map } - fn get_authorities(cache: &BlockchainCache, at: BlockId) -> Option> { + fn get_authorities(cache: &dyn BlockchainCache, at: BlockId) -> Option> { cache.get_at(&well_known_cache_keys::AUTHORITIES, &at).and_then(|val| Decode::decode(&mut &val[..])) } diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index 846bf05f3c..bd7cf660ea 100644 --- a/core/client/db/src/utils.rs +++ b/core/client/db/src/utils.rs @@ -17,9 +17,7 @@ //! Db-based backend utility structures and functions, used by both //! full and light storages. -use std::sync::Arc; -use std::io; -use std::convert::TryInto; +use std::{io, convert::TryInto, sync::Arc}; use kvdb::{KeyValueDB, DBTransaction}; #[cfg(feature = "kvdb-rocksdb")] @@ -171,7 +169,7 @@ pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( /// block lookup key is the DB-key header, block and justification are stored under. /// looks up lookup key by hash from DB as necessary. pub fn block_id_to_lookup_key( - db: &KeyValueDB, + db: &dyn KeyValueDB, key_lookup_col: Option, id: BlockId ) -> Result>, client::error::Error> where @@ -197,7 +195,11 @@ pub fn db_err(err: io::Error) -> client::error::Error { /// Open RocksDB database. #[cfg(feature = "kvdb-rocksdb")] -pub fn open_database(config: &DatabaseSettings, col_meta: Option, db_type: &str) -> client::error::Result> { +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::Error::Backend("Invalid database path".into()))?; @@ -222,7 +224,12 @@ pub fn open_database(config: &DatabaseSettings, col_meta: Option, db_type: } /// Read database column entry for the given block. -pub fn read_db(db: &KeyValueDB, col_index: Option, col: Option, id: BlockId) -> client::error::Result> +pub fn read_db( + db: &dyn KeyValueDB, + col_index: Option, + col: Option, + id: BlockId +) -> client::error::Result> where Block: BlockT, { @@ -234,7 +241,7 @@ pub fn read_db(db: &KeyValueDB, col_index: Option, col: Option, /// Read a header from the database. pub fn read_header( - db: &KeyValueDB, + db: &dyn KeyValueDB, col_index: Option, col: Option, id: BlockId, @@ -252,7 +259,7 @@ pub fn read_header( /// Required header from the database. pub fn require_header( - db: &KeyValueDB, + db: &dyn KeyValueDB, col_index: Option, col: Option, id: BlockId, @@ -262,7 +269,7 @@ pub fn require_header( } /// Read meta from the database. -pub fn read_meta(db: &KeyValueDB, col_meta: Option, col_header: Option) -> Result< +pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: Option) -> Result< Meta<<::Header as HeaderT>::Number, Block::Hash>, client::error::Error, > diff --git a/core/client/src/blockchain.rs b/core/client/src/blockchain.rs index 05210fc9ad..b07e26396e 100644 --- a/core/client/src/blockchain.rs +++ b/core/client/src/blockchain.rs @@ -81,7 +81,7 @@ pub trait Backend: HeaderBackend { /// Get last finalized block hash. fn last_finalized(&self) -> Result; /// Returns data cache reference, if it is enabled on this backend. - fn cache(&self) -> Option>>; + fn cache(&self) -> Option>>; /// Returns hashes of all blocks that are leaves of the block tree. /// in other words, that have no children, are chain heads. @@ -95,7 +95,7 @@ pub trait Backend: HeaderBackend { /// Provides access to the optional cache. pub trait ProvideCache { /// Returns data cache reference, if it is enabled on this backend. - fn cache(&self) -> Option>>; + fn cache(&self) -> Option>>; } /// Blockchain optional data cache. diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index bb59be44c3..f956f27b50 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -125,7 +125,7 @@ where let trie_state = state.as_trie_backend() .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) - as Box + as Box )?; self.prove_at_trie_state(trie_state, overlay, method, call_data) } @@ -246,7 +246,7 @@ where let trie_state = state.as_trie_backend() .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) - as Box + as Box )?; let backend = state_machine::ProvingBackend::new_with_recorder( diff --git a/core/client/src/children.rs b/core/client/src/children.rs index 3a9f0a6bea..4423ad8939 100644 --- a/core/client/src/children.rs +++ b/core/client/src/children.rs @@ -26,7 +26,7 @@ use std::hash::Hash; pub fn read_children< K: Eq + Hash + Clone + Encode + Decode, V: Eq + Hash + Clone + Encode + Decode, ->(db: &KeyValueDB, column: Option, prefix: &[u8], parent_hash: K) -> error::Result> { +>(db: &dyn KeyValueDB, column: Option, prefix: &[u8], parent_hash: K) -> error::Result> { let mut buf = prefix.to_vec(); parent_hash.using_encoded(|s| buf.extend(s)); @@ -116,6 +116,6 @@ mod tests { let r2: Vec = read_children(&db, None, PREFIX, 1_2).unwrap(); assert_eq!(r1, vec![1_3, 1_5]); - assert_eq!(r2.len(), 0); + assert_eq!(r2.len(), 0); } } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 0d8f8aa548..f4183e4958 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -564,7 +564,7 @@ impl Client where cht_size: NumberFor, ) -> error::Result> { struct AccessedRootsRecorder<'a, Block: BlockT> { - storage: &'a ChangesTrieStorage>, + storage: &'a dyn ChangesTrieStorage>, min: NumberFor, required_roots_proofs: Mutex, H256>>, }; @@ -695,7 +695,7 @@ impl Client where /// Create a new block, built on the head of the chain. pub fn new_block( - &self, + &self, inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, @@ -708,8 +708,8 @@ impl Client where /// Create a new block, built on top of `parent`. pub fn new_block_at( - &self, - parent: &BlockId, + &self, + parent: &BlockId, inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, @@ -726,8 +726,8 @@ impl Client where /// 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, + &self, + parent: &BlockId, inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, @@ -1319,7 +1319,7 @@ impl ProvideCache for Client where B: backend::Backend, Block: BlockT, { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { self.backend.blockchain().cache() } } diff --git a/core/client/src/error.rs b/core/client/src/error.rs index bad279f2e4..b807d5e11c 100644 --- a/core/client/src/error.rs +++ b/core/client/src/error.rs @@ -42,7 +42,7 @@ pub enum Error { ApplyExtrinsicFailed(ApplyError), /// Execution error. #[display(fmt = "Execution: {}", _0)] - Execution(Box), + Execution(Box), /// Blockchain error. #[display(fmt = "Blockchain: {}", _0)] Blockchain(Box), @@ -100,7 +100,7 @@ pub enum Error { } impl error::Error for Error { - fn source(&self) -> Option<&(error::Error + 'static)> { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { match self { Error::Consensus(e) => Some(e), Error::Blockchain(e) => Some(e), @@ -128,7 +128,7 @@ impl Error { } /// Chain a state error. - pub fn from_state(e: Box) -> Self { + pub fn from_state(e: Box) -> Self { Error::Execution(e) } } diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index 6c11d0ed57..92d04230dd 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -343,7 +343,7 @@ impl blockchain::Backend for Blockchain { Ok(self.storage.read().finalized_hash.clone()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } @@ -357,7 +357,7 @@ impl blockchain::Backend for Blockchain { } impl blockchain::ProvideCache for Blockchain { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } @@ -433,7 +433,7 @@ impl light::blockchain::Storage for Blockchain .ok_or_else(|| error::Error::Backend(format!("Changes trie CHT for block {} not exists", block))) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } diff --git a/core/client/src/leaves.rs b/core/client/src/leaves.rs index 144237f777..b0e49ead80 100644 --- a/core/client/src/leaves.rs +++ b/core/client/src/leaves.rs @@ -77,7 +77,7 @@ impl LeafSet where } /// Read the leaf list from the DB, using given prefix for keys. - pub fn read_from_db(db: &KeyValueDB, column: Option, prefix: &[u8]) -> error::Result { + pub fn read_from_db(db: &dyn KeyValueDB, column: Option, prefix: &[u8]) -> error::Result { let mut storage = BTreeMap::new(); for (key, value) in db.iter_from_prefix(column, prefix) { diff --git a/core/client/src/light/blockchain.rs b/core/client/src/light/blockchain.rs index 62c13db5a4..e3d9c55a6a 100644 --- a/core/client/src/light/blockchain.rs +++ b/core/client/src/light/blockchain.rs @@ -70,7 +70,7 @@ pub trait Storage: AuxStore + BlockchainHeaderBackend { ) -> ClientResult; /// Get storage cache. - fn cache(&self) -> Option>>; + fn cache(&self) -> Option>>; } /// Light client blockchain. @@ -175,7 +175,7 @@ impl BlockchainBackend for Blockchain where Block: Blo self.storage.last_finalized() } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { self.storage.cache() } @@ -189,7 +189,7 @@ impl BlockchainBackend for Blockchain where Block: Blo } impl, F, Block: BlockT> ProvideCache for Blockchain { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { self.storage.cache() } } @@ -303,7 +303,7 @@ pub mod tests { ).into()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 5b6d1b3a29..a6b381a8b1 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -400,7 +400,7 @@ pub fn prove_execution( E: CallExecutor, { let trie_state = state.as_trie_backend() - .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box)?; + .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box)?; // prepare execution environment + record preparation proof let mut changes = Default::default(); diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index f25a2acd30..985aa5bdaa 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -620,7 +620,7 @@ pub mod tests { #[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(); - assert_eq!((&local_checker as &FetchChecker).check_read_proof(&RemoteReadRequest::

{ + assert_eq!((&local_checker as &dyn FetchChecker).check_read_proof(&RemoteReadRequest::
{ block: remote_block_header.hash(), header: remote_block_header, key: well_known_keys::AUTHORITY_COUNT.to_vec(), @@ -631,7 +631,7 @@ pub mod tests { #[test] fn header_proof_is_generated_and_checked() { let (local_checker, local_cht_root, remote_block_header, remote_header_proof) = prepare_for_header_proof_check(true); - assert_eq!((&local_checker as &FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ + assert_eq!((&local_checker as &dyn FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ cht_root: local_cht_root, block: 1, retry_count: None, @@ -642,7 +642,7 @@ pub mod tests { fn check_header_proof_fails_if_cht_root_is_invalid() { let (local_checker, _, mut remote_block_header, remote_header_proof) = prepare_for_header_proof_check(true); remote_block_header.number = 100; - assert!((&local_checker as &FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ + assert!((&local_checker as &dyn FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ cht_root: Default::default(), block: 1, retry_count: None, @@ -653,7 +653,7 @@ pub mod tests { fn check_header_proof_fails_if_invalid_header_provided() { let (local_checker, local_cht_root, mut remote_block_header, remote_header_proof) = prepare_for_header_proof_check(true); remote_block_header.number = 100; - assert!((&local_checker as &FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ + assert!((&local_checker as &dyn FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ cht_root: local_cht_root, block: 1, retry_count: None, @@ -667,7 +667,7 @@ pub mod tests { Arc::new(DummyBlockchain::new(DummyStorage::new())), test_client::LocalExecutor::new(None) ); - let local_checker = &local_checker as &FetchChecker; + let local_checker = &local_checker as &dyn FetchChecker; let max = remote_client.info().chain.best_number; let max_hash = remote_client.info().chain.best_hash; @@ -763,7 +763,7 @@ pub mod tests { Arc::new(DummyBlockchain::new(DummyStorage::new())), test_client::LocalExecutor::new(None) ); - let local_checker = &local_checker as &FetchChecker; + let local_checker = &local_checker as &dyn FetchChecker; let max = remote_client.info().chain.best_number; let max_hash = remote_client.info().chain.best_hash; diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 263381d5f1..f0d982c36e 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -206,7 +206,7 @@ impl SlotWorker for AuraWorker w DigestItemFor: CompatibleDigestItem

+ DigestItem, Hash=B::Hash>, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { - type OnSlot = Box + Send>; + type OnSlot = Box + Send>; fn on_start( &self, @@ -578,7 +578,7 @@ impl Verifier for AuraVerifier where // skip the inherents verification if the runtime API is old. if self.client .runtime_api() - .has_api_with::, _>(&BlockId::Hash(parent_hash), |v| v >= 2) + .has_api_with::, _>(&BlockId::Hash(parent_hash), |v| v >= 2) .map_err(|e| format!("{:?}", e))? { self.check_inherents( @@ -681,7 +681,7 @@ fn authorities(client: &C, at: &BlockId) -> Result>(at).unwrap_or(false) { + if client.runtime_api().has_api::>(at).unwrap_or(false) { AuthoritiesApi::authorities(&*client.runtime_api(), at).ok() } else { CoreApi::authorities(&*client.runtime_api(), at).ok() diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 969c7b8593..12c388d329 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -251,7 +251,7 @@ impl SlotWorker for BabeWorker w SO: SyncOracle + Send + Clone, Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { - type OnSlot = Box + Send>; + type OnSlot = Box + Send>; fn on_start( &self, @@ -715,7 +715,7 @@ fn authorities(client: &C, at: &BlockId) -> Result< .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) { + 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, \ diff --git a/core/consensus/common/src/block_import.rs b/core/consensus/common/src/block_import.rs index 1a6a8d1f50..8ce6019131 100644 --- a/core/consensus/common/src/block_import.rs +++ b/core/consensus/common/src/block_import.rs @@ -197,7 +197,7 @@ pub trait JustificationImport { 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) { } + fn on_start(&self, _link: &dyn crate::import_queue::Link) { } /// Import a Block justification and finalize the given block. fn import_justification( @@ -210,10 +210,10 @@ pub trait JustificationImport { /// Finality proof import trait. pub trait FinalityProofImport { - type Error: ::std::error::Error + Send + 'static; + 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) { } + fn on_start(&self, _link: &dyn crate::import_queue::Link) { } /// Import a Block justification and finalize the given block. Returns finalized block or error. fn import_finality_proof( @@ -221,7 +221,7 @@ pub trait FinalityProofImport { hash: B::Hash, number: NumberFor, finality_proof: Vec, - verifier: &Verifier, + verifier: &dyn Verifier, ) -> Result<(B::Hash, NumberFor), Self::Error>; } diff --git a/core/consensus/common/src/error.rs b/core/consensus/common/src/error.rs index a923c5f555..d8683d0b68 100644 --- a/core/consensus/common/src/error.rs +++ b/core/consensus/common/src/error.rs @@ -64,7 +64,7 @@ pub enum Error { InvalidJustification, /// Some other error. #[display(fmt="Other error: {}", _0)] - Other(Box), + Other(Box), /// Error from the client while importing #[display(fmt="Import failed: {}", _0)] ClientImport(String), diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index d44aa0b93a..118bc641b2 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -103,7 +103,7 @@ pub trait ImportQueue: Send + Sync { /// /// This is called automatically by the network service when synchronization /// begins. - fn start(&self, _link: Box>) -> Result<(), std::io::Error> { + fn start(&self, _link: Box>) -> Result<(), std::io::Error> { Ok(()) } /// Import bunch of blocks. @@ -120,7 +120,7 @@ pub struct BasicSyncQueue> { } struct BasicSyncQueueData> { - link: Mutex>>>, + link: Mutex>>>, block_import: SharedBlockImport, verifier: Arc, justification_import: Option>, @@ -147,7 +147,7 @@ impl> BasicSyncQueue { } impl> ImportQueue for BasicSyncQueue { - fn start(&self, link: Box>) -> Result<(), std::io::Error> { + fn start(&self, link: Box>) -> Result<(), std::io::Error> { if let Some(justification_import) = self.data.justification_import.as_ref() { justification_import.on_start(&*link); } @@ -287,7 +287,7 @@ impl BasicQueue { } impl ImportQueue for BasicQueue { - fn start(&self, link: Box>) -> Result<(), std::io::Error> { + fn start(&self, link: Box>) -> Result<(), std::io::Error> { let connect_err = || Err(std::io::Error::new( std::io::ErrorKind::Other, "Failed to connect import queue threads", @@ -328,7 +328,7 @@ pub enum BlockImportMsg { ImportBlocks(BlockOrigin, Vec>), ImportJustification(Origin, B::Hash, NumberFor, Justification), ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), - Start(Box>, Sender>), + Start(Box>, Sender>), Shutdown(Sender<()>), #[cfg(any(test, feature = "test-helpers"))] Synchronize, @@ -360,7 +360,7 @@ struct BlockImporter { result_port: Receiver>, worker_sender: Option>>, link: Option>>, - verifier: Arc>, + verifier: Arc>, justification_import: Option>, finality_proof_import: Option>, finality_proof_request_builder: Option>, @@ -370,7 +370,7 @@ impl BlockImporter { fn new( result_port: Receiver>, worker_sender: Sender>, - verifier: Arc>, + verifier: Arc>, justification_import: Option>, finality_proof_import: Option>, finality_proof_request_builder: Option>, @@ -667,7 +667,7 @@ pub enum BlockImportError { /// Imports single notification and send notification to the link (if provided). fn import_single_justification( - link: &Option>>, + link: &Option>>, justification_import: &Option>, who: Origin, hash: B::Hash, @@ -723,7 +723,7 @@ fn import_single_finality_proof>( /// Process result of block(s) import. fn process_import_results( - link: &Link, + link: &dyn Link, results: Vec<( Result>, BlockImportError>, B::Hash, @@ -801,7 +801,7 @@ fn process_import_results( /// Import several blocks at once, returning import result for each block. fn import_many_blocks>( - import_handle: &BlockImport, + import_handle: &dyn BlockImport, blocks_origin: BlockOrigin, blocks: Vec>, verifier: Arc, @@ -854,7 +854,7 @@ fn import_many_blocks>( /// Single block import function. pub fn import_single_block>( - import_handle: &BlockImport, + import_handle: &dyn BlockImport, block_origin: BlockOrigin, block: IncomingBlock, verifier: Arc, diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index 729346cbee..c4f3511c9c 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -107,7 +107,7 @@ fn safe_call(f: F) -> Result /// Set up the externalities and safe calling environment to execute calls to a native runtime. /// /// If the inner closure panics, it will be caught and return an error. -pub fn with_native_environment(ext: &mut Externalities, f: F) -> Result +pub fn with_native_environment(ext: &mut dyn Externalities, f: F) -> Result where F: UnwindSafe + FnOnce() -> U { ::runtime_io::with_externalities(ext, move || safe_call(f)) @@ -121,7 +121,7 @@ pub trait NativeExecutionDispatch: Send + Sync { /// Dispatch a method and input data to be executed natively. Returns `Some` result or `None` /// if the `method` is unknown. Panics if there's an unrecoverable error. // fn dispatch(ext: &mut Externalities, method: &str, data: &[u8]) -> Result>; - fn dispatch(ext: &mut Externalities, method: &str, data: &[u8]) -> Result>; + fn dispatch(ext: &mut dyn Externalities, method: &str, data: &[u8]) -> Result>; /// Provide native runtime version. fn native_version() -> NativeVersion; diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 6a3c92b755..920639c0a2 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -1101,7 +1101,7 @@ impl WasmExecutor { /// This should be used for tests only. pub fn call_with_custom_signature< E: Externalities, - F: FnOnce(&mut FnMut(&[u8]) -> Result) -> Result>, + F: FnOnce(&mut dyn FnMut(&[u8]) -> Result) -> Result>, FR: FnOnce(Option, &MemoryRef) -> Result>, R, >( @@ -1158,7 +1158,7 @@ impl WasmExecutor { /// Call a given method in the given wasm-module runtime. fn call_in_wasm_module_with_custom_signature< E: Externalities, - F: FnOnce(&mut FnMut(&[u8]) -> Result) -> Result>, + F: FnOnce(&mut dyn FnMut(&[u8]) -> Result) -> Result>, FR: FnOnce(Option, &MemoryRef) -> Result>, R, >( diff --git a/core/executor/src/wasm_utils.rs b/core/executor/src/wasm_utils.rs index a9fbca7f6c..7384f91944 100644 --- a/core/executor/src/wasm_utils.rs +++ b/core/executor/src/wasm_utils.rs @@ -174,7 +174,7 @@ macro_rules! impl_function_executor { => $($pre:tt)+ ) => ( impl $( $pre ) + $structname { #[allow(unused)] - fn resolver() -> &'static $crate::wasmi::ModuleImportResolver { + fn resolver() -> &'static dyn $crate::wasmi::ModuleImportResolver { struct Resolver; impl $crate::wasmi::ModuleImportResolver for Resolver { fn resolve_func(&self, name: &str, signature: &$crate::wasmi::Signature) -> ::std::result::Result<$crate::wasmi::FuncRef, $crate::wasmi::Error> { diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index 79f98e5bdb..460998e707 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -657,7 +657,7 @@ impl GossipValidator { } impl network_gossip::Validator for GossipValidator { - fn new_peer(&self, context: &mut ValidatorContext, who: &PeerId, _roles: Roles) { + fn new_peer(&self, context: &mut dyn ValidatorContext, who: &PeerId, _roles: Roles) { let packet_data = { let mut inner = self.inner.write(); inner.peers.new_peer(who.clone()); @@ -673,11 +673,11 @@ impl network_gossip::Validator for GossipValidator context.send_message(who, packet_data); } - fn peer_disconnected(&self, _context: &mut ValidatorContext, who: &PeerId) { + fn peer_disconnected(&self, _context: &mut dyn ValidatorContext, who: &PeerId) { self.inner.write().peers.peer_disconnected(who); } - fn validate(&self, context: &mut ValidatorContext, who: &PeerId, data: &[u8]) + fn validate(&self, context: &mut dyn ValidatorContext, who: &PeerId, data: &[u8]) -> network_gossip::ValidationResult { let (action, broadcast_topics) = self.do_validate(who, data); @@ -705,7 +705,7 @@ impl network_gossip::Validator for GossipValidator } fn message_allowed<'a>(&'a self) - -> Box bool + 'a> + -> Box bool + 'a> { let (inner, do_rebroadcast) = { use parking_lot::RwLockWriteGuard; @@ -763,7 +763,7 @@ impl network_gossip::Validator for GossipValidator }) } - fn message_expired<'a>(&'a self) -> Box bool + 'a> { + fn message_expired<'a>(&'a self) -> Box bool + 'a> { let inner = self.inner.read(); Box::new(move |topic, mut data| { // if the topic is not one of the ones that we are keeping at the moment, diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index e8af599279..875a60e8e0 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -103,7 +103,7 @@ pub trait AuthoritySetForFinalityChecker: Send + Sync { } /// FetchChecker-based implementation of AuthoritySetForFinalityChecker. -impl AuthoritySetForFinalityChecker for Arc> { +impl AuthoritySetForFinalityChecker for Arc> { fn check_authorities_proof( &self, hash: Block::Hash, @@ -132,7 +132,7 @@ impl AuthoritySetForFinalityChecker for Arc, RA> { client: Arc>, - authority_provider: Arc>, + authority_provider: Arc>, } impl, RA> FinalityProofProvider @@ -147,7 +147,7 @@ impl, RA> FinalityProofProvider /// - authority_provider for calling and proving runtime methods. pub fn new( client: Arc>, - authority_provider: Arc>, + authority_provider: Arc>, ) -> Self { FinalityProofProvider { client, authority_provider } } @@ -256,7 +256,7 @@ pub(crate) fn make_finality_proof_request(last_finalized: H, /// Returns None if there are no finalized blocks unknown to the caller. pub(crate) fn prove_finality, B: BlockchainBackend, J>( blockchain: &B, - authorities_provider: &AuthoritySetForFinalityProver, + authorities_provider: &dyn AuthoritySetForFinalityProver, authorities_set_id: u64, begin: Block::Hash, end: Block::Hash, @@ -416,7 +416,7 @@ pub(crate) fn check_finality_proof, B>( blockchain: &B, current_set_id: u64, current_authorities: Vec<(AuthorityId, u64)>, - authorities_provider: &AuthoritySetForFinalityChecker, + authorities_provider: &dyn AuthoritySetForFinalityChecker, remote_proof: Vec, ) -> ClientResult> where @@ -435,7 +435,7 @@ fn do_check_finality_proof, B, J>( blockchain: &B, current_set_id: u64, current_authorities: Vec<(AuthorityId, u64)>, - authorities_provider: &AuthoritySetForFinalityChecker, + authorities_provider: &dyn AuthoritySetForFinalityChecker, remote_proof: Vec, ) -> ClientResult> where @@ -489,7 +489,7 @@ fn do_check_finality_proof, B, J>( fn check_finality_proof_fragment, B, J>( blockchain: &B, authority_set: AuthoritiesOrEffects, - authorities_provider: &AuthoritySetForFinalityChecker, + authorities_provider: &dyn AuthoritySetForFinalityChecker, proof_fragment: FinalityProofFragment, ) -> ClientResult> where diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index d68793c047..ed57c68250 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -76,7 +76,7 @@ impl, RA, PRA, SC> JustificationImport { type Error = ConsensusError; - fn on_start(&self, link: &::consensus_common::import_queue::Link) { + fn on_start(&self, link: &dyn consensus_common::import_queue::Link) { let chain_info = self.inner.info().chain; // request justifications for all pending changes for which change blocks have already been imported @@ -183,7 +183,7 @@ where ); match maybe_change { - Err(e) => match api.has_api_with::, _>(&at, |v| v >= 2) { + Err(e) => match api.has_api_with::, _>(&at, |v| v >= 2) { Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), Ok(true) => { // API version is high enough to support forced changes diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index 73bc3411fe..c70f91d0f3 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -53,7 +53,7 @@ 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>, + authority_set_provider: Arc>, api: Arc, ) -> Result, ClientError> where @@ -80,7 +80,7 @@ pub fn light_block_import, RA, PRA>( /// - fetching finality proofs for blocks that are enacting consensus changes. pub struct GrandpaLightBlockImport, RA> { client: Arc>, - authority_set_provider: Arc>, + authority_set_provider: Arc>, data: Arc>>, } @@ -144,7 +144,7 @@ impl, RA> FinalityProofImport { type Error = ConsensusError; - fn on_start(&self, link: &::consensus_common::import_queue::Link) { + fn on_start(&self, link: &dyn consensus_common::import_queue::Link) { let chain_info = self.client.info().chain; let data = self.data.read(); @@ -160,7 +160,7 @@ impl, RA> FinalityProofImport hash: Block::Hash, number: NumberFor, finality_proof: Vec, - verifier: &Verifier, + verifier: &dyn Verifier, ) -> Result<(Block::Hash, NumberFor), Self::Error> { do_import_finality_proof::<_, _, _, _, GrandpaJustification>( &*self.client, @@ -271,12 +271,12 @@ fn do_import_block, RA, J>( /// Try to import finality proof. fn do_import_finality_proof, RA, J>( client: &Client, - authority_set_provider: &AuthoritySetForFinalityChecker, + authority_set_provider: &dyn AuthoritySetForFinalityChecker, data: &mut LightImportData, _hash: Block::Hash, _number: NumberFor, finality_proof: Vec, - verifier: &Verifier, + verifier: &dyn Verifier, ) -> Result<(Block::Hash, NumberFor), ConsensusError> where B: Backend + 'static, @@ -572,7 +572,7 @@ pub mod tests { { type Error = ConsensusError; - fn on_start(&self, link: &::consensus_common::import_queue::Link) { + fn on_start(&self, link: &dyn consensus_common::import_queue::Link) { self.0.on_start(link) } @@ -581,7 +581,7 @@ pub mod tests { hash: Block::Hash, number: NumberFor, finality_proof: Vec, - verifier: &Verifier, + verifier: &dyn Verifier, ) -> Result<(Block::Hash, NumberFor), Self::Error> { self.0.import_finality_proof(hash, number, finality_proof, verifier) } @@ -590,7 +590,7 @@ pub mod tests { /// 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>, + authority_set_provider: Arc>, api: Arc, ) -> Result, ClientError> where diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index ef04396b5f..51028fad84 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -150,7 +150,10 @@ impl TestNetFactory for GrandpaTestNet { } } - fn make_finality_proof_provider(&self, client: PeersClient) -> Option>> { + fn make_finality_proof_provider( + &self, + client: PeersClient + ) -> Option>> { match client { PeersClient::Full(ref client) => { let authorities_provider = Arc::new(self.test_config.clone()); @@ -201,7 +204,7 @@ impl MessageRouting { } impl Network for MessageRouting { - type In = Box + Send>; + type In = Box + Send>; /// Get a stream of messages for a specific gossip topic. fn messages_for(&self, topic: Hash) -> Self::In { @@ -463,7 +466,7 @@ fn run_to_completion_with( peers: &[AuthorityKeyring], with: F, ) -> u64 where - F: FnOnce(current_thread::Handle) -> Option>> + F: FnOnce(current_thread::Handle) -> Option>> { use parking_lot::RwLock; diff --git a/core/keyring/src/sr25519.rs b/core/keyring/src/sr25519.rs index 0097d7b2f9..24a83ab798 100644 --- a/core/keyring/src/sr25519.rs +++ b/core/keyring/src/sr25519.rs @@ -68,7 +68,7 @@ impl Keyring { } pub fn to_raw_public_vec(self) -> Vec { - Public::from(self).to_raw_vec() + Public::from(self).into_raw_vec() } pub fn sign(self, msg: &[u8]) -> Signature { diff --git a/core/network/src/config.rs b/core/network/src/config.rs index e6c1a4ddd5..d8fd0f68c7 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -35,9 +35,9 @@ pub struct Params { /// Network layer configuration. pub network_config: NetworkConfiguration, /// Substrate relay chain access point. - pub chain: Arc>, + pub chain: Arc>, /// Finality proof provider. - pub finality_proof_provider: Option>>, + pub finality_proof_provider: Option>>, /// On-demand service reference. pub on_demand: Option>>, /// Transaction pool. @@ -45,7 +45,7 @@ pub struct Params { /// Name of the protocol to use on the wire. Should be different for each chain. pub protocol_id: ProtocolId, /// Import queue to use. - pub import_queue: Box>, + pub import_queue: Box>, /// Protocol specialization. pub specialization: S, } diff --git a/core/network/src/consensus_gossip.rs b/core/network/src/consensus_gossip.rs index c5f1a2d927..9d654b5bfa 100644 --- a/core/network/src/consensus_gossip.rs +++ b/core/network/src/consensus_gossip.rs @@ -110,7 +110,7 @@ pub trait ValidatorContext { struct NetworkContext<'g, 'p, B: BlockT> { gossip: &'g mut ConsensusGossip, - protocol: &'p mut Context, + protocol: &'p mut dyn Context, engine_id: ConsensusEngineId, } @@ -145,11 +145,11 @@ impl<'g, 'p, B: BlockT> ValidatorContext for NetworkContext<'g, 'p, B> { } fn propagate<'a, B: BlockT, I>( - protocol: &mut Context, + protocol: &mut dyn Context, messages: I, intent: MessageIntent, peers: &mut HashMap>, - validators: &HashMap>>, + validators: &HashMap>>, ) where I: IntoIterator, // (msg_hash, topic, message) { @@ -200,23 +200,23 @@ fn propagate<'a, B: BlockT, I>( /// Validates consensus messages. pub trait Validator: Send + Sync { /// New peer is connected. - fn new_peer(&self, _context: &mut ValidatorContext, _who: &PeerId, _roles: Roles) { + fn new_peer(&self, _context: &mut dyn ValidatorContext, _who: &PeerId, _roles: Roles) { } /// New connection is dropped. - fn peer_disconnected(&self, _context: &mut ValidatorContext, _who: &PeerId) { + fn peer_disconnected(&self, _context: &mut dyn ValidatorContext, _who: &PeerId) { } /// Validate consensus message. - fn validate(&self, context: &mut ValidatorContext, sender: &PeerId, data: &[u8]) -> ValidationResult; + fn validate(&self, context: &mut dyn ValidatorContext, sender: &PeerId, data: &[u8]) -> ValidationResult; /// Produce a closure for validating messages on a given topic. - fn message_expired<'a>(&'a self) -> Box bool + 'a> { + fn message_expired<'a>(&'a self) -> Box bool + 'a> { Box::new(move |_topic, _data| false) } /// Produce a closure for filtering egress messages. - fn message_allowed<'a>(&'a self) -> Box bool + 'a> { + fn message_allowed<'a>(&'a self) -> Box bool + 'a> { Box::new(move |_who, _intent, _topic, _data| true) } } @@ -227,7 +227,7 @@ pub struct ConsensusGossip { live_message_sinks: HashMap<(ConsensusEngineId, B::Hash), Vec>>, messages: Vec>, known_messages: LruCache, - validators: HashMap>>, + validators: HashMap>>, next_broadcast: time::Instant, } @@ -250,7 +250,12 @@ impl ConsensusGossip { } /// Register message validator for a message type. - pub fn register_validator(&mut self, protocol: &mut Context, engine_id: ConsensusEngineId, validator: Arc>) { + pub fn register_validator( + &mut self, + protocol: &mut dyn Context, + engine_id: ConsensusEngineId, + validator: Arc> + ) { self.register_validator_internal(engine_id, validator.clone()); let peers: Vec<_> = self.peers.iter().map(|(id, peer)| (id.clone(), peer.roles)).collect(); for (id, roles) in peers { @@ -259,12 +264,12 @@ impl ConsensusGossip { } } - fn register_validator_internal(&mut self, engine_id: ConsensusEngineId, validator: Arc>) { + fn register_validator_internal(&mut self, engine_id: ConsensusEngineId, validator: Arc>) { self.validators.insert(engine_id, validator.clone()); } /// Handle new connected peer. - pub fn new_peer(&mut self, protocol: &mut Context, who: PeerId, roles: Roles) { + pub fn new_peer(&mut self, protocol: &mut dyn Context, who: PeerId, roles: Roles) { // light nodes are not valid targets for consensus gossip messages if !roles.is_full() { return; @@ -311,7 +316,7 @@ impl ConsensusGossip { } /// Call when a peer has been disconnected to stop tracking gossip status. - pub fn peer_disconnected(&mut self, protocol: &mut Context, who: PeerId) { + pub fn peer_disconnected(&mut self, protocol: &mut dyn Context, who: PeerId) { for (engine_id, v) in self.validators.clone() { let mut context = NetworkContext { gossip: self, protocol, engine_id: engine_id.clone() }; v.peer_disconnected(&mut context, &who); @@ -319,7 +324,7 @@ impl ConsensusGossip { } /// Perform periodic maintenance - pub fn tick(&mut self, protocol: &mut Context) { + pub fn tick(&mut self, protocol: &mut dyn Context) { self.collect_garbage(); if time::Instant::now() >= self.next_broadcast { self.rebroadcast(protocol); @@ -328,14 +333,14 @@ impl ConsensusGossip { } /// Rebroadcast all messages to all peers. - fn rebroadcast(&mut self, protocol: &mut Context) { + fn rebroadcast(&mut self, protocol: &mut dyn Context) { let messages = self.messages.iter() .map(|entry| (&entry.message_hash, &entry.topic, &entry.message)); propagate(protocol, messages, MessageIntent::PeriodicRebroadcast, &mut self.peers, &self.validators); } /// Broadcast all messages with given topic. - pub fn broadcast_topic(&mut self, protocol: &mut Context, topic: B::Hash, force: bool) { + pub fn broadcast_topic(&mut self, protocol: &mut dyn Context, topic: B::Hash, force: bool) { let messages = self.messages.iter() .filter_map(|entry| if entry.topic == topic { Some((&entry.message_hash, &entry.topic, &entry.message)) } else { None } @@ -409,7 +414,7 @@ impl ConsensusGossip { /// in all other cases. pub fn on_incoming( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, who: PeerId, message: ConsensusMessage, ) { @@ -473,7 +478,14 @@ 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) { + pub fn send_topic( + &mut self, + protocol: &mut dyn 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 @@ -503,7 +515,7 @@ impl ConsensusGossip { /// Multicast a message to all peers. pub fn multicast( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, topic: B::Hash, message: ConsensusMessage, force: bool, @@ -518,7 +530,7 @@ impl ConsensusGossip { /// later on. pub fn send_message( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, who: &PeerId, message: ConsensusMessage, ) { @@ -559,7 +571,12 @@ mod tests { struct AllowAll; impl Validator for AllowAll { - fn validate(&self, _context: &mut ValidatorContext, _sender: &PeerId, _data: &[u8]) -> ValidationResult { + fn validate( + &self, + _context: &mut dyn ValidatorContext, + _sender: &PeerId, + _data: &[u8], + ) -> ValidationResult { ValidationResult::ProcessAndKeep(H256::default()) } } @@ -568,7 +585,12 @@ mod tests { fn collects_garbage() { struct AllowOne; impl Validator for AllowOne { - fn validate(&self, _context: &mut ValidatorContext, _sender: &PeerId, data: &[u8]) -> ValidationResult { + fn validate( + &self, + _context: &mut dyn ValidatorContext, + _sender: &PeerId, + data: &[u8], + ) -> ValidationResult { if data[0] == 1 { ValidationResult::ProcessAndKeep(H256::default()) } else { @@ -576,7 +598,7 @@ mod tests { } } - fn message_expired<'a>(&'a self) -> Box bool + 'a> { + fn message_expired<'a>(&'a self) -> Box bool + 'a> { Box::new(move |_topic, data| data[0] != 1 ) } } diff --git a/core/network/src/on_demand_layer.rs b/core/network/src/on_demand_layer.rs index 95f9f4d67b..e58e045f2e 100644 --- a/core/network/src/on_demand_layer.rs +++ b/core/network/src/on_demand_layer.rs @@ -50,7 +50,7 @@ impl OnDemand where B::Header: HeaderT, { /// Creates new on-demand service. - pub fn new(checker: Arc>) -> Self { + pub fn new(checker: Arc>) -> Self { let (requests_send, requests_queue) = mpsc::unbounded(); let requests_queue = Mutex::new(Some(requests_queue)); @@ -62,7 +62,7 @@ impl OnDemand where } /// Get checker reference. - pub fn checker(&self) -> &Arc> { + pub fn checker(&self) -> &Arc> { &self.checker } diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index b660e097a1..569f1df030 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -346,7 +346,7 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> SyncContext for ProtocolContext<'a, self.context_data.peers.get(who).map(|p| p.info.clone()) } - fn client(&self) -> &Client { + fn client(&self) -> &dyn Client { &*self.context_data.chain } @@ -373,7 +373,7 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> SyncContext for ProtocolContext<'a, struct ContextData { // All connected peers peers: HashMap>, - pub chain: Arc>, + pub chain: Arc>, } /// Configuration for the Substrate-specific part of the networking layer. @@ -395,7 +395,7 @@ impl, H: ExHashT> Protocol { /// Create a new instance. pub fn new( config: ProtocolConfig, - chain: Arc>, + chain: Arc>, checker: Arc>, specialization: S, ) -> error::Result> { @@ -510,7 +510,7 @@ impl, H: ExHashT> Protocol { transaction_pool: &(impl TransactionPool + ?Sized), who: PeerId, message: Message, - finality_proof_provider: Option<&FinalityProofProvider> + finality_proof_provider: Option<&dyn FinalityProofProvider> ) -> CustomMessageOutcome { match message { GenericMessage::Status(s) => self.on_status_message(network_out, who, s), @@ -1399,7 +1399,7 @@ impl, H: ExHashT> Protocol { network_out: &mut dyn NetworkOut, who: PeerId, request: message::FinalityProofRequest, - finality_proof_provider: Option<&FinalityProofProvider> + finality_proof_provider: Option<&dyn FinalityProofProvider> ) { trace!(target: "sync", "Finality proof request from {} for {}", who, request.block); let finality_proof = finality_proof_provider.as_ref() diff --git a/core/network/src/service.rs b/core/network/src/service.rs index c7a32d472f..88c13b4806 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -358,7 +358,7 @@ impl> NetworkService { /// 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 + where F: FnOnce(&mut S, &mut dyn Context) + Send + 'static { let _ = self .protocol_sender @@ -367,7 +367,7 @@ impl> NetworkService { /// Execute a closure with the consensus gossip. pub fn with_gossip(&self, f: F) - where F: FnOnce(&mut ConsensusGossip, &mut Context) + Send + 'static + where F: FnOnce(&mut ConsensusGossip, &mut dyn Context) + Send + 'static { let _ = self .protocol_sender @@ -489,9 +489,9 @@ pub enum ProtocolMsg> { /// 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>), + ExecuteWithSpec(Box + Send + 'static>), /// Execute a closure with the consensus gossip. - ExecuteWithGossip(Box + Send + 'static>), + ExecuteWithGossip(Box + Send + 'static>), /// Incoming gossip consensus message. GossipConsensusMessage(B::Hash, ConsensusEngineId, Vec, GossipMessageRecipient), /// Tell protocol to perform regular maintenance. @@ -504,22 +504,22 @@ pub enum ProtocolMsg> { /// 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); + fn call_box(self: Box, spec: &mut S, context: &mut dyn Context); } -impl, F: FnOnce(&mut S, &mut Context)> SpecTask for F { - fn call_box(self: Box, spec: &mut S, context: &mut Context) { +impl, F: FnOnce(&mut S, &mut dyn Context)> SpecTask for F { + fn call_box(self: Box, spec: &mut S, context: &mut dyn 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); + fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut dyn Context); } -impl, &mut Context)> GossipTask for F { - fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut Context) { +impl, &mut dyn Context)> GossipTask for F { + fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut dyn Context) { (*self)(gossip, context) } } @@ -535,9 +535,9 @@ pub struct NetworkWorker, H: Ex service: Arc>, network_service: Arc>>>, peers: Arc>>>, - import_queue: Box>, + import_queue: Box>, transaction_pool: Arc>, - finality_proof_provider: Option>>, + finality_proof_provider: Option>>, network_port: mpsc::UnboundedReceiver>, protocol_rx: mpsc::UnboundedReceiver>, status_sinks: Arc>>>>, diff --git a/core/network/src/specialization.rs b/core/network/src/specialization.rs index 2778146b52..772a1bcbe1 100644 --- a/core/network/src/specialization.rs +++ b/core/network/src/specialization.rs @@ -25,15 +25,15 @@ pub trait NetworkSpecialization: Send + Sync + 'static { fn status(&self) -> Vec; /// Called when a peer successfully handshakes. - fn on_connect(&mut self, ctx: &mut Context, who: PeerId, status: crate::message::Status); + fn on_connect(&mut self, ctx: &mut dyn Context, who: PeerId, status: crate::message::Status); /// Called when a peer is disconnected. If the peer ID is unknown, it should be ignored. - fn on_disconnect(&mut self, ctx: &mut Context, who: PeerId); + fn on_disconnect(&mut self, ctx: &mut dyn Context, who: PeerId); /// Called when a network-specific message arrives. fn on_message( &mut self, - ctx: &mut Context, + ctx: &mut dyn Context, who: PeerId, message: &mut Option> ); @@ -43,11 +43,11 @@ pub trait NetworkSpecialization: Send + Sync + 'static { fn on_abort(&mut self) { } /// Called periodically to maintain peers and handle timeouts. - fn maintain_peers(&mut self, _ctx: &mut Context) { } + fn maintain_peers(&mut self, _ctx: &mut dyn Context) { } /// Called when a block is _imported_ at the head of the chain (not during major sync). /// 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) { } + fn on_block_imported(&mut self, _ctx: &mut dyn Context, _hash: B::Hash, _header: &B::Header) { } } /// Context for a network-specific handler. diff --git a/core/network/src/sync.rs b/core/network/src/sync.rs index 27a412ca0e..9b327c1a20 100644 --- a/core/network/src/sync.rs +++ b/core/network/src/sync.rs @@ -72,7 +72,7 @@ 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; + fn client(&self) -> &dyn 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. @@ -131,7 +131,7 @@ pub(crate) enum PeerSyncState { /// Relay chain sync strategy. pub struct ChainSync { - genesis_hash: B::Hash, + _genesis_hash: B::Hash, peers: HashMap>, blocks: BlockCollection, best_queued_number: NumberFor, @@ -191,7 +191,7 @@ impl ChainSync { } ChainSync { - genesis_hash: info.chain.genesis_hash, + _genesis_hash: info.chain.genesis_hash, peers: HashMap::new(), blocks: BlockCollection::new(), best_queued_hash: info.best_queued_hash.unwrap_or(info.chain.best_hash), @@ -230,14 +230,14 @@ impl ChainSync { let best_seen = self.best_seen_block(); let state = self.state(&best_seen); Status { - state: state, + state, best_seen_block: best_seen, num_peers: self.peers.len() as u32, } } /// 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) { + pub(crate) fn new_peer(&mut self, protocol: &mut dyn Context, who: PeerId) { 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) @@ -366,7 +366,7 @@ impl ChainSync { #[must_use] pub(crate) fn on_block_data( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, who: PeerId, request: message::BlockRequest, response: message::BlockResponse @@ -483,7 +483,7 @@ impl ChainSync { #[must_use] pub(crate) fn on_block_justification_data( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, who: PeerId, _request: message::BlockRequest, response: message::BlockResponse, @@ -528,7 +528,7 @@ impl ChainSync { /// Handle new finality proof data. pub(crate) fn on_block_finality_proof_data( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, who: PeerId, response: message::FinalityProofResponse, ) -> Option<(PeerId, B::Hash, NumberFor, Vec)> { @@ -573,7 +573,7 @@ impl ChainSync { } /// Maintain the sync process (download new blocks, fetch justifications). - pub fn maintain_sync(&mut self, protocol: &mut Context) { + pub fn maintain_sync(&mut self, protocol: &mut dyn Context) { let peers: Vec = self.peers.keys().map(|p| p.clone()).collect(); for peer in peers { self.download_new(protocol, peer); @@ -583,7 +583,7 @@ impl ChainSync { /// Called periodically to perform any time-based actions. Must be called at a regular /// interval. - pub fn tick(&mut self, protocol: &mut Context) { + pub fn tick(&mut self, protocol: &mut dyn Context) { self.extra_requests.dispatch(&mut self.peers, protocol); } @@ -591,7 +591,7 @@ impl ChainSync { /// /// 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) { + pub fn request_justification(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut dyn Context) { self.extra_requests.justifications().queue_request( (*hash, number), |base, block| protocol.client().is_descendent_of(base, block), @@ -620,7 +620,7 @@ impl ChainSync { /// 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) { + pub fn request_finality_proof(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut dyn Context) { self.extra_requests.finality_proofs().queue_request( (*hash, number), |base, block| protocol.client().is_descendent_of(base, block), @@ -647,7 +647,7 @@ impl ChainSync { } /// Notify about finalization of the given block. - pub fn on_block_finalized(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut Context) { + pub fn on_block_finalized(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut dyn Context) { if let Err(err) = self.extra_requests.on_block_finalized( hash, number, @@ -699,7 +699,7 @@ impl ChainSync { #[must_use] pub(crate) fn on_block_announce( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, who: PeerId, hash: B::Hash, header: &B::Header, @@ -812,12 +812,12 @@ impl ChainSync { self.peers.iter().any(|(_, p)| p.state == PeerSyncState::DownloadingStale(*hash)) } - fn is_known(&self, protocol: &mut Context, hash: &B::Hash) -> bool { + fn is_known(&self, protocol: &mut dyn Context, hash: &B::Hash) -> bool { block_status(&*protocol.client(), &self.queue_blocks, *hash).ok().map_or(false, |s| s != BlockStatus::Unknown) } /// Call when a peer has disconnected. - pub(crate) fn peer_disconnected(&mut self, protocol: &mut Context, who: PeerId) { + pub(crate) fn peer_disconnected(&mut self, protocol: &mut dyn Context, who: PeerId) { self.blocks.clear_peer_download(&who); self.peers.remove(&who); self.extra_requests.peer_disconnected(who); @@ -825,7 +825,7 @@ impl ChainSync { } /// Restart the sync process. - pub(crate) fn restart(&mut self, protocol: &mut Context) { + pub(crate) fn restart(&mut self, protocol: &mut dyn Context) { self.queue_blocks.clear(); self.best_importing_number = Zero::zero(); self.blocks.clear(); @@ -886,7 +886,7 @@ impl ChainSync { } // Issue a request for a peer to download new blocks, if any are available. - fn download_new(&mut self, protocol: &mut Context, who: PeerId) { + fn download_new(&mut self, protocol: &mut dyn Context, who: PeerId) { if let Some((_, request)) = self.select_new_blocks(who.clone()) { protocol.send_block_request(who, request); } @@ -942,7 +942,7 @@ impl ChainSync { } } - fn request_ancestry(protocol: &mut Context, who: PeerId, block: NumberFor) { + fn request_ancestry(protocol: &mut dyn Context, who: PeerId, block: NumberFor) { trace!(target: "sync", "Requesting ancestry block #{} from {}", block, who); let request = message::generic::BlockRequest { id: 0, @@ -958,7 +958,7 @@ impl ChainSync { /// Get block status, taking into account import queue. fn block_status( - chain: &crate::chain::Client, + chain: &dyn crate::chain::Client, queue_blocks: &HashSet, hash: B::Hash) -> Result { diff --git a/core/network/src/sync/extra_requests.rs b/core/network/src/sync/extra_requests.rs index 3ebf2b2509..ff8323166b 100644 --- a/core/network/src/sync/extra_requests.rs +++ b/core/network/src/sync/extra_requests.rs @@ -39,7 +39,7 @@ pub(crate) trait ExtraRequestsEssence { /// 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); + fn send_network_request(&self, protocol: &mut dyn Context, peer: PeerId, request: ExtraRequest); /// Create peer state for peer that is downloading extra data. fn peer_downloading_state(&self, block: B::Hash) -> PeerSyncState; } @@ -69,7 +69,7 @@ impl ExtraRequestsAggregator { } /// Dispatches all possible pending requests to the given peers. - pub(crate) fn dispatch(&mut self, peers: &mut HashMap>, protocol: &mut Context) { + pub(crate) fn dispatch(&mut self, peers: &mut HashMap>, protocol: &mut dyn Context) { self.justifications.dispatch(peers, protocol); self.finality_proofs.dispatch(peers, protocol); } @@ -132,7 +132,7 @@ impl> ExtraRequests { /// 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) { + pub(crate) fn dispatch(&mut self, peers: &mut HashMap>, protocol: &mut dyn Context) { if self.pending_requests.is_empty() { return; } @@ -373,7 +373,7 @@ impl ExtraRequestsEssence for JustificationsRequestsEssence { "justification" } - fn send_network_request(&self, protocol: &mut Context, peer: PeerId, request: ExtraRequest) { + fn send_network_request(&self, protocol: &mut dyn Context, peer: PeerId, request: ExtraRequest) { protocol.send_block_request(peer, message::generic::BlockRequest { id: 0, fields: message::BlockAttributes::JUSTIFICATION, @@ -398,7 +398,7 @@ impl ExtraRequestsEssence for FinalityProofRequestsEssence { "finality proof" } - fn send_network_request(&self, protocol: &mut Context, peer: PeerId, request: ExtraRequest) { + fn send_network_request(&self, protocol: &mut dyn Context, peer: PeerId, request: ExtraRequest) { protocol.send_finality_proof_request(peer, message::generic::FinalityProofRequest { id: 0, block: request.0, diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index b47cef11ac..b9703d71e0 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -103,22 +103,19 @@ impl NetworkSpecialization for DummySpecialization { fn on_connect( &mut self, - _ctx: &mut SpecializationContext, + _ctx: &mut dyn SpecializationContext, _peer_id: PeerId, _status: crate::message::Status - ) { - } + ) {} - fn on_disconnect(&mut self, _ctx: &mut SpecializationContext, _peer_id: PeerId) { - } + fn on_disconnect(&mut self, _ctx: &mut dyn SpecializationContext, _peer_id: PeerId) {} fn on_message( &mut self, - _ctx: &mut SpecializationContext, + _ctx: &mut dyn SpecializationContext, _peer_id: PeerId, _message: &mut Option>, - ) { - } + ) {} } pub type PeersFullClient = @@ -292,7 +289,7 @@ pub struct Peer> { finalized_hash: Mutex>, } -type MessageFilter = Fn(&NetworkMsg) -> bool; +type MessageFilter = dyn Fn(&NetworkMsg) -> bool; pub enum FromNetworkMsg { /// A peer connected, with debug info. @@ -605,7 +602,7 @@ impl> Peer { /// Execute a closure with the consensus gossip. pub fn with_gossip(&self, f: F) - where F: FnOnce(&mut ConsensusGossip, &mut Context) + Send + 'static + where F: FnOnce(&mut ConsensusGossip, &mut dyn Context) + Send + 'static { self.net_proto_channel.send_from_client(ProtocolMsg::ExecuteWithGossip(Box::new(f))); } @@ -767,7 +764,7 @@ pub trait TestNetFactory: Sized { } /// Get finality proof provider (if supported). - fn make_finality_proof_provider(&self, _client: PeersClient) -> Option>> { + fn make_finality_proof_provider(&self, _client: PeersClient) -> Option>> { None } @@ -799,7 +796,7 @@ pub trait TestNetFactory: Sized { protocol_status: Arc>>, import_queue: Box>, tx_pool: EmptyTransactionPool, - finality_proof_provider: Option>>, + finality_proof_provider: Option>>, mut protocol: Protocol, network_sender: mpsc::UnboundedSender>, mut network_to_protocol_rx: mpsc::UnboundedReceiver>, diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index 376f41b445..081ae61a5b 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -91,7 +91,7 @@ impl OffchainWorkers where { let runtime = self.client.runtime_api(); let at = BlockId::number(*number); - let has_api = runtime.has_api::>(&at); + let has_api = runtime.has_api::>(&at); debug!("Checking offchain workers at {:?}: {:?}", at, has_api); if has_api.unwrap_or(false) { diff --git a/core/primitives/src/hexdisplay.rs b/core/primitives/src/hexdisplay.rs index d748208d0e..cd2b6c18cb 100644 --- a/core/primitives/src/hexdisplay.rs +++ b/core/primitives/src/hexdisplay.rs @@ -21,7 +21,7 @@ pub struct HexDisplay<'a>(&'a [u8]); impl<'a> HexDisplay<'a> { /// Create new instance that will display `d` as a hex string when displayed. - pub fn from(d: &'a AsBytesRef) -> Self { HexDisplay(d.as_bytes_ref()) } + pub fn from(d: &'a dyn AsBytesRef) -> Self { HexDisplay(d.as_bytes_ref()) } } impl<'a> ::core::fmt::Display for HexDisplay<'a> { @@ -79,7 +79,7 @@ pub fn ascii_format(asciish: &[u8]) -> String { let mut latch = false; for c in asciish { match (latch, *c) { - (false, 32...127) => r.push(*c as char), + (false, 32..=127) => r.push(*c as char), _ => { if !latch { r.push('#'); diff --git a/core/primitives/src/lib.rs b/core/primitives/src/lib.rs index 69b9f1a960..7c0fd324fe 100644 --- a/core/primitives/src/lib.rs +++ b/core/primitives/src/lib.rs @@ -86,7 +86,7 @@ pub enum ExecutionContext { /// Context used for block construction. BlockConstruction, /// Offchain worker context. - OffchainWorker(Box), + OffchainWorker(Box), /// Context used for other calls. Other, } diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs index 764837d7b4..7d54c9d61e 100644 --- a/core/primitives/src/offchain.rs +++ b/core/primitives/src/offchain.rs @@ -35,8 +35,8 @@ impl TryFrom for CryptoKind { fn try_from(kind: u32) -> Result { match kind { - e if e == CryptoKind::Sr25519 as u8 as u32 => Ok(CryptoKind::Sr25519), - e if e == CryptoKind::Ed25519 as u8 as u32 => Ok(CryptoKind::Ed25519), + e if e == u32::from(CryptoKind::Sr25519 as u8) => Ok(CryptoKind::Sr25519), + e if e == u32::from(CryptoKind::Ed25519 as u8) => Ok(CryptoKind::Ed25519), _ => Err(()) } } @@ -103,7 +103,7 @@ impl From for u32 { HttpRequestStatus::Unknown => 0, HttpRequestStatus::DeadlineReached => 10, HttpRequestStatus::Timeout => 20, - HttpRequestStatus::Finished(code) => code as u32, + HttpRequestStatus::Finished(code) => u32::from(code), } } } @@ -116,7 +116,7 @@ impl TryFrom for HttpRequestStatus { 0 => Ok(HttpRequestStatus::Unknown), 10 => Ok(HttpRequestStatus::DeadlineReached), 20 => Ok(HttpRequestStatus::Timeout), - 100...999 => Ok(HttpRequestStatus::Finished(status as u16)), + 100..=999 => u16::try_from(status).map(HttpRequestStatus::Finished).map_err(|_| ()), _ => Err(()), } } diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index 8f309ec030..876dcb7078 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -204,16 +204,16 @@ impl From for Signature { } #[cfg(feature = "std")] -impl ::std::fmt::Debug for Signature { +impl std::fmt::Debug for Signature { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) } } #[cfg(feature = "std")] -impl ::std::hash::Hash for Signature { - fn hash(&self, state: &mut H) { - ::std::hash::Hash::hash(&self.0[..], state); +impl std::hash::Hash for Signature { + fn hash(&self, state: &mut H) { + std::hash::Hash::hash(&self.0[..], state); } } @@ -304,15 +304,13 @@ impl Public { /// Return a `Vec` filled with raw data. #[cfg(feature = "std")] - pub fn to_raw_vec(self) -> Vec { - let r: &[u8; 32] = self.as_ref(); - r.to_vec() + pub fn into_raw_vec(self) -> Vec { + self.0.to_vec() } /// Return a slice filled with raw data. pub fn as_slice(&self) -> &[u8] { - let r: &[u8; 32] = self.as_ref(); - &r[..] + &self.0 } /// Return a slice filled with raw data. @@ -637,7 +635,7 @@ mod test { #[test] fn verify_from_wasm_works() { // The values in this test case are compared to the output of `node-test.js` in schnorrkel-js. - // + // // This is to make sure that the wasm library is compatible. let pk = Pair::from_seed(hex!("0000000000000000000000000000000000000000000000000000000000000000")); let public = pk.public(); diff --git a/core/rpc/src/author/error.rs b/core/rpc/src/author/error.rs index 5955108249..008a70b674 100644 --- a/core/rpc/src/author/error.rs +++ b/core/rpc/src/author/error.rs @@ -34,7 +34,7 @@ pub enum Error { Pool(txpool::error::Error), /// Verification error #[display(fmt="Extrinsic verification error: {}", "_0.description()")] - Verification(Box<::std::error::Error + Send>), + Verification(Box), /// Incorrect extrinsic format. #[display(fmt="Invalid extrinsic format")] BadFormat, diff --git a/core/rpc/src/system/mod.rs b/core/rpc/src/system/mod.rs index 8aac02b77d..d6f2b75515 100644 --- a/core/rpc/src/system/mod.rs +++ b/core/rpc/src/system/mod.rs @@ -74,7 +74,7 @@ pub trait SystemApi { /// System API implementation pub struct System { info: SystemInfo, - sync: Arc>, + sync: Arc>, should_have_peers: bool, } @@ -82,7 +82,7 @@ impl System { /// Creates new `System` given the `SystemInfo`. pub fn new( info: SystemInfo, - sync: Arc>, + sync: Arc>, should_have_peers: bool, ) -> Self { System { diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index 3be3b9b17a..83f103ec8f 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -151,7 +151,7 @@ pub fn import_blocks( let (header, extrinsics) = signed.block.deconstruct(); let hash = header.hash(); let block = message::BlockData:: { - hash: hash, + hash, justification: signed.justification, header: Some(header), body: Some(extrinsics), diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 3876279cc7..a314588d0a 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -139,7 +139,7 @@ pub trait StartRPC { fn start_rpc( client: Arc>, - network: Arc>>, + network: Arc>>, should_have_peers: bool, system_info: SystemInfo, rpc_http: Option, @@ -159,7 +159,7 @@ impl StartRPC for C where fn start_rpc( client: Arc>, - network: Arc>>, + network: Arc>>, should_have_peers: bool, rpc_system_info: SystemInfo, rpc_http: Option, @@ -339,7 +339,7 @@ pub trait ServiceFactory: 'static + Sized { /// Build finality proof provider for serving network requests on full node. fn build_finality_proof_provider( client: Arc> - ) -> Result>>, error::Error>; + ) -> Result>>, error::Error>; /// Build the Fork Choice algorithm for full client fn build_select_chain( @@ -435,7 +435,7 @@ pub trait Components: Sized + 'static { /// Finality proof provider for serving network requests. fn build_finality_proof_provider( client: Arc> - ) -> Result::Block>>>, error::Error>; + ) -> Result::Block>>>, error::Error>; /// Build fork choice selector fn build_select_chain( @@ -536,7 +536,7 @@ impl Components for FullComponents { fn build_finality_proof_provider( client: Arc> - ) -> Result::Block>>>, error::Error> { + ) -> Result::Block>>>, error::Error> { Factory::build_finality_proof_provider(client) } } @@ -619,7 +619,7 @@ impl Components for LightComponents { fn build_finality_proof_provider( _client: Arc> - ) -> Result::Block>>>, error::Error> { + ) -> Result::Block>>>, error::Error> { Ok(None) } fn build_select_chain( diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 0e16d2e7be..bc40d6008b 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -80,7 +80,7 @@ pub struct Service { signal: Option, /// Configuration of this Service pub config: FactoryFullConfiguration, - _rpc: Box<::std::any::Any + Send + Sync>, + _rpc: Box, _telemetry: Option>, _offchain_workers: Option, ComponentBlock>>>, _telemetry_on_connect_sinks: Arc>>>, @@ -104,7 +104,7 @@ 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>, + pub on_exit: Box + Send + 'static>, /// Event stream. pub telemetry_connection_sinks: TelemetryOnConnectNotifications, /// Executor to which the hook is spawned. diff --git a/core/sr-api-macros/src/lib.rs b/core/sr-api-macros/src/lib.rs index c5f8941002..7399da0794 100644 --- a/core/sr-api-macros/src/lib.rs +++ b/core/sr-api-macros/src/lib.rs @@ -54,11 +54,11 @@ mod utils; /// # extern crate substrate_primitives; /// # /// # use runtime_primitives::traits::GetNodeBlockType; -/// # use test_client::runtime::Block; +/// # use test_client::runtime::{Block, Header}; /// # /// # /// 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 {} +/// # pub struct Runtime {} /// # impl GetNodeBlockType for Runtime { /// # type NodeBlock = Block; /// # } @@ -78,6 +78,15 @@ mod utils; /// /// /// All runtime api implementations need to be done in one call of the macro! /// impl_runtime_apis! { +/// # impl client::runtime_api::Core for Runtime { +/// # fn version() -> client::runtime_api::RuntimeVersion { +/// # unimplemented!() +/// # } +/// # fn execute_block(_block: Block) {} +/// # fn initialize_block(_header: &Header) {} +/// # fn authorities() -> Vec> { unimplemented!() } +/// # } +/// /// impl self::Balance for Runtime { /// fn get_balance() -> u64 { /// 1 @@ -176,7 +185,7 @@ pub fn impl_runtime_apis(input: TokenStream) -> TokenStream { /// /// /// /// Is callable by `set_balance_before_version_2`. /// #[changed_in(2)] -/// fn set_balance(val: u8); +/// fn set_balance(val: u16); /// /// In version 2, we added this new function. /// fn increase_balance(val: u64); /// } diff --git a/core/sr-api-macros/tests/decl_and_impl.rs b/core/sr-api-macros/tests/decl_and_impl.rs index 51f95d51b1..44db8021d4 100644 --- a/core/sr-api-macros/tests/decl_and_impl.rs +++ b/core/sr-api-macros/tests/decl_and_impl.rs @@ -122,7 +122,7 @@ fn check_runtime_api_versions_contains() { #[test] fn check_runtime_api_versions() { - check_runtime_api_versions_contains::>(); - check_runtime_api_versions_contains::>(); - check_runtime_api_versions_contains::>(); + check_runtime_api_versions_contains::>(); + check_runtime_api_versions_contains::>(); + check_runtime_api_versions_contains::>(); } diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 01e7614de6..0ba833bd9f 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -251,7 +251,7 @@ impl HashingApi for () { } } -fn with_offchain(f: impl FnOnce(&mut offchain::Externalities) -> R, msg: &'static str) -> R { +fn with_offchain(f: impl FnOnce(&mut dyn offchain::Externalities) -> R, msg: &'static str) -> R { ext::with(|ext| ext .offchain() .map(|ext| f(ext)) @@ -395,7 +395,7 @@ 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. -pub fn with_externalities R>(ext: &mut Externalities, f: F) -> R { +pub fn with_externalities R>(ext: &mut dyn Externalities, f: F) -> R { ext::using(ext, f) } diff --git a/core/sr-primitives/src/generic/mod.rs b/core/sr-primitives/src/generic/mod.rs index 3d7682407e..89c4291d79 100644 --- a/core/sr-primitives/src/generic/mod.rs +++ b/core/sr-primitives/src/generic/mod.rs @@ -44,8 +44,8 @@ use rstd::prelude::*; fn encode_with_vec_prefix)>(encoder: F) -> Vec { let size = ::rstd::mem::size_of::(); let reserve = match size { - 0...0b00111111 => 1, - 0...0b00111111_11111111 => 2, + 0..=0b00111111 => 1, + 0..=0b00111111_11111111 => 2, _ => 4, }; let mut v = Vec::with_capacity(reserve + size); diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index 0eb0b84b27..e9939711f1 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -156,7 +156,7 @@ impl Externalities for BasicExternalities where H::Out: Ord { Ok(None) } - fn offchain(&mut self) -> Option<&mut offchain::Externalities> { + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { warn!("Call to non-existent out offchain externalities set."); None } @@ -171,7 +171,7 @@ mod tests { #[test] fn commit_should_work() { let mut ext = BasicExternalities::default(); - let ext = &mut ext as &mut Externalities; + let ext = &mut ext as &mut dyn Externalities; 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()); @@ -182,7 +182,7 @@ mod tests { #[test] fn set_and_retrieve_code() { let mut ext = BasicExternalities::default(); - let ext = &mut ext as &mut Externalities; + let ext = &mut ext as &mut dyn Externalities; let code = vec![1, 2, 3]; ext.set_storage(CODE.to_vec(), code.clone()); diff --git a/core/state-machine/src/changes_trie/mod.rs b/core/state-machine/src/changes_trie/mod.rs index 15ea1b474f..7dc95fb5a7 100644 --- a/core/state-machine/src/changes_trie/mod.rs +++ b/core/state-machine/src/changes_trie/mod.rs @@ -112,7 +112,7 @@ pub trait Storage: RootsStorage { } /// Changes trie storage -> trie backend essence adapter. -pub struct TrieBackendStorageAdapter<'a, H: Hasher, Number: BlockNumber>(pub &'a Storage); +pub struct TrieBackendStorageAdapter<'a, H: Hasher, Number: BlockNumber>(pub &'a dyn Storage); impl<'a, H: Hasher, N: BlockNumber> crate::TrieBackendStorage for TrieBackendStorageAdapter<'a, H, N> { type Overlay = trie::MemoryDB; diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index 6ec1ce77e6..5a0daeb348 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -343,7 +343,7 @@ where Ok(root) } - fn offchain(&mut self) -> Option<&mut offchain::Externalities> { + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { self.offchain_externalities.as_mut().map(|x| &mut **x as _) } } diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index 9f0e20ce01..93d70423d5 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -222,7 +222,7 @@ pub trait Externalities { fn storage_changes_root(&mut self, parent: H::Out) -> Result, ()> where H::Out: Ord; /// Returns offchain externalities extension if present. - fn offchain(&mut self) -> Option<&mut offchain::Externalities>; + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities>; } /// An implementation of offchain extensions that should never be triggered. @@ -502,7 +502,7 @@ impl<'a, H, N, B, T, O, Exec> StateMachine<'a, H, N, B, T, O, Exec> where pub fn execute( &mut self, strategy: ExecutionStrategy, - ) -> Result<(Vec, B::Transaction, Option>), Box> { + ) -> Result<(Vec, B::Transaction, Option>), Box> { // We are not giving a native call and thus we are sure that the result can never be a native // value. self.execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( @@ -613,7 +613,7 @@ impl<'a, H, N, B, T, O, Exec> StateMachine<'a, H, N, B, T, O, Exec> where manager: ExecutionManager, compute_tx: bool, mut native_call: Option, - ) -> Result<(NativeOrEncoded, Option, Option>), Box> where + ) -> Result<(NativeOrEncoded, Option, Option>), Box> where R: Decode + Encode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, Handler: FnOnce( @@ -674,7 +674,7 @@ pub fn prove_execution( exec: &Exec, method: &str, call_data: &[u8], -) -> Result<(Vec, Vec>), Box> +) -> Result<(Vec, Vec>), Box> where B: Backend, H: Hasher, @@ -682,7 +682,7 @@ where H::Out: Ord + 'static, { let trie_backend = backend.as_trie_backend() - .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; + .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; prove_execution_on_trie_backend(trie_backend, overlay, exec, method, call_data) } @@ -701,7 +701,7 @@ pub fn prove_execution_on_trie_backend( exec: &Exec, method: &str, call_data: &[u8], -) -> Result<(Vec, Vec>), Box> +) -> Result<(Vec, Vec>), Box> where S: trie_backend_essence::TrieBackendStorage, H: Hasher, @@ -736,7 +736,7 @@ pub fn execution_proof_check( exec: &Exec, method: &str, call_data: &[u8], -) -> Result, Box> +) -> Result, Box> where H: Hasher, Exec: CodeExecutor, @@ -753,7 +753,7 @@ pub fn execution_proof_check_on_trie_backend( exec: &Exec, method: &str, call_data: &[u8], -) -> Result, Box> +) -> Result, Box> where H: Hasher, Exec: CodeExecutor, @@ -780,7 +780,7 @@ where pub fn prove_read( mut backend: B, key: &[u8] -) -> Result<(Option>, Vec>), Box> +) -> Result<(Option>, Vec>), Box> where B: Backend, H: Hasher, @@ -788,7 +788,7 @@ where { let trie_backend = backend.as_trie_backend() .ok_or_else( - ||Box::new(ExecutionError::UnableToGenerateProof) as Box + ||Box::new(ExecutionError::UnableToGenerateProof) as Box )?; prove_read_on_trie_backend(trie_backend, key) } @@ -798,14 +798,14 @@ pub fn prove_child_read( mut backend: B, storage_key: &[u8], key: &[u8], -) -> Result<(Option>, Vec>), Box> +) -> Result<(Option>, Vec>), Box> where B: Backend, H: Hasher, H::Out: Ord { let trie_backend = backend.as_trie_backend() - .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; + .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; prove_child_read_on_trie_backend(trie_backend, storage_key, key) } @@ -814,14 +814,14 @@ where pub fn prove_read_on_trie_backend( trie_backend: &TrieBackend, key: &[u8] -) -> Result<(Option>, Vec>), Box> +) -> 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.storage(key).map_err(|e| Box::new(e) as Box)?; + let result = proving_backend.storage(key).map_err(|e| Box::new(e) as Box)?; Ok((result, proving_backend.extract_proof())) } @@ -830,15 +830,14 @@ pub fn prove_child_read_on_trie_backend( trie_backend: &TrieBackend, storage_key: &[u8], key: &[u8] -) -> Result<(Option>, Vec>), Box> +) -> 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)?; + let result = proving_backend.child_storage(storage_key, key).map_err(|e| Box::new(e) as Box)?; Ok((result, proving_backend.extract_proof())) } @@ -847,7 +846,7 @@ pub fn read_proof_check( root: H::Out, proof: Vec>, key: &[u8], -) -> Result>, Box> +) -> Result>, Box> where H: Hasher, H::Out: Ord @@ -862,7 +861,7 @@ pub fn read_child_proof_check( proof: Vec>, storage_key: &[u8], key: &[u8], -) -> Result>, Box> +) -> Result>, Box> where H: Hasher, H::Out: Ord @@ -876,12 +875,12 @@ where pub fn read_proof_check_on_proving_backend( proving_backend: &TrieBackend, H>, key: &[u8], -) -> Result>, Box> +) -> Result>, Box> where H: Hasher, H::Out: Ord { - proving_backend.storage(key).map_err(|e| Box::new(e) as Box) + proving_backend.storage(key).map_err(|e| Box::new(e) as Box) } /// Check child storage read proof on pre-created proving backend. @@ -889,20 +888,24 @@ pub fn read_child_proof_check_on_proving_backend( proving_backend: &TrieBackend, H>, storage_key: &[u8], key: &[u8], -) -> Result>, Box> +) -> Result>, Box> where H: Hasher, H::Out: Ord { - proving_backend.child_storage(storage_key, key).map_err(|e| Box::new(e) as Box) + 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> { +pub(crate) fn set_changes_trie_config( + overlay: &mut OverlayedChanges, + config: Option>, + final_check: bool, +) -> Result<(), Box> { let config = match config { Some(v) => Some(Decode::decode(&mut &v[..]) - .ok_or_else(|| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), + .ok_or_else(|| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), None => None, }; @@ -920,16 +923,16 @@ pub(crate) fn set_changes_trie_config(overlay: &mut OverlayedChanges, config: Op /// Reads storage value from overlay or from the backend. fn try_read_overlay_value(overlay: &OverlayedChanges, backend: &B, key: &[u8]) - -> Result>, Box> + -> Result>, Box> where H: Hasher, - B: Backend, { match overlay.storage(key).map(|x| x.map(|x| x.to_vec())) { Some(value) => Ok(value), - None => backend.storage(key) - .map_err(|err| Box::new(ExecutionError::Backend(format!("{}", err))) as Box), + None => backend + .storage(key) + .map_err(|err| Box::new(ExecutionError::Backend(format!("{}", err))) as Box), } } diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index f9472ed747..60178ff899 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -193,17 +193,17 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> pub fn create_proof_check_backend( root: H::Out, proof: Vec> -) -> Result, H>, Box> +) -> Result, H>, Box> where H: Hasher, { let db = create_proof_check_backend_storage(proof); - if !db.contains(&root, &[]) { - return Err(Box::new(ExecutionError::InvalidProof) as Box); + if db.contains(&root, &[]) { + Ok(TrieBackend::new(db, root)) + } else { + Err(Box::new(ExecutionError::InvalidProof)) } - - Ok(TrieBackend::new(db, root)) } /// Create in-memory storage of proof check backend. diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index 3934e726af..68b9d28752 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -37,7 +37,7 @@ pub struct TestExternalities { overlay: OverlayedChanges, backend: InMemory, changes_trie_storage: ChangesTrieInMemoryStorage, - offchain: Option>, + offchain: Option>, } impl TestExternalities { @@ -234,7 +234,7 @@ impl Externalities for TestExternalities )?.map(|(root, _)| root.clone())) } - fn offchain(&mut self) -> Option<&mut offchain::Externalities> { + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { self.offchain .as_mut() .map(|x| &mut **x as _) diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index 89a5b42a84..fc30f94f05 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -153,8 +153,8 @@ impl<'a, > hash_db::AsPlainDB for Ephemeral<'a, S, H> { - 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 } + fn as_plain_db<'b>(&'b self) -> &'b (dyn hash_db::PlainDB + 'b) { self } + fn as_plain_db_mut<'b>(&'b mut self) -> &'b mut (dyn hash_db::PlainDB + 'b) { self } } impl<'a, @@ -163,8 +163,8 @@ impl<'a, > hash_db::AsHashDB for Ephemeral<'a, S, H> { - 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 } + fn as_hash_db<'b>(&'b self) -> &'b (dyn hash_db::HashDB + 'b) { self } + fn as_hash_db_mut<'b>(&'b mut self) -> &'b mut (dyn hash_db::HashDB + 'b) { self } } impl<'a, S: TrieBackendStorage, H: Hasher> Ephemeral<'a, S, H> { @@ -275,7 +275,7 @@ pub trait TrieBackendStorage: Send + Sync { } // This implementation is used by normal storage trie clients. -impl TrieBackendStorage for Arc> { +impl TrieBackendStorage for Arc> { type Overlay = PrefixedMemoryDB; fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { diff --git a/core/telemetry/src/lib.rs b/core/telemetry/src/lib.rs index 16bc69ec00..3f980c5929 100644 --- a/core/telemetry/src/lib.rs +++ b/core/telemetry/src/lib.rs @@ -38,14 +38,14 @@ pub struct TelemetryConfig { pub endpoints: TelemetryEndpoints, /// What do do when we connect to the servers. /// Note that this closure is executed each time we connect to a telemetry endpoint. - pub on_connect: Box, + pub on_connect: Box, } /// Telemetry service guard. pub type Telemetry = slog_scope::GlobalLoggerGuard; /// Size of the channel for passing messages to telemetry thread. -const CHANNEL_SIZE: usize = 262144; +const CHANNEL_SIZE: usize = 262_144; /// Log levels. pub const SUBSTRATE_DEBUG: &str = "9"; @@ -154,7 +154,7 @@ pub fn init_telemetry(config: TelemetryConfig) -> slog_scope::GlobalLoggerGuard }); }); - return logger_guard; + logger_guard } /// Translates to `slog_scope::info`, but contains an additional verbosity @@ -172,7 +172,7 @@ macro_rules! telemetry { struct Connection { out: ws::Sender, out_sync: Arc>>, - on_connect: Arc>, + on_connect: Arc>, url: String, } @@ -180,7 +180,7 @@ impl Connection { fn new( out: ws::Sender, out_sync: Arc>>, - on_connect: Arc>, + on_connect: Arc>, url: String ) -> Self { Connection { diff --git a/core/transaction-pool/graph/src/error.rs b/core/transaction-pool/graph/src/error.rs index acf3fa4514..07e0324354 100644 --- a/core/transaction-pool/graph/src/error.rs +++ b/core/transaction-pool/graph/src/error.rs @@ -35,7 +35,7 @@ pub enum Error { TemporarilyBanned, /// The transaction is already in the pool. #[display(fmt="[{:?}] Already imported", _0)] - AlreadyImported(Box), + 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 { diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index 1322038d78..6298f10bf4 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -43,9 +43,9 @@ pub type TrieError = trie_db::TrieError; pub trait AsHashDB: hash_db::AsHashDB {} impl> AsHashDB for T {} /// As in `hash_db`, but less generic, trait exposed. -pub type HashDB<'a, H> = hash_db::HashDB + 'a; +pub type HashDB<'a, H> = dyn hash_db::HashDB + 'a; /// As in `hash_db`, but less generic, trait exposed. -pub type PlainDB<'a, K> = hash_db::PlainDB + 'a; +pub type PlainDB<'a, K> = dyn hash_db::PlainDB + 'a; /// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. pub type PrefixedMemoryDB = memory_db::MemoryDB, trie_db::DBValue>; /// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. @@ -471,7 +471,7 @@ mod tests { } fn populate_trie<'db>( - db: &'db mut HashDB, + db: &'db mut dyn HashDB, root: &'db mut ::Out, v: &[(Vec, Vec)] ) -> TrieDBMut<'db, Blake2Hasher> { diff --git a/core/trie/src/node_header.rs b/core/trie/src/node_header.rs index 4f7617c068..2c01189f8a 100644 --- a/core/trie/src/node_header.rs +++ b/core/trie/src/node_header.rs @@ -60,12 +60,12 @@ impl Decode for NodeHeader { Some(match input.read_byte()? { EMPTY_TRIE => NodeHeader::Null, // 0 - i @ LEAF_NODE_OFFSET ... LEAF_NODE_SMALL_MAX => // 1 ... (127 - 1) + i @ LEAF_NODE_OFFSET ..= LEAF_NODE_SMALL_MAX => // 1 ... (127 - 1) NodeHeader::Leaf((i - LEAF_NODE_OFFSET) as usize), LEAF_NODE_BIG => // 127 NodeHeader::Leaf(input.read_byte()? as usize + LEAF_NODE_THRESHOLD as usize), - i @ EXTENSION_NODE_OFFSET ... EXTENSION_NODE_SMALL_MAX =>// 128 ... (253 - 1) + i @ EXTENSION_NODE_OFFSET ..= EXTENSION_NODE_SMALL_MAX =>// 128 ... (253 - 1) NodeHeader::Extension((i - EXTENSION_NODE_OFFSET) as usize), EXTENSION_NODE_BIG => // 253 NodeHeader::Extension(input.read_byte()? as usize + EXTENSION_NODE_THRESHOLD as usize), diff --git a/core/trie/src/trie_stream.rs b/core/trie/src/trie_stream.rs index 123ab1ea16..913cff2c5a 100644 --- a/core/trie/src/trie_stream.rs +++ b/core/trie/src/trie_stream.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -//! `TrieStream` implementation for Substrate's trie format. +//! `TrieStream` implementation for Substrate's trie format. use rstd::iter::once; use hash_db::Hasher; @@ -83,7 +83,7 @@ impl trie_root::TrieStream for TrieStream { fn append_substream(&mut self, other: Self) { let data = other.out(); match data.len() { - 0...31 => { + 0..=31 => { data.encode_to(&mut self.buffer) }, _ => { diff --git a/core/util/fork-tree/src/lib.rs b/core/util/fork-tree/src/lib.rs index cba5a1535b..4b6745a354 100644 --- a/core/util/fork-tree/src/lib.rs +++ b/core/util/fork-tree/src/lib.rs @@ -52,7 +52,7 @@ impl std::error::Error for Error { } } - fn cause(&self) -> Option<&std::error::Error> { + fn cause(&self) -> Option<&dyn std::error::Error> { None } } diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index bc46e98ec2..597618c142 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -150,7 +150,6 @@ impl ProvideInherentData for InherentDataProvider { } fn error_to_string(&self, error: &[u8]) -> Option { - use parity_codec::Decode; RuntimeString::decode(&mut &error[..]).map(Into::into) } } diff --git a/srml/contract/src/exec.rs b/srml/contract/src/exec.rs index 1ab59fa0c2..7a16c9d60d 100644 --- a/srml/contract/src/exec.rs +++ b/srml/contract/src/exec.rs @@ -703,7 +703,7 @@ mod tests { } #[derive(Clone)] - struct MockExecutable<'a>(Rc VmExecResult + 'a>); + struct MockExecutable<'a>(Rc VmExecResult + 'a>); impl<'a> MockExecutable<'a> { fn new(f: impl Fn(MockCtx) -> VmExecResult + 'a) -> Self { diff --git a/srml/contract/src/tests.rs b/srml/contract/src/tests.rs index 29fc1d3a6d..7a19fdb1d6 100644 --- a/srml/contract/src/tests.rs +++ b/srml/contract/src/tests.rs @@ -300,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!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key1).is_none()); - assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key2).is_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!( - >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key1), + >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key1), Some(b"3".to_vec()) ); assert_eq!( - >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key2), + >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key2), Some(b"4".to_vec()) ); } diff --git a/srml/indices/src/address.rs b/srml/indices/src/address.rs index 123b8bca89..c76585d216 100644 --- a/srml/indices/src/address.rs +++ b/srml/indices/src/address.rs @@ -64,7 +64,7 @@ impl Decode for Address where { fn decode(input: &mut I) -> Option { Some(match input.read_byte()? { - x @ 0x00...0xef => Address::Index(AccountIndex::from(x as u32)), + x @ 0x00..=0xef => Address::Index(AccountIndex::from(x as u32)), 0xfc => Address::Index(AccountIndex::from( need_more_than(0xef, u16::decode(input)?)? as u32 )), diff --git a/subkey/src/vanity.rs b/subkey/src/vanity.rs index 400b3bae82..2399197e99 100644 --- a/subkey/src/vanity.rs +++ b/subkey/src/vanity.rs @@ -19,9 +19,9 @@ use super::Crypto; fn good_waypoint(done: u64) -> u64 { match done { - 0 ... 1_000_000 => 100_000, - 0 ... 10_000_000 => 1_000_000, - 0 ... 100_000_000 => 10_000_000, + 0 ..= 1_000_000 => 100_000, + 0 ..= 10_000_000 => 1_000_000, + 0 ..= 100_000_000 => 10_000_000, _ => 100_000_000, } } -- GitLab From 9a8e8b7d8064a7b48025184939edacd805b07a04 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 4 Jun 2019 20:11:18 +0200 Subject: [PATCH 073/140] Update to libp2p 0.9 (#2783) * Update to libp2p 0.9 * Fix browser-WASM --- Cargo.lock | 446 +++++++++++++++++---------- core/consensus/common/Cargo.toml | 2 +- core/network-libp2p/Cargo.toml | 2 +- core/network-libp2p/src/behaviour.rs | 12 +- core/network-libp2p/src/transport.rs | 8 +- core/peerset/Cargo.toml | 2 +- 6 files changed, 306 insertions(+), 166 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a1b630d428..da3ae1f4dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aes-ctr" version = "0.3.0" @@ -142,11 +147,6 @@ dependencies = [ "libc 0.2.55 (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" @@ -278,6 +278,11 @@ dependencies = [ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" version = "2.4.3" @@ -432,6 +437,22 @@ name = "core-foundation-sys" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "criterion" version = "0.2.11" @@ -703,11 +724,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" @@ -845,6 +861,19 @@ dependencies = [ "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "flate2" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 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)", +] + [[package]] name = "fnv" version = "1.0.6" @@ -1246,6 +1275,11 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itertools" version = "0.8.0" @@ -1457,33 +1491,34 @@ dependencies = [ [[package]] name = "libp2p" -version = "0.8.1" +version = "0.9.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.27 (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.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.1 (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.1 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1493,7 +1528,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.8.1" +version = "0.9.0" 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)", @@ -1507,9 +1542,9 @@ dependencies = [ "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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -1528,20 +1563,31 @@ dependencies = [ [[package]] name = "libp2p-core-derive" -version = "0.8.0" +version = "0.9.0" 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.34 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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-dns" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1549,7 +1595,7 @@ dependencies = [ [[package]] name = "libp2p-floodsub" -version = "0.8.0" +version = "0.9.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)", @@ -1557,7 +1603,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.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -1568,16 +1614,16 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -1589,7 +1635,7 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.8.0" +version = "0.9.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)", @@ -1599,13 +1645,14 @@ 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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", "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)", @@ -1616,16 +1663,16 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.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)", - "parity-multiaddr 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", @@ -1637,15 +1684,15 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.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)", + "parking_lot 0.8.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-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)", @@ -1653,14 +1700,14 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.6.0" +version = "0.7.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.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1668,21 +1715,21 @@ dependencies = [ "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)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 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)", "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)", @@ -1692,23 +1739,23 @@ dependencies = [ [[package]] name = "libp2p-plaintext" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (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.8.0" +version = "0.9.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.27 (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 0.9.0 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1716,7 +1763,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.8.1" +version = "0.9.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)", @@ -1727,7 +1774,7 @@ dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1745,13 +1792,14 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.8.0" +version = "0.9.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.27 (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)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1760,23 +1808,23 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.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.45 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1785,27 +1833,29 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.0-alpha.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.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", - "websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-yamux" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (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.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1941,6 +1991,34 @@ dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" version = "0.6.19" @@ -2389,7 +2467,7 @@ dependencies = [ [[package]] name = "parity-multiaddr" -version = "0.4.1" +version = "0.5.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)", @@ -2398,6 +2476,7 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2939,6 +3018,19 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 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)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" version = "0.1.2" @@ -3011,6 +3103,15 @@ name = "scopeguard" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "sct" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "security-framework" version = "0.3.1" @@ -3213,6 +3314,24 @@ dependencies = [ "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "soketto" +version = "0.1.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (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.27 (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)", + "log 0.4.6 (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)", + "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)", +] + [[package]] name = "sourcefile" version = "0.1.4" @@ -3725,51 +3844,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.17" -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.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.45 (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.30 (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.91 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -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.30 (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.91 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.91 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -4075,7 +4149,7 @@ dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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.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)", @@ -4268,7 +4342,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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)", @@ -4327,7 +4401,7 @@ name = "substrate-peerset" version = "2.0.0" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.0 (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)", @@ -4890,6 +4964,19 @@ dependencies = [ "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-sync" version = "0.1.5" @@ -5092,7 +5179,7 @@ name = "twox-hash" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5385,6 +5472,24 @@ dependencies = [ "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "websocket" version = "0.22.4" @@ -5564,6 +5669,14 @@ dependencies = [ "zeroize_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "zeroize_derive" version = "0.1.0" @@ -5574,7 +5687,19 @@ dependencies = [ "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "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" @@ -5591,7 +5716,6 @@ dependencies = [ "checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" "checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "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" @@ -5607,6 +5731,7 @@ dependencies = [ "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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "59604ece62a407dc9164732e5adea02467898954c3a5811fd2dc140af14ef15b" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "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" @@ -5627,6 +5752,8 @@ dependencies = [ "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" "checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" "checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "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" @@ -5655,7 +5782,6 @@ dependencies = [ "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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" @@ -5671,6 +5797,7 @@ dependencies = [ "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" "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 flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "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" @@ -5717,6 +5844,7 @@ dependencies = [ "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +"checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" "checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" @@ -5739,25 +5867,26 @@ dependencies = [ "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" -"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ea5c0636053e01575d6269b6112f9239e9d35ca861e3e5c7d6970a07f9e1682a" -"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "318d727d5e8e0fe3bb70aacbf99bde57334eae9559deff447edd993422dc0f03" -"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 libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f91d477f61c3451da12de273cbf281a1828eea686248999412e6e6fb23dcbc60" +"checksum libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "805f65e99f0c4cc4d6234263325f288fb231468b128dd66e469d4851141f3a26" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a837bca8813fec5bd7dcb849d2f5f673ddca36e079ac485edfb8fa221a9d752" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "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.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" @@ -5774,6 +5903,9 @@ dependencies = [ "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 miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "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" @@ -5802,7 +5934,7 @@ dependencies = [ "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "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.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b574ca9f0c0235c04de4c5110542959f64c9b8882f638b70f6c6be52c75bdc46" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" "checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" @@ -5863,6 +5995,7 @@ dependencies = [ "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_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" "checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" "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" @@ -5872,6 +6005,7 @@ dependencies = [ "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 scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "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" @@ -5894,15 +6028,12 @@ dependencies = [ "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 soketto 0.1.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8baac924db1b5f020050d7c8f8475c09d5ff11676101500fd0d3fdd184e67e" "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.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.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" @@ -5938,6 +6069,7 @@ dependencies = [ "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-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" "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" @@ -5991,6 +6123,8 @@ dependencies = [ "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.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" "checksum websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0adcd2a64c5746c9702b354a1b992802b0c363df1dfa324a74cb7aebe10e0cbf" "checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" @@ -6010,4 +6144,6 @@ dependencies = [ "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" "checksum zeroize 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e68403b858b6af538b11614e62dfe9ab2facba9f13a0cafb974855cfb495ec95" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" "checksum zeroize_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3f07490820219949839d0027b965ffdd659d75be9220c00798762e36c6cd281" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index a64ae120f4..c2fc7cf231 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] derive_more = "0.14.0" crossbeam-channel = "0.3.4" -libp2p = { version = "0.8.1", default-features = false } +libp2p = { version = "0.9.0", default-features = false } log = "0.4" primitives = { package = "substrate-primitives", path= "../../primitives" } inherents = { package = "substrate-inherents", path = "../../inherents" } diff --git a/core/network-libp2p/Cargo.toml b/core/network-libp2p/Cargo.toml index a2ea8660a2..e92738b902 100644 --- a/core/network-libp2p/Cargo.toml +++ b/core/network-libp2p/Cargo.toml @@ -12,7 +12,7 @@ byteorder = "1.3" bytes = "0.4" fnv = "1.0" futures = "0.1" -libp2p = { version = "0.8.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } +libp2p = { version = "0.9.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } parking_lot = "0.7.1" lazy_static = "1.2" log = "0.4" diff --git a/core/network-libp2p/src/behaviour.rs b/core/network-libp2p/src/behaviour.rs index a180a34064..379983a3fb 100644 --- a/core/network-libp2p/src/behaviour.rs +++ b/core/network-libp2p/src/behaviour.rs @@ -67,7 +67,7 @@ impl Behaviour Behaviour impl Iterator { + pub fn known_peers(&mut self) -> impl Iterator { self.discovery.kademlia.kbuckets_entries() } @@ -165,7 +165,7 @@ impl NetworkBehaviourEventProcess NetworkBehaviourEventProcess () + // We never start any other type of query. + KademliaOut::GetProvidersResult { .. } => {} + KademliaOut::GetValueResult(_) => {} + KademliaOut::PutValueResult(_) => {} } } } diff --git a/core/network-libp2p/src/transport.rs b/core/network-libp2p/src/transport.rs index f2860c7856..e1843476d9 100644 --- a/core/network-libp2p/src/transport.rs +++ b/core/network-libp2p/src/transport.rs @@ -17,10 +17,10 @@ use futures::prelude::*; use libp2p::{ InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, - mplex, identity, secio, yamux, websocket, bandwidth, wasm_ext + mplex, identity, secio, yamux, bandwidth, wasm_ext }; #[cfg(not(target_os = "unknown"))] -use libp2p::{tcp, dns}; +use libp2p::{tcp, dns, websocket}; use libp2p::core::{self, transport::boxed::Boxed, transport::OptionalTransport, muxing::StreamMuxerBox}; use std::{io, sync::Arc, time::Duration, usize}; @@ -68,7 +68,9 @@ pub fn build_transport( .map(|(id, muxer)| (id, core::muxing::StreamMuxerBox::new(muxer))) }) .with_timeout(Duration::from_secs(20)) - .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) + // TODO: pass the error directly, instead of calling `to_string()` + // https://github.com/libp2p/rust-libp2p/issues/1162 + .map_err(|err| io::Error::new(io::ErrorKind::Other, err.to_string())) .boxed(); (transport, sinks) diff --git a/core/peerset/Cargo.toml b/core/peerset/Cargo.toml index d878485203..aa08c8ca99 100644 --- a/core/peerset/Cargo.toml +++ b/core/peerset/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" [dependencies] futures = "0.1" -libp2p = { version = "0.8.1", default-features = false } +libp2p = { version = "0.9.0", default-features = false } linked-hash-map = "0.5" log = "0.4" lru-cache = "0.1.2" -- GitLab From 94236e5d98516c365533ad608c36062eab51d936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 4 Jun 2019 22:28:18 +0200 Subject: [PATCH 074/140] Remove deprecated authorities function (#2785) * Remove deprecated authorities function * Bump spec * Fixes compilation * Remove last piece --- core/client/src/runtime_api.rs | 3 - core/consensus/aura/src/lib.rs | 15 +- core/finality-grandpa/src/tests.rs | 9 - core/sr-api-macros/src/lib.rs | 1 - core/sr-api-macros/tests/decl_and_impl.rs | 5 +- core/test-runtime/src/lib.rs | 8 - core/test-runtime/wasm/Cargo.lock | 328 ++++++++++++++++------ node-template/runtime/src/lib.rs | 4 - node-template/runtime/wasm/Cargo.lock | 328 ++++++++++++++++------ node/runtime/src/lib.rs | 8 +- node/runtime/wasm/Cargo.lock | 328 ++++++++++++++++------ 11 files changed, 741 insertions(+), 296 deletions(-) diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index 987138e69a..e456c166dc 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -171,9 +171,6 @@ decl_runtime_apis! { #[skip_initialize_block] #[initialize_block] fn initialize_block(header: &::Header); - /// Returns the authorities. - #[deprecated(since = "1.0", note = "Please switch to `AuthoritiesApi`.")] - fn authorities() -> Vec>; } /// The `Metadata` api trait that returns metadata for the runtime. diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index f0d982c36e..901d8b6f35 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -678,15 +678,12 @@ fn authorities(client: &C, at: &BlockId) -> Result>(at).unwrap_or(false) { - AuthoritiesApi::authorities(&*client.runtime_api(), at).ok() - } else { - CoreApi::authorities(&*client.runtime_api(), at).ok() - } - }).ok_or_else(|| consensus_common::Error::InvalidAuthoritiesSet.into()) + .and_then(|cache| cache + .get_at(&well_known_cache_keys::AUTHORITIES, at) + .and_then(|v| Decode::decode(&mut &v[..])) + ) + .or_else(|| AuthoritiesApi::authorities(&*client.runtime_api(), at).ok()) + .ok_or_else(|| consensus_common::Error::InvalidAuthoritiesSet.into()) } /// The Aura import queue type. diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 51028fad84..7fc2509f41 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -342,15 +342,6 @@ impl Core for RuntimeApi { ) -> Result> { unimplemented!("Not required for testing!") } - fn Core_authorities_runtime_api_impl( - &self, - _: &BlockId, - _: ExecutionContext, - _: Option<()>, - _: Vec, - ) -> Result>> { - unimplemented!("Not required for testing!") - } } impl ApiExt for RuntimeApi { diff --git a/core/sr-api-macros/src/lib.rs b/core/sr-api-macros/src/lib.rs index 7399da0794..1a315f44dd 100644 --- a/core/sr-api-macros/src/lib.rs +++ b/core/sr-api-macros/src/lib.rs @@ -84,7 +84,6 @@ mod utils; /// # } /// # fn execute_block(_block: Block) {} /// # fn initialize_block(_header: &Header) {} -/// # fn authorities() -> Vec> { unimplemented!() } /// # } /// /// impl self::Balance for Runtime { diff --git a/core/sr-api-macros/tests/decl_and_impl.rs b/core/sr-api-macros/tests/decl_and_impl.rs index 44db8021d4..ba7ef23b99 100644 --- a/core/sr-api-macros/tests/decl_and_impl.rs +++ b/core/sr-api-macros/tests/decl_and_impl.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use runtime_primitives::traits::{GetNodeBlockType, Block as BlockT, AuthorityIdFor}; +use runtime_primitives::traits::{GetNodeBlockType, Block as BlockT}; use runtime_primitives::generic::BlockId; use client::runtime_api::{self, RuntimeApiInfo}; use client::{error::Result, decl_runtime_apis, impl_runtime_apis}; @@ -74,9 +74,6 @@ impl_runtime_apis! { fn initialize_block(_: &::Header) { unimplemented!() } - fn authorities() -> Vec> { - unimplemented!() - } } } diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index e582fd4dc7..2e8981c524 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -352,10 +352,6 @@ cfg_if! { fn initialize_block(header: &::Header) { system::initialize_block(header) } - - fn authorities() -> Vec { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl client_api::Metadata for Runtime { @@ -500,10 +496,6 @@ cfg_if! { fn initialize_block(header: &::Header) { system::initialize_block(header) } - - fn authorities() -> Vec { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl client_api::Metadata for Runtime { diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index 2f05852a50..8763845ab7 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -1,5 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aes-ctr" version = "0.3.0" @@ -203,6 +208,11 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" version = "2.4.3" @@ -283,6 +293,22 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam" version = "0.6.0" @@ -573,6 +599,19 @@ dependencies = [ "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "flate2" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 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)", +] + [[package]] name = "fnv" version = "1.0.6" @@ -822,6 +861,11 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itoa" version = "0.4.4" @@ -875,32 +919,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.8.1" +version = "0.9.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.27 (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.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.1 (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.1 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -910,7 +955,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.8.1" +version = "0.9.0" 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)", @@ -924,9 +969,9 @@ dependencies = [ "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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -945,20 +990,31 @@ dependencies = [ [[package]] name = "libp2p-core-derive" -version = "0.8.0" +version = "0.9.0" 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.34 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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-dns" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -966,7 +1022,7 @@ dependencies = [ [[package]] name = "libp2p-floodsub" -version = "0.8.0" +version = "0.9.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)", @@ -974,7 +1030,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.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -985,16 +1041,16 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -1006,7 +1062,7 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.8.0" +version = "0.9.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)", @@ -1016,13 +1072,14 @@ 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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", "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)", @@ -1033,16 +1090,16 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.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)", - "parity-multiaddr 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", @@ -1054,15 +1111,15 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.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)", + "parking_lot 0.8.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-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)", @@ -1070,14 +1127,14 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.6.0" +version = "0.7.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.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1085,21 +1142,21 @@ dependencies = [ "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)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 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)", "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)", @@ -1109,23 +1166,23 @@ dependencies = [ [[package]] name = "libp2p-plaintext" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (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.8.0" +version = "0.9.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.27 (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 0.9.0 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1133,7 +1190,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.8.1" +version = "0.9.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)", @@ -1144,7 +1201,7 @@ dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1162,13 +1219,14 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.8.0" +version = "0.9.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.27 (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)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1177,23 +1235,23 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.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.45 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1202,11 +1260,11 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (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.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1234,6 +1292,14 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.4.6" @@ -1283,6 +1349,34 @@ dependencies = [ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" version = "0.6.19" @@ -1487,7 +1581,7 @@ dependencies = [ [[package]] name = "parity-multiaddr" -version = "0.4.1" +version = "0.5.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)", @@ -1496,6 +1590,7 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1554,6 +1649,16 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" @@ -1589,6 +1694,21 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.54 (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.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.5" @@ -1969,6 +2089,11 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "scopeguard" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "semver" version = "0.9.0" @@ -2403,7 +2528,7 @@ dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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.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)", @@ -3266,7 +3391,27 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "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" @@ -3291,6 +3436,7 @@ 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.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 build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "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" @@ -3304,6 +3450,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "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" @@ -3336,6 +3484,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "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" @@ -3369,6 +3518,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "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 ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" "checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" @@ -3377,26 +3527,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" -"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ea5c0636053e01575d6269b6112f9239e9d35ca861e3e5c7d6970a07f9e1682a" -"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "318d727d5e8e0fe3bb70aacbf99bde57334eae9559deff447edd993422dc0f03" -"checksum libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5369165359bea84e7ebe73f37b6240f31f8d924ce6710be3d8e1fa678985c9b8" +"checksum libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f91d477f61c3451da12de273cbf281a1828eea686248999412e6e6fb23dcbc60" +"checksum libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "805f65e99f0c4cc4d6234263325f288fb231468b128dd66e469d4851141f3a26" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "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 lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" @@ -3404,6 +3556,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "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" @@ -3426,16 +3581,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "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.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b574ca9f0c0235c04de4c5110542959f64c9b8882f638b70f6c6be52c75bdc46" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" "checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "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" "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 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "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 parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" "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" @@ -3480,6 +3637,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "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 scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" "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" @@ -3577,3 +3735,5 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" "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" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 19f5f36862..6193fd8e71 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -240,10 +240,6 @@ impl_runtime_apis! { fn initialize_block(header: &::Header) { Executive::initialize_block(header) } - - fn authorities() -> Vec { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl runtime_api::Metadata for Runtime { diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index 2473762307..2dc001522c 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -1,5 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aes-ctr" version = "0.3.0" @@ -203,6 +208,11 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" version = "2.4.3" @@ -283,6 +293,22 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam" version = "0.6.0" @@ -573,6 +599,19 @@ dependencies = [ "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "flate2" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 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)", +] + [[package]] name = "fnv" version = "1.0.6" @@ -822,6 +861,11 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itoa" version = "0.4.4" @@ -875,32 +919,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.8.1" +version = "0.9.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.27 (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.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.1 (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.1 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -910,7 +955,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.8.1" +version = "0.9.0" 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)", @@ -924,9 +969,9 @@ dependencies = [ "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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -945,20 +990,31 @@ dependencies = [ [[package]] name = "libp2p-core-derive" -version = "0.8.0" +version = "0.9.0" 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.34 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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-dns" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -966,7 +1022,7 @@ dependencies = [ [[package]] name = "libp2p-floodsub" -version = "0.8.0" +version = "0.9.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)", @@ -974,7 +1030,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.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -985,16 +1041,16 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -1006,7 +1062,7 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.8.0" +version = "0.9.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)", @@ -1016,13 +1072,14 @@ 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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", "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)", @@ -1033,16 +1090,16 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.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)", - "parity-multiaddr 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", @@ -1054,15 +1111,15 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.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)", + "parking_lot 0.8.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-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)", @@ -1070,14 +1127,14 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.6.0" +version = "0.7.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.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1085,21 +1142,21 @@ dependencies = [ "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)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 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)", "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)", @@ -1109,23 +1166,23 @@ dependencies = [ [[package]] name = "libp2p-plaintext" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (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.8.0" +version = "0.9.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.27 (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 0.9.0 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1133,7 +1190,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.8.1" +version = "0.9.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)", @@ -1144,7 +1201,7 @@ dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1162,13 +1219,14 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.8.0" +version = "0.9.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.27 (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)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1177,23 +1235,23 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.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.45 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1202,11 +1260,11 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (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.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1234,6 +1292,14 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.4.6" @@ -1283,6 +1349,34 @@ dependencies = [ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" version = "0.6.19" @@ -1521,7 +1615,7 @@ dependencies = [ [[package]] name = "parity-multiaddr" -version = "0.4.1" +version = "0.5.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)", @@ -1530,6 +1624,7 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1588,6 +1683,16 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" @@ -1623,6 +1728,21 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.54 (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.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.5" @@ -2003,6 +2123,11 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "scopeguard" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "semver" version = "0.9.0" @@ -2546,7 +2671,7 @@ dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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.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)", @@ -3359,7 +3484,27 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "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" @@ -3384,6 +3529,7 @@ 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.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 build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "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" @@ -3397,6 +3543,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "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" @@ -3429,6 +3577,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "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" @@ -3462,6 +3611,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "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 ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" "checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" @@ -3470,26 +3620,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" -"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ea5c0636053e01575d6269b6112f9239e9d35ca861e3e5c7d6970a07f9e1682a" -"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "318d727d5e8e0fe3bb70aacbf99bde57334eae9559deff447edd993422dc0f03" -"checksum libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5369165359bea84e7ebe73f37b6240f31f8d924ce6710be3d8e1fa678985c9b8" +"checksum libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f91d477f61c3451da12de273cbf281a1828eea686248999412e6e6fb23dcbc60" +"checksum libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "805f65e99f0c4cc4d6234263325f288fb231468b128dd66e469d4851141f3a26" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "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 lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" @@ -3497,6 +3649,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "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" @@ -3519,16 +3674,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "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.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b574ca9f0c0235c04de4c5110542959f64c9b8882f638b70f6c6be52c75bdc46" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" "checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "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" "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 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "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 parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" "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" @@ -3573,6 +3730,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "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 scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" "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" @@ -3670,3 +3828,5 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" "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" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index bad1fb9def..5daeccf72c 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,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: 91, - impl_version: 93, + spec_version: 92, + impl_version: 92, apis: RUNTIME_API_VERSIONS, }; @@ -277,10 +277,6 @@ impl_runtime_apis! { fn initialize_block(header: &::Header) { Executive::initialize_block(header) } - - fn authorities() -> Vec> { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl client_api::Metadata for Runtime { diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index 58b59ba4fc..8ec68521c2 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -1,5 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aes-ctr" version = "0.3.0" @@ -203,6 +208,11 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" version = "2.4.3" @@ -283,6 +293,22 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam" version = "0.6.0" @@ -573,6 +599,19 @@ dependencies = [ "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "flate2" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 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)", +] + [[package]] name = "fnv" version = "1.0.6" @@ -822,6 +861,11 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itoa" version = "0.4.4" @@ -875,32 +919,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.8.1" +version = "0.9.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.27 (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.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.1 (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.1 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -910,7 +955,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.8.1" +version = "0.9.0" 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)", @@ -924,9 +969,9 @@ dependencies = [ "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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -945,20 +990,31 @@ dependencies = [ [[package]] name = "libp2p-core-derive" -version = "0.8.0" +version = "0.9.0" 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.34 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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-dns" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -966,7 +1022,7 @@ dependencies = [ [[package]] name = "libp2p-floodsub" -version = "0.8.0" +version = "0.9.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)", @@ -974,7 +1030,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.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -985,16 +1041,16 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -1006,7 +1062,7 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.8.0" +version = "0.9.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)", @@ -1016,13 +1072,14 @@ 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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", "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)", @@ -1033,16 +1090,16 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.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)", - "parity-multiaddr 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.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)", @@ -1054,15 +1111,15 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.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)", + "parking_lot 0.8.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-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)", @@ -1070,14 +1127,14 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.6.0" +version = "0.7.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.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1085,21 +1142,21 @@ dependencies = [ "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)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.8.0" +version = "0.9.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.27 (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 0.9.0 (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.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 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)", "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)", @@ -1109,23 +1166,23 @@ dependencies = [ [[package]] name = "libp2p-plaintext" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (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.8.0" +version = "0.9.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.27 (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 0.9.0 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1133,7 +1190,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.8.1" +version = "0.9.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)", @@ -1144,7 +1201,7 @@ dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1162,13 +1219,14 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.8.0" +version = "0.9.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.27 (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)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1177,23 +1235,23 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.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.45 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1202,11 +1260,11 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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 0.9.0 (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.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1234,6 +1292,14 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.4.6" @@ -1283,6 +1349,34 @@ dependencies = [ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" version = "0.6.19" @@ -1543,7 +1637,7 @@ dependencies = [ [[package]] name = "parity-multiaddr" -version = "0.4.1" +version = "0.5.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)", @@ -1552,6 +1646,7 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1610,6 +1705,16 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" @@ -1645,6 +1750,21 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (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.54 (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.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.5" @@ -2035,6 +2155,11 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "scopeguard" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "semver" version = "0.9.0" @@ -2681,7 +2806,7 @@ dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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.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)", @@ -3506,7 +3631,27 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "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" @@ -3531,6 +3676,7 @@ 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.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 build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "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" @@ -3544,6 +3690,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "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" @@ -3576,6 +3724,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "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" @@ -3609,6 +3758,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "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 ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" "checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" @@ -3617,26 +3767,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" -"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ea5c0636053e01575d6269b6112f9239e9d35ca861e3e5c7d6970a07f9e1682a" -"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "318d727d5e8e0fe3bb70aacbf99bde57334eae9559deff447edd993422dc0f03" -"checksum libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5369165359bea84e7ebe73f37b6240f31f8d924ce6710be3d8e1fa678985c9b8" +"checksum libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f91d477f61c3451da12de273cbf281a1828eea686248999412e6e6fb23dcbc60" +"checksum libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "805f65e99f0c4cc4d6234263325f288fb231468b128dd66e469d4851141f3a26" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "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 lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" @@ -3644,6 +3796,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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 miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "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" @@ -3666,16 +3821,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "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.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b574ca9f0c0235c04de4c5110542959f64c9b8882f638b70f6c6be52c75bdc46" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" "checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "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" "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 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "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 parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" "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" @@ -3721,6 +3878,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "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 scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" "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" @@ -3818,3 +3976,5 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" "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" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" -- GitLab From 3ec6f452dd00ed3dc2a92ef21de59e4c6e1505ce Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 5 Jun 2019 09:15:54 +0200 Subject: [PATCH 075/140] Minor sync refactoring (#2767) * Make maintain_sync private * Remove sync::Context::peer_info * Print errors if sync state mismatch * Line width --- core/network/src/protocol.rs | 18 +-- core/network/src/sync.rs | 294 +++++++++++++++++++---------------- 2 files changed, 166 insertions(+), 146 deletions(-) diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 569f1df030..2281b9da7f 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -119,7 +119,7 @@ pub struct ProtocolStatus { } /// Peer information -#[derive(Debug)] +#[derive(Debug, Clone)] struct Peer { info: PeerInfo, /// Current block request, if any. @@ -342,10 +342,6 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> SyncContext for ProtocolContext<'a, self.network_out.disconnect_peer(who) } - fn peer_info(&self, who: &PeerId) -> Option> { - self.context_data.peers.get(who).map(|p| p.info.clone()) - } - fn client(&self) -> &dyn Client { &*self.context_data.chain } @@ -906,9 +902,10 @@ impl, H: ExHashT> Protocol { status.version }; + let info = self.context_data.peers.get(&who).expect("We just inserted above; QED").info.clone(); 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.sync.new_peer(&mut context, who.clone(), info); if protocol_version > 2 { self.consensus_gossip.new_peer(&mut context, who.clone(), status.roles); } @@ -1188,16 +1185,15 @@ impl, H: ExHashT> Protocol { 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); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.blocks_processed(&mut context, processed_blocks, has_error); } /// Restart the sync process. pub fn restart(&mut self, network_out: &mut dyn NetworkOut) { + let peers = self.context_data.peers.clone(); let mut context = ProtocolContext::new(&mut self.context_data, network_out); - self.sync.restart(&mut context); + self.sync.restart(&mut context, |peer_id| peers.get(peer_id).map(|i| i.info.clone())); } /// Notify about successful import of the given block. diff --git a/core/network/src/sync.rs b/core/network/src/sync.rs index 9b327c1a20..62cb0ce14d 100644 --- a/core/network/src/sync.rs +++ b/core/network/src/sync.rs @@ -33,7 +33,7 @@ use std::cmp::max; use std::ops::Range; use std::collections::{HashMap, VecDeque}; -use log::{debug, trace, warn, info}; +use log::{debug, trace, warn, info, error}; use crate::protocol::PeerInfo as ProtocolPeerInfo; use network_libp2p::PeerId; use client::{BlockStatus, ClientInfo}; @@ -81,9 +81,6 @@ pub trait Context { /// 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); @@ -237,82 +234,90 @@ impl ChainSync { } /// Handle new connected peer. Call this method whenever we connect to a new peer. - pub(crate) fn new_peer(&mut self, protocol: &mut dyn Context, who: PeerId) { - 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; - } + pub(crate) fn new_peer( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + info: ProtocolPeerInfo + ) { + // 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); - protocol.report_peer(who.clone(), BLOCKCHAIN_STATUS_READ_ERROR_REPUTATION_CHANGE); - protocol.disconnect_peer(who); - }, - (Ok(BlockStatus::KnownBad), _) => { - 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.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. - debug!(target:"sync", "New peer with unknown best hash {} ({}), assuming common block.", self.best_queued_hash, self.best_queued_number); - self.peers.insert(who, PeerSync { - common_number: self.best_queued_number, + 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); + protocol.report_peer(who.clone(), BLOCKCHAIN_STATUS_READ_ERROR_REPUTATION_CHANGE); + protocol.disconnect_peer(who); + }, + (Ok(BlockStatus::KnownBad), _) => { + 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.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. + debug!( + target:"sync", + "New peer with unknown best hash {} ({}), assuming common block.", + self.best_queued_hash, + self.best_queued_number + ); + self.peers.insert(who, PeerSync { + common_number: self.best_queued_number, + best_hash: info.best_hash, + best_number: info.best_number, + state: PeerSyncState::Available, + recently_announced: Default::default(), + }); + } + (Ok(BlockStatus::Unknown), _) => { + let our_best = self.best_queued_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: Zero::zero(), best_hash: info.best_hash, best_number: info.best_number, state: PeerSyncState::Available, recently_announced: Default::default(), }); - } - (Ok(BlockStatus::Unknown), _) => { - let our_best = self.best_queued_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: Zero::zero(), - best_hash: info.best_hash, - best_number: info.best_number, - state: PeerSyncState::Available, - recently_announced: Default::default(), - }); - self.download_new(protocol, who) - } else { - 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: Zero::zero(), - best_hash: info.best_hash, - best_number: info.best_number, - state: PeerSyncState::AncestorSearch(common_best, AncestorSearchState::ExponentialBackoff(One::one())), - recently_announced: Default::default(), - }); - Self::request_ancestry(protocol, who, common_best) - } - }, - (Ok(BlockStatus::Queued), _) | (Ok(BlockStatus::InChainWithState), _) | (Ok(BlockStatus::InChainPruned), _) => { - debug!(target:"sync", "New peer with known best hash {} ({}).", info.best_hash, info.best_number); + self.download_new(protocol, who) + } else { + 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: info.best_number, + 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::request_ancestry(protocol, who, common_best) } + }, + (Ok(BlockStatus::Queued), _) | (Ok(BlockStatus::InChainWithState), _) | (Ok(BlockStatus::InChainPruned), _) => { + debug!(target:"sync", "New peer with known best hash {} ({}).", info.best_hash, info.best_number); + self.peers.insert(who.clone(), PeerSync { + common_number: info.best_number, + best_hash: info.best_hash, + best_number: info.best_number, + state: PeerSyncState::Available, + recently_announced: Default::default(), + }); } } } @@ -488,36 +493,41 @@ impl ChainSync { _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; + let peer = if let Some(peer) = self.peers.get_mut(&who) { + peer + } else { + error!(target: "sync", "Called on_block_justification_data with a bad peer ID"); + return None; + }; - // we only request one justification at a time - match response.blocks.into_iter().next() { - Some(response) => { - if hash != response.hash { - 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; - } + if let PeerSyncState::DownloadingJustification(hash) = peer.state { + peer.state = PeerSyncState::Available; - return self.extra_requests.justifications().on_response( - who, - response.justification, - ); - }, - None => { - // we might have asked the peer for a justification on a block that we thought it had - // (regardless of whether it had a justification for it or not). - trace!(target: "sync", "Peer {:?} provided empty response for justification request {:?}", - who, - hash, - ); + // we only request one justification at a time + match response.blocks.into_iter().next() { + Some(response) => { + if hash != response.hash { + 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; - }, - } + } + + return self.extra_requests.justifications().on_response( + who, + response.justification, + ); + }, + None => { + // we might have asked the peer for a justification on a block that we thought it had + // (regardless of whether it had a justification for it or not). + trace!(target: "sync", "Peer {:?} provided empty response for justification request {:?}", + who, + hash, + ); + return None; + }, } } @@ -532,28 +542,33 @@ impl ChainSync { 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, - ); + let peer = if let Some(peer) = self.peers.get_mut(&who) { + peer + } else { + error!(target: "sync", "Called on_block_finality_proof_data with a bad peer ID"); + return None; + }; - protocol.report_peer(who.clone(), i32::min_value()); - protocol.disconnect_peer(who); - return None; - } + if let PeerSyncState::DownloadingFinalityProof(hash) = peer.state { + peer.state = PeerSyncState::Available; - return self.extra_requests.finality_proofs().on_response( - who, - response.proof, + // 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); @@ -563,17 +578,18 @@ impl ChainSync { /// 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) { + pub fn blocks_processed(&mut self, protocol: &mut Context, processed_blocks: Vec, has_error: bool) { for hash in processed_blocks { self.queue_blocks.remove(&hash); } if has_error { self.best_importing_number = Zero::zero(); } + self.maintain_sync(protocol) } /// Maintain the sync process (download new blocks, fetch justifications). - pub fn maintain_sync(&mut self, protocol: &mut dyn Context) { + fn maintain_sync(&mut self, protocol: &mut dyn Context) { let peers: Vec = self.peers.keys().map(|p| p.clone()).collect(); for peer in peers { self.download_new(protocol, peer); @@ -716,26 +732,28 @@ impl ChainSync { let ancient_parent = parent_status == BlockStatus::InChainPruned; let known = self.is_known(protocol, &hash); - if let Some(ref mut peer) = self.peers.get_mut(&who) { - while peer.recently_announced.len() >= ANNOUNCE_HISTORY_SIZE { - peer.recently_announced.pop_front(); - } - peer.recently_announced.push_back(hash.clone()); - if number > peer.best_number { - // update their best block - peer.best_number = number; - peer.best_hash = hash; - } - if let PeerSyncState::AncestorSearch(_, _) = peer.state { - return false; - } - if header.parent_hash() == &self.best_queued_hash || known_parent { - peer.common_number = number - One::one(); - } else if known { - peer.common_number = number - } + let peer = if let Some(peer) = self.peers.get_mut(&who) { + peer } else { + error!(target: "sync", "Called on_block_announce with a bad peer ID"); return false; + }; + while peer.recently_announced.len() >= ANNOUNCE_HISTORY_SIZE { + peer.recently_announced.pop_front(); + } + peer.recently_announced.push_back(hash.clone()); + if number > peer.best_number { + // update their best block + peer.best_number = number; + peer.best_hash = hash; + } + if let PeerSyncState::AncestorSearch(_, _) = peer.state { + return false; + } + if header.parent_hash() == &self.best_queued_hash || known_parent { + peer.common_number = number - One::one(); + } else if known { + peer.common_number = number } // known block case @@ -825,7 +843,11 @@ impl ChainSync { } /// Restart the sync process. - pub(crate) fn restart(&mut self, protocol: &mut dyn Context) { + pub(crate) fn restart( + &mut self, + protocol: &mut dyn Context, + mut peer_info: impl FnMut(&PeerId) -> Option> + ) { self.queue_blocks.clear(); self.best_importing_number = Zero::zero(); self.blocks.clear(); @@ -835,7 +857,9 @@ impl ChainSync { debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); let ids: Vec = self.peers.drain().map(|(id, _)| id).collect(); for id in ids { - self.new_peer(protocol, id); + if let Some(info) = peer_info(&id) { + self.new_peer(protocol, id, info); + } } } -- GitLab From f7ec159adedf6198c67153c8b7fddaf83a2dbd9f Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 5 Jun 2019 10:16:14 +0300 Subject: [PATCH 076/140] Restore integration tests (#2620) * restored test_consensus * restored test_sync * run integration tests only on CI * use single test-thread for integration tests * post-merge fix * panic when integration test runs for too long * add some traces to integration logs * manual wait -> timeout * post-merge fix * post-merge fix --- .gitlab-ci.yml | 28 ++++++++ Cargo.lock | 1 + core/consensus/aura/src/lib.rs | 2 +- core/service/test/src/lib.rs | 43 ++++++++---- node/cli/Cargo.toml | 1 + node/cli/src/chain_spec.rs | 34 +++++++++- node/cli/src/service.rs | 120 +++++++++++++++++++++++++++++++++ node/primitives/src/lib.rs | 5 +- 8 files changed, 214 insertions(+), 20 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f29e1b0dc8..b82a3f1392 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -96,6 +96,34 @@ test-linux-stable: &test - time cargo test --all --release --verbose --locked - sccache -s +test-linux-stable-int: &test + stage: test + variables: + RUST_TOOLCHAIN: stable + # Enable debug assertions since we are running optimized builds for testing + # but still want to have debug assertions. + RUSTFLAGS: -Cdebug-assertions=y + TARGET: native + tags: + - linux-docker + only: + - tags + - master + - schedules + - web + - /^[0-9]+$/ + except: + variables: + - $DEPLOY_TAG + before_script: + - sccache -s + - ./scripts/build.sh + script: + - time RUST_LOG=sync=trace,consensus=trace,client=trace,state-db=trace,db=trace,forks=trace,state_db=trace,storage_cache=trace cargo test -p node-cli --release --verbose --locked -- --ignored --test-threads=1 + - sccache -s + allow_failure: true + + check-web-wasm: stage: test <<: *compiler_info diff --git a/Cargo.lock b/Cargo.lock index da3ae1f4dc..0246844271 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2152,6 +2152,7 @@ dependencies = [ "substrate-cli 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura 2.0.0", + "substrate-consensus-common 2.0.0", "substrate-finality-grandpa 2.0.0", "substrate-inherents 2.0.0", "substrate-keyring 2.0.0", diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 901d8b6f35..6f73c6ed65 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -69,9 +69,9 @@ use slots::{CheckedHeader, SlotWorker, SlotInfo, SlotCompatible, slot_now, check pub use aura_primitives::*; pub use consensus_common::{SyncOracle, ExtraVerification}; +pub use digest::CompatibleDigestItem; mod digest; -use digest::CompatibleDigestItem; type AuthorityId

=

::Public; diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index 9b73cfa14c..7a6d530030 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -24,7 +24,7 @@ use std::collections::HashMap; use log::info; use futures::{Future, Stream}; use tempdir::TempDir; -use tokio::runtime::Runtime; +use tokio::{runtime::Runtime, prelude::FutureExt}; use tokio::timer::Interval; use service::{ ServiceFactory, @@ -39,6 +39,9 @@ use network::config::{NetworkConfiguration, NodeKeyConfig, Secret, NonReservedPe use sr_primitives::generic::BlockId; use consensus::{ImportBlock, BlockImport}; +/// Maximum duration of single wait call. +const MAX_WAIT_TIME: Duration = Duration::from_secs(60 * 3); + struct TestNet { runtime: Runtime, authority_nodes: Vec<(u32, Arc, Multiaddr)>, @@ -52,14 +55,22 @@ struct TestNet { 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)) { - Err(()) - } else { - Ok(()) - } - }); - self.runtime.block_on(interval).ok(); + 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)) { + Err(()) + } else { + Ok(()) + } + }) + .timeout(MAX_WAIT_TIME); + + match self.runtime.block_on(interval) { + Ok(()) => unreachable!("interval always fails; qed"), + Err(ref err) if err.is_inner() => (), + Err(_) => panic!("Waited for too long"), + } } } @@ -223,11 +234,15 @@ pub fn connectivity(spec: FactoryChainSpec) { } } -pub fn sync(spec: FactoryChainSpec, block_factory: B, extrinsic_factory: E) +pub fn sync( + spec: FactoryChainSpec, + mut block_factory: B, + mut extrinsic_factory: E, +) where F: ServiceFactory, - B: Fn(&F::FullService) -> ImportBlock, - E: Fn(&F::FullService) -> FactoryExtrinsic, + B: FnMut(&F::FullService) -> ImportBlock, + E: FnMut(&F::FullService) -> FactoryExtrinsic, { const NUM_NODES: u32 = 10; const NUM_BLOCKS: u32 = 512; @@ -265,8 +280,8 @@ pub fn consensus(spec: FactoryChainSpec, authorities: Vec) where F: ServiceFactory, { - const NUM_NODES: u32 = 20; - const NUM_BLOCKS: u32 = 200; + const NUM_NODES: u32 = 10; + const NUM_BLOCKS: u32 = 10; // 10 * 2 sec block production time = ~20 seconds 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"); diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index 3c46f48f3f..24234fd271 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -39,6 +39,7 @@ rand = "0.6" finality_tracker = { package = "srml-finality-tracker", path = "../../srml/finality-tracker", default-features = false } [dev-dependencies] +consensus-common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } service-test = { package = "substrate-service-test", path = "../../core/service/test" } [build-dependencies] diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 18238eaa12..2ce4a3e656 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -370,7 +370,7 @@ pub fn local_testnet_config() -> ChainSpec { } #[cfg(test)] -mod tests { +pub(crate) mod tests { use super::*; use service_test; use crate::service::Factory; @@ -381,13 +381,41 @@ mod tests { genesis } + fn local_testnet_genesis_instant_single() -> GenesisConfig { + let mut genesis = testnet_genesis( + vec![ + get_authority_keys_from_seed("Alice"), + ], + get_account_id_from_seed("Alice"), + None, + false, + ); + genesis.timestamp = Some(TimestampConfig { minimum_period: 1 }); + genesis + } + + /// Local testnet config (single validator - Alice) + pub fn integration_test_config_with_single_authority() -> ChainSpec { + ChainSpec::from_genesis( + "Integration Test", + "test", + local_testnet_genesis_instant_single, + vec![], + None, + None, + None, + None, + ) + } + /// Local testnet config (multivalidator Alice + Bob) - pub fn integration_test_config() -> ChainSpec { + pub fn integration_test_config_with_two_authorities() -> ChainSpec { ChainSpec::from_genesis("Integration Test", "test", local_testnet_genesis_instant, vec![], None, None, None, None) } #[test] + #[ignore] fn test_connectivity() { - service_test::connectivity::(integration_test_config()); + service_test::connectivity::(integration_test_config_with_two_authorities()); } } diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index fa7beb6421..d9db310724 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -220,6 +220,23 @@ construct_service_factory! { #[cfg(test)] mod tests { + use std::sync::Arc; + use consensus::CompatibleDigestItem; + use consensus_common::{Environment, Proposer, ImportBlock, BlockOrigin, ForkChoiceStrategy}; + use node_primitives::DigestItem; + use node_runtime::{Call, BalancesCall, UncheckedExtrinsic}; + use parity_codec::{Compact, Encode, Decode}; + use primitives::{ + crypto::Pair as CryptoPair, ed25519::Pair, blake2_256, + sr25519::Public as AddressPublic, + }; + use sr_primitives::{generic::{BlockId, Era, Digest}, traits::{Block, Digest as DigestT}, OpaqueExtrinsic}; + use timestamp; + use finality_tracker; + use keyring::{ed25519::Keyring as AuthorityKeyring, sr25519::Keyring as AccountKeyring}; + use substrate_service::ServiceFactory; + use crate::service::Factory; + #[cfg(feature = "rhd")] fn test_sync() { use {service_test, Factory}; @@ -267,4 +284,107 @@ mod tests { service_test::sync::(chain_spec::integration_test_config(), block_factory, extrinsic_factory); } + #[test] + #[ignore] + fn test_sync() { + let chain_spec = crate::chain_spec::tests::integration_test_config_with_single_authority(); + + let alice = Arc::new(AuthorityKeyring::Alice.pair()); + let mut slot_num = 1u64; + let block_factory = |service: &::FullService| { + let mut inherent_data = service.config.custom.inherent_data_providers + .create_inherent_data().unwrap(); + inherent_data.replace_data(finality_tracker::INHERENT_IDENTIFIER, &1u64); + inherent_data.replace_data(timestamp::INHERENT_IDENTIFIER, &(slot_num * 10)); + + let parent_id = BlockId::number(service.client().info().unwrap().chain.best_number); + let parent_header = service.client().header(&parent_id).unwrap().unwrap(); + let proposer_factory = Arc::new(substrate_basic_authorship::ProposerFactory { + client: service.client(), + transaction_pool: service.transaction_pool(), + }); + let mut digest = Digest::::default(); + digest.push(>::aura_pre_digest(slot_num * 10 / 2)); + let proposer = proposer_factory.init(&parent_header, &[]).unwrap(); + let new_block = proposer.propose( + inherent_data, + digest, + ::std::time::Duration::from_secs(1), + ).expect("Error making test block"); + + let (new_header, new_body) = new_block.deconstruct(); + let pre_hash = new_header.hash(); + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let to_sign = pre_hash.encode(); + let signature = alice.sign(&to_sign[..]); + let item = >::aura_seal( + signature, + ); + slot_num += 1; + + ImportBlock { + origin: BlockOrigin::File, + header: new_header, + justification: None, + post_digests: vec![item], + body: Some(new_body), + finalized: true, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + } + }; + + let bob = Arc::new(AccountKeyring::Bob.pair()); + let charlie = Arc::new(AccountKeyring::Charlie.pair()); + + let mut index = 0; + let extrinsic_factory = |service: &::FullService| { + let amount = 1000; + let to = AddressPublic::from_raw(bob.public().0); + let from = AddressPublic::from_raw(charlie.public().0); + let genesis_hash = service.client().block_hash(0).unwrap().unwrap(); + let signer = charlie.clone(); + + let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); + 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 { + signer.sign(payload) + }); + let xt = UncheckedExtrinsic::new_signed( + index, + raw_payload.1, + from.into(), + signature.into(), + era, + ).encode(); + let v: Vec = Decode::decode(&mut xt.as_slice()).unwrap(); + + index += 1; + OpaqueExtrinsic(v) + }; + + service_test::sync::( + chain_spec, + block_factory, + extrinsic_factory, + ); + } + + #[test] + #[ignore] + fn test_consensus() { + use super::Factory; + + service_test::consensus::( + crate::chain_spec::tests::integration_test_config_with_two_authorities(), + vec![ + "//Alice".into(), + "//Bob".into(), + ], + ) + } } diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 4dde59296f..2135ad672f 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -57,9 +57,10 @@ pub type Hash = primitives::H256; /// A timestamp: seconds since the unix epoch. pub type Timestamp = u64; +/// Digest item type. +pub type DigestItem = generic::DigestItem; /// Header type. -/// -pub type Header = generic::Header>; +pub type Header = generic::Header; /// Block type. pub type Block = generic::Block; /// Block ID. -- GitLab From bfabed51cf2c4ead5aca08634ddcaf4b3ba837a9 Mon Sep 17 00:00:00 2001 From: Kian Peymani Date: Wed, 5 Jun 2019 11:42:29 +0200 Subject: [PATCH 077/140] Some benchmarks for phragmen (#2650) * Add some benchmarks for phragmen * Fix dep. import. * Clean up with some macros. * more details. * Fix dual import. * Remove wrong assertions. * Add a few more. --- Cargo.lock | 1 + srml/staking/Cargo.toml | 2 + srml/staking/src/benches.rs | 114 +++++++++++++++++++++++++++++++++++ srml/staking/src/lib.rs | 29 ++++++--- srml/staking/src/mock.rs | 36 +++++++++-- srml/staking/src/phragmen.rs | 46 +++++++------- srml/staking/src/tests.rs | 39 +----------- 7 files changed, 193 insertions(+), 74 deletions(-) create mode 100644 srml/staking/src/benches.rs diff --git a/Cargo.lock b/Cargo.lock index 0246844271..37e52797fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3692,6 +3692,7 @@ name = "srml-staking" version = "2.0.0" dependencies = [ "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)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", diff --git a/srml/staking/Cargo.toml b/srml/staking/Cargo.toml index 857ea73ee4..62fc187176 100644 --- a/srml/staking/Cargo.toml +++ b/srml/staking/Cargo.toml @@ -21,8 +21,10 @@ session = { package = "srml-session", path = "../session", default-features = fa substrate-primitives = { path = "../../core/primitives" } timestamp = { package = "srml-timestamp", path = "../timestamp" } balances = { package = "srml-balances", path = "../balances" } +rand = "0.6.5" [features] +bench = [] default = ["std"] std = [ "serde", diff --git a/srml/staking/src/benches.rs b/srml/staking/src/benches.rs new file mode 100644 index 0000000000..e3ee00b9e9 --- /dev/null +++ b/srml/staking/src/benches.rs @@ -0,0 +1,114 @@ +// 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. + +//! Benchmarks of the phragmen election algorithm. +//! Note that execution times will not be accurate in an absolute scale, since +//! - Everything is executed in the context of `TestExternalities` +//! - Everything is executed in native environment. +//! +//! Run using: +//! +//! ```zsh +//! cargo bench --features bench --color always +//! ``` + +use test::Bencher; +use runtime_io::with_externalities; +use mock::*; +use super::*; +use rand::{self, Rng}; + +const VALIDATORS: u64 = 1000; +const NOMINATORS: u64 = 10_000; +const EDGES: u64 = 2; +const TO_ELECT: usize = 100; +const STAKE: u64 = 1000; + +fn do_phragmen(b: &mut Bencher, num_vals: u64, num_noms: u64, count: usize, votes_per: u64) { + with_externalities(&mut ExtBuilder::default().nominate(false).build(), || { + assert!(num_vals > votes_per); + let rr = |a, b| rand::thread_rng().gen_range(a as usize, b as usize) as u64; + + // prefix to distinguish the validator and nominator account ranges. + let np = 10_000; + + (1 ..= 2*num_vals) + .step_by(2) + .for_each(|acc| bond_validator(acc, STAKE + rr(10, 50))); + + (np ..= (np + 2*num_noms)) + .step_by(2) + .for_each(|acc| { + let mut stashes_to_vote = (1 ..= 2*num_vals) + .step_by(2) + .map(|ctrl| ctrl + 1) + .collect::>(); + let votes = (0 .. votes_per) + .map(|_| { + stashes_to_vote.remove(rr(0, stashes_to_vote.len()) as usize) + }) + .collect::>(); + bond_nominator(acc, STAKE + rr(10, 50), votes); + }); + + b.iter(|| { + let _ = phragmen::elect::( + count, + 1_usize, + >::enumerate(), + >::enumerate(), + Staking::slashable_balance_of + ); + }) + }) +} + +macro_rules! phragmen_benches { + ($($name:ident: $tup:expr,)*) => { + $( + #[bench] + fn $name(b: &mut Bencher) { + let (v, n, t, e) = $tup; + println!(""); + println!( + "++ Benchmark: {} Validators // {} Nominators // {} Edges-per-nominator // {} total edges // electing {}", + v, n, e, e * n, t + ); + do_phragmen(b, v, n, t, e); + } + )* + } +} + +phragmen_benches! { + bench_1_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES), + bench_1_2: (VALIDATORS*2, NOMINATORS, TO_ELECT, EDGES), + bench_1_3: (VALIDATORS*4, NOMINATORS, TO_ELECT, EDGES), + bench_1_4: (VALIDATORS*8, NOMINATORS, TO_ELECT, EDGES), + + bench_0_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES), + bench_0_2: (VALIDATORS, NOMINATORS, TO_ELECT * 4, EDGES), + bench_0_3: (VALIDATORS, NOMINATORS, TO_ELECT * 8, EDGES), + bench_0_4: (VALIDATORS, NOMINATORS, TO_ELECT * 16, EDGES), + + bench_2_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES), + bench_2_2: (VALIDATORS, NOMINATORS*2, TO_ELECT, EDGES), + bench_2_3: (VALIDATORS, NOMINATORS*4, TO_ELECT, EDGES), + bench_2_4: (VALIDATORS, NOMINATORS*8, TO_ELECT, EDGES), + + bench_3_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES), + bench_3_2: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES*2), + bench_3_3: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES*4), + bench_3_4: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES*8), +} diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index f84bf0a9ce..3f6905f654 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -240,16 +240,31 @@ //! stored in the Session module's `Validators` at the end of each era. #![cfg_attr(not(feature = "std"), no_std)] +#![cfg_attr(all(feature = "bench", test), feature(test))] + +#[cfg(all(feature = "bench", test))] +extern crate test; + +#[cfg(any(feature = "bench", test))] +mod mock; + +#[cfg(test)] +mod tests; + +mod phragmen; + +#[cfg(all(feature = "bench", test))] +mod benches; #[cfg(feature = "std")] use runtime_io::with_storage; 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}; -use srml_support::traits::{ - Currency, OnFreeBalanceZero, OnDilution, LockIdentifier, LockableCurrency, WithdrawReasons, - OnUnbalanced, Imbalance, +use srml_support::{ StorageValue, StorageMap, EnumerableStorageMap, dispatch::Result, + decl_module, decl_event, decl_storage, ensure, + traits::{Currency, OnFreeBalanceZero, OnDilution, LockIdentifier, LockableCurrency, + WithdrawReasons, OnUnbalanced, Imbalance + } }; use session::OnSessionChange; use primitives::Perbill; @@ -261,10 +276,6 @@ use primitives::traits::{ use primitives::{Serialize, Deserialize}; use system::ensure_signed; -mod mock; -mod tests; -mod phragmen; - use phragmen::{elect, ACCURACY, ExtendedBalance}; const RECENT_OFFLINE_COUNT: usize = 32; diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 88b401b19e..5b3b22dda5 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -16,14 +16,12 @@ //! Test utilities -#![cfg(test)] - use primitives::{traits::{IdentityLookup, Convert}, BuildStorage, Perbill}; use primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, ConvertUintAuthorityId}; use substrate_primitives::{H256, Blake2Hasher}; use runtime_io; -use srml_support::impl_outer_origin; -use crate::{GenesisConfig, Module, Trait, StakerStatus}; +use srml_support::{impl_outer_origin, assert_ok, traits::Currency}; +use crate::{GenesisConfig, Module, Trait, StakerStatus, ValidatorPrefs, RewardDestination}; /// The AccountId alias in this test module. pub type AccountIdType = u64; @@ -241,3 +239,33 @@ pub type Balances = balances::Module; pub type Session = session::Module; pub type Timestamp = timestamp::Module; pub type Staking = Module; + +pub 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::()); +} + +pub fn check_exposure_all() { + Staking::current_elected().into_iter().for_each(|acc| check_exposure(acc)); +} + +pub fn assert_total_expo(acc: u64, val: u64) { + let expo = Staking::stakers(&acc); + assert_eq!(expo.total, val); +} + +pub 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())); +} + +pub 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)); +} \ No newline at end of file diff --git a/srml/staking/src/phragmen.rs b/srml/staking/src/phragmen.rs index 888e38a7ec..ba79de4869 100644 --- a/srml/staking/src/phragmen.rs +++ b/srml/staking/src/phragmen.rs @@ -107,29 +107,29 @@ pub fn elect( // 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, ..Default::default() }, stash_balance) - }) - .filter_map(|(mut c, s)| { - c.approval_stake += to_votes(s); - if c.approval_stake.is_zero() { - None - } else { - Some((c, s)) - } - }) - .enumerate() - .map(|(idx, (c, s))| { - nominators.push(Nominator { - who: c.who.clone(), - edges: vec![ Edge { who: c.who.clone(), candidate_index: idx, ..Default::default() }], - budget: to_votes(s), - load: Fraction::zero(), - }); - c_idx_cache.insert(c.who.clone(), idx); - c - }) - .collect::>>(); + let stash_balance = stash_of(&who); + (Candidate { who, ..Default::default() }, stash_balance) + }) + .filter_map(|(mut c, s)| { + c.approval_stake += to_votes(s); + if c.approval_stake.is_zero() { + None + } else { + Some((c, s)) + } + }) + .enumerate() + .map(|(idx, (c, s))| { + nominators.push(Nominator { + who: c.who.clone(), + edges: vec![ Edge { who: c.who.clone(), candidate_index: idx, ..Default::default() }], + budget: to_votes(s), + load: Fraction::zero(), + }); + c_idx_cache.insert(c.who.clone(), idx); + c + }) + .collect::>>(); // 2- Collect the nominators with the associated votes. // Also collect approval stake along the way. diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index fecd38bb01..eba6ce77a5 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -16,50 +16,13 @@ //! Tests for the module. -#![cfg(test)] - use super::*; use runtime_io::with_externalities; use phragmen; use srml_support::{assert_ok, assert_noop, assert_eq_uvec, EnumerableStorageMap}; -use mock::{Balances, Session, Staking, System, Timestamp, Test, ExtBuilder, Origin}; +use mock::*; 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 -- GitLab From 54d028551b11f40266628ceeb35bec0595d360c3 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 5 Jun 2019 11:56:36 +0200 Subject: [PATCH 078/140] Revert #2745 (#2791) * Revert #2745 * Fix error in merge resolve * Fix compilation --- core/network/src/lib.rs | 3 +-- core/network/src/protocol.rs | 15 ++++----------- core/network/src/specialization.rs | 18 +----------------- core/network/src/test/mod.rs | 8 ++++---- node/cli/src/service.rs | 2 +- 5 files changed, 11 insertions(+), 35 deletions(-) diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 5b438135ed..e2def15425 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -46,8 +46,7 @@ pub use service::{ NetworkService, NetworkWorker, FetchFuture, TransactionPool, ManageNetwork, NetworkMsg, SyncProvider, ExHashT, ReportHandle, }; -pub use protocol::{ProtocolStatus, PeerInfo}; -pub use specialization::Context; +pub use protocol::{ProtocolStatus, PeerInfo, Context}; pub use sync::{Status as SyncStatus, SyncState}; pub use network_libp2p::{ identity, multiaddr, diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 2281b9da7f..a824bd58d3 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -32,7 +32,7 @@ use crate::message::{BlockAttributes, Direction, FromBlock, RequestId}; use crate::message::generic::{Message as GenericMessage, ConsensusMessage}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; use crate::on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; -use crate::specialization::{NetworkSpecialization, Context as SpecializationContext}; +use crate::specialization::NetworkSpecialization; use crate::sync::{ChainSync, Context as SyncContext, Status as SyncStatus, SyncState}; use crate::service::{TransactionPool, ExHashT}; use crate::config::Roles; @@ -281,6 +281,9 @@ pub trait Context { /// Send a consensus message to a peer. fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage); + + /// Send a chain-specific message to a peer. + fn send_chain_specific(&mut self, who: PeerId, message: Vec); } /// Protocol context. @@ -312,16 +315,6 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, GenericMessage::Consensus(consensus) ) } -} - -impl<'a, B: BlockT + 'a, H: ExHashT + 'a> SpecializationContext 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 send_chain_specific(&mut self, who: PeerId, message: Vec) { send_message( diff --git a/core/network/src/specialization.rs b/core/network/src/specialization.rs index 772a1bcbe1..e8a0a0c949 100644 --- a/core/network/src/specialization.rs +++ b/core/network/src/specialization.rs @@ -18,6 +18,7 @@ use crate::PeerId; use runtime_primitives::traits::Block as BlockT; +use crate::protocol::Context; /// A specialization of the substrate network protocol. Handles events and sends messages. pub trait NetworkSpecialization: Send + Sync + 'static { @@ -50,23 +51,6 @@ pub trait NetworkSpecialization: Send + Sync + 'static { fn on_block_imported(&mut self, _ctx: &mut dyn Context, _hash: B::Hash, _header: &B::Header) { } } -/// Context for a network-specific handler. -pub trait Context { - /// 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); - - /// Send a consensus message to a peer. - #[deprecated(note = "This method shouldn't have been part of the specialization API")] - fn send_consensus(&mut self, _who: PeerId, _consensus: crate::message::generic::ConsensusMessage) {} - - /// Send a chain-specific message to a peer. - fn send_chain_specific(&mut self, who: PeerId, message: Vec); -} - /// 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. diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index b9703d71e0..886a09fa2a 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -50,7 +50,7 @@ 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::{NetworkLink, NetworkMsg, ProtocolMsg, TransactionPool}; -use crate::specialization::{NetworkSpecialization, Context as SpecializationContext}; +use crate::specialization::NetworkSpecialization; use test_client::{self, AccountKeyring}; pub use test_client::runtime::{Block, Extrinsic, Hash, Transfer}; @@ -103,16 +103,16 @@ impl NetworkSpecialization for DummySpecialization { fn on_connect( &mut self, - _ctx: &mut dyn SpecializationContext, + _ctx: &mut dyn Context, _peer_id: PeerId, _status: crate::message::Status ) {} - fn on_disconnect(&mut self, _ctx: &mut dyn SpecializationContext, _peer_id: PeerId) {} + fn on_disconnect(&mut self, _ctx: &mut dyn Context, _peer_id: PeerId) {} fn on_message( &mut self, - _ctx: &mut dyn SpecializationContext, + _ctx: &mut dyn Context, _peer_id: PeerId, _message: &mut Option>, ) {} diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index d9db310724..2991bfe377 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -297,7 +297,7 @@ mod tests { inherent_data.replace_data(finality_tracker::INHERENT_IDENTIFIER, &1u64); inherent_data.replace_data(timestamp::INHERENT_IDENTIFIER, &(slot_num * 10)); - let parent_id = BlockId::number(service.client().info().unwrap().chain.best_number); + let parent_id = BlockId::number(service.client().info().chain.best_number); let parent_header = service.client().header(&parent_id).unwrap().unwrap(); let proposer_factory = Arc::new(substrate_basic_authorship::ProposerFactory { client: service.client(), -- GitLab From 9687db56516ef573f650dadc030315b78d708cc4 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 5 Jun 2019 12:36:28 +0200 Subject: [PATCH 079/140] Sensible scheduling for referenda (#2753) * Nonlinear locking and cleanups * Bump runtime version * Minor cleanup * Fix tests * Fix council tests * Fix flaw in turnout counting * Initial work on referendum schedules * Refactor council-democracy interface. * Fix build * Update srml/democracy/src/lib.rs Co-Authored-By: Luke Schoen * Update srml/democracy/src/lib.rs Co-Authored-By: Luke Schoen * Tests compile again * Tests! * Update todo * Fix build * Ensure votes arer not double-counted on member-transitions * Extra logic for normal council changes * Typo * A few grumbles addressed. --- core/primitives/src/u32_trait.rs | 154 ++++++ core/sr-primitives/src/traits.rs | 6 +- node/cli/src/chain_spec.rs | 12 +- node/executor/src/lib.rs | 1 - node/runtime/src/lib.rs | 25 +- srml/contract/src/lib.rs | 4 +- srml/council/src/lib.rs | 44 +- srml/council/src/motions.rs | 299 +++++++++--- srml/council/src/seats.rs | 30 +- srml/council/src/voting.rs | 494 ------------------- srml/democracy/src/lib.rs | 725 ++++++++++++++++++++++++---- srml/support/src/metadata.rs | 3 +- srml/support/src/origin.rs | 22 +- srml/support/src/traits.rs | 16 +- srml/support/test/tests/instance.rs | 10 +- srml/system/src/lib.rs | 88 +++- 16 files changed, 1186 insertions(+), 747 deletions(-) delete mode 100644 srml/council/src/voting.rs diff --git a/core/primitives/src/u32_trait.rs b/core/primitives/src/u32_trait.rs index 3fcdceac4c..d8fac34c30 100644 --- a/core/primitives/src/u32_trait.rs +++ b/core/primitives/src/u32_trait.rs @@ -21,6 +21,7 @@ pub trait Value { /// The actual value represented by the impl'ing type. const VALUE: u32; } + /// Type representing the value 0 for the `Value` trait. pub struct _0; impl Value for _0 { const VALUE: u32 = 0; } /// Type representing the value 1 for the `Value` trait. @@ -55,22 +56,174 @@ pub struct _14; impl Value for _14 { const VALUE: u32 = 14; } pub struct _15; impl Value for _15 { const VALUE: u32 = 15; } /// Type representing the value 16 for the `Value` trait. pub struct _16; impl Value for _16 { const VALUE: u32 = 16; } +/// Type representing the value 17 for the `Value` trait. +pub struct _17; impl Value for _17 { const VALUE: u32 = 17; } +/// Type representing the value 18 for the `Value` trait. +pub struct _18; impl Value for _18 { const VALUE: u32 = 18; } +/// Type representing the value 19 for the `Value` trait. +pub struct _19; impl Value for _19 { const VALUE: u32 = 19; } +/// Type representing the value 20 for the `Value` trait. +pub struct _20; impl Value for _20 { const VALUE: u32 = 20; } +/// Type representing the value 21 for the `Value` trait. +pub struct _21; impl Value for _21 { const VALUE: u32 = 21; } +/// Type representing the value 22 for the `Value` trait. +pub struct _22; impl Value for _22 { const VALUE: u32 = 22; } +/// Type representing the value 23 for the `Value` trait. +pub struct _23; impl Value for _23 { const VALUE: u32 = 23; } /// Type representing the value 24 for the `Value` trait. pub struct _24; impl Value for _24 { const VALUE: u32 = 24; } +/// Type representing the value 25 for the `Value` trait. +pub struct _25; impl Value for _25 { const VALUE: u32 = 25; } +/// Type representing the value 26 for the `Value` trait. +pub struct _26; impl Value for _26 { const VALUE: u32 = 26; } +/// Type representing the value 27 for the `Value` trait. +pub struct _27; impl Value for _27 { const VALUE: u32 = 27; } +/// Type representing the value 28 for the `Value` trait. +pub struct _28; impl Value for _28 { const VALUE: u32 = 28; } +/// Type representing the value 29 for the `Value` trait. +pub struct _29; impl Value for _29 { const VALUE: u32 = 29; } +/// Type representing the value 30 for the `Value` trait. +pub struct _30; impl Value for _30 { const VALUE: u32 = 30; } +/// Type representing the value 31 for the `Value` trait. +pub struct _31; impl Value for _31 { const VALUE: u32 = 31; } /// Type representing the value 32 for the `Value` trait. pub struct _32; impl Value for _32 { const VALUE: u32 = 32; } +/// Type representing the value 33 for the `Value` trait. +pub struct _33; impl Value for _33 { const VALUE: u32 = 33; } +/// Type representing the value 34 for the `Value` trait. +pub struct _34; impl Value for _34 { const VALUE: u32 = 34; } +/// Type representing the value 35 for the `Value` trait. +pub struct _35; impl Value for _35 { const VALUE: u32 = 35; } +/// Type representing the value 36 for the `Value` trait. +pub struct _36; impl Value for _36 { const VALUE: u32 = 36; } +/// Type representing the value 37 for the `Value` trait. +pub struct _37; impl Value for _37 { const VALUE: u32 = 37; } +/// Type representing the value 38 for the `Value` trait. +pub struct _38; impl Value for _38 { const VALUE: u32 = 38; } +/// Type representing the value 39 for the `Value` trait. +pub struct _39; impl Value for _39 { const VALUE: u32 = 39; } /// Type representing the value 40 for the `Value` trait. pub struct _40; impl Value for _40 { const VALUE: u32 = 40; } +/// Type representing the value 41 for the `Value` trait. +pub struct _41; impl Value for _41 { const VALUE: u32 = 41; } +/// Type representing the value 42 for the `Value` trait. +pub struct _42; impl Value for _42 { const VALUE: u32 = 42; } +/// Type representing the value 43 for the `Value` trait. +pub struct _43; impl Value for _43 { const VALUE: u32 = 43; } +/// Type representing the value 44 for the `Value` trait. +pub struct _44; impl Value for _44 { const VALUE: u32 = 44; } +/// Type representing the value 45 for the `Value` trait. +pub struct _45; impl Value for _45 { const VALUE: u32 = 45; } +/// Type representing the value 46 for the `Value` trait. +pub struct _46; impl Value for _46 { const VALUE: u32 = 46; } +/// Type representing the value 47 for the `Value` trait. +pub struct _47; impl Value for _47 { const VALUE: u32 = 47; } /// Type representing the value 48 for the `Value` trait. pub struct _48; impl Value for _48 { const VALUE: u32 = 48; } +/// Type representing the value 49 for the `Value` trait. +pub struct _49; impl Value for _49 { const VALUE: u32 = 49; } +/// Type representing the value 50 for the `Value` trait. +pub struct _50; impl Value for _50 { const VALUE: u32 = 50; } +/// Type representing the value 51 for the `Value` trait. +pub struct _51; impl Value for _51 { const VALUE: u32 = 51; } +/// Type representing the value 52 for the `Value` trait. +pub struct _52; impl Value for _52 { const VALUE: u32 = 52; } +/// Type representing the value 53 for the `Value` trait. +pub struct _53; impl Value for _53 { const VALUE: u32 = 53; } +/// Type representing the value 54 for the `Value` trait. +pub struct _54; impl Value for _54 { const VALUE: u32 = 54; } +/// Type representing the value 55 for the `Value` trait. +pub struct _55; impl Value for _55 { const VALUE: u32 = 55; } /// Type representing the value 56 for the `Value` trait. pub struct _56; impl Value for _56 { const VALUE: u32 = 56; } +/// Type representing the value 57 for the `Value` trait. +pub struct _57; impl Value for _57 { const VALUE: u32 = 57; } +/// Type representing the value 58 for the `Value` trait. +pub struct _58; impl Value for _58 { const VALUE: u32 = 58; } +/// Type representing the value 59 for the `Value` trait. +pub struct _59; impl Value for _59 { const VALUE: u32 = 59; } +/// Type representing the value 60 for the `Value` trait. +pub struct _60; impl Value for _60 { const VALUE: u32 = 60; } +/// Type representing the value 61 for the `Value` trait. +pub struct _61; impl Value for _61 { const VALUE: u32 = 61; } +/// Type representing the value 62 for the `Value` trait. +pub struct _62; impl Value for _62 { const VALUE: u32 = 62; } +/// Type representing the value 63 for the `Value` trait. +pub struct _63; impl Value for _63 { const VALUE: u32 = 63; } /// Type representing the value 64 for the `Value` trait. pub struct _64; impl Value for _64 { const VALUE: u32 = 64; } +/// Type representing the value 65 for the `Value` trait. +pub struct _65; impl Value for _65 { const VALUE: u32 = 65; } +/// Type representing the value 66 for the `Value` trait. +pub struct _66; impl Value for _66 { const VALUE: u32 = 66; } +/// Type representing the value 67 for the `Value` trait. +pub struct _67; impl Value for _67 { const VALUE: u32 = 67; } +/// Type representing the value 68 for the `Value` trait. +pub struct _68; impl Value for _68 { const VALUE: u32 = 68; } +/// Type representing the value 69 for the `Value` trait. +pub struct _69; impl Value for _69 { const VALUE: u32 = 69; } +/// Type representing the value 70 for the `Value` trait. +pub struct _70; impl Value for _70 { const VALUE: u32 = 70; } +/// Type representing the value 71 for the `Value` trait. +pub struct _71; impl Value for _71 { const VALUE: u32 = 71; } +/// Type representing the value 72 for the `Value` trait. +pub struct _72; impl Value for _72 { const VALUE: u32 = 72; } +/// Type representing the value 73 for the `Value` trait. +pub struct _73; impl Value for _73 { const VALUE: u32 = 73; } +/// Type representing the value 74 for the `Value` trait. +pub struct _74; impl Value for _74 { const VALUE: u32 = 74; } +/// Type representing the value 75 for the `Value` trait. +pub struct _75; impl Value for _75 { const VALUE: u32 = 75; } +/// Type representing the value 76 for the `Value` trait. +pub struct _76; impl Value for _76 { const VALUE: u32 = 76; } +/// Type representing the value 77 for the `Value` trait. +pub struct _77; impl Value for _77 { const VALUE: u32 = 77; } +/// Type representing the value 78 for the `Value` trait. +pub struct _78; impl Value for _78 { const VALUE: u32 = 78; } +/// Type representing the value 79 for the `Value` trait. +pub struct _79; impl Value for _79 { const VALUE: u32 = 79; } /// Type representing the value 80 for the `Value` trait. pub struct _80; impl Value for _80 { const VALUE: u32 = 80; } +/// Type representing the value 81 for the `Value` trait. +pub struct _81; impl Value for _81 { const VALUE: u32 = 81; } +/// Type representing the value 82 for the `Value` trait. +pub struct _82; impl Value for _82 { const VALUE: u32 = 82; } +/// Type representing the value 83 for the `Value` trait. +pub struct _83; impl Value for _83 { const VALUE: u32 = 83; } +/// Type representing the value 84 for the `Value` trait. +pub struct _84; impl Value for _84 { const VALUE: u32 = 84; } +/// Type representing the value 85 for the `Value` trait. +pub struct _85; impl Value for _85 { const VALUE: u32 = 85; } +/// Type representing the value 86 for the `Value` trait. +pub struct _86; impl Value for _86 { const VALUE: u32 = 86; } +/// Type representing the value 87 for the `Value` trait. +pub struct _87; impl Value for _87 { const VALUE: u32 = 87; } +/// Type representing the value 88 for the `Value` trait. +pub struct _88; impl Value for _88 { const VALUE: u32 = 88; } +/// Type representing the value 89 for the `Value` trait. +pub struct _89; impl Value for _89 { const VALUE: u32 = 89; } +/// Type representing the value 90 for the `Value` trait. +pub struct _90; impl Value for _90 { const VALUE: u32 = 90; } +/// Type representing the value 91 for the `Value` trait. +pub struct _91; impl Value for _91 { const VALUE: u32 = 91; } +/// Type representing the value 92 for the `Value` trait. +pub struct _92; impl Value for _92 { const VALUE: u32 = 92; } +/// Type representing the value 93 for the `Value` trait. +pub struct _93; impl Value for _93 { const VALUE: u32 = 93; } +/// Type representing the value 94 for the `Value` trait. +pub struct _94; impl Value for _94 { const VALUE: u32 = 94; } +/// Type representing the value 95 for the `Value` trait. +pub struct _95; impl Value for _95 { const VALUE: u32 = 95; } /// Type representing the value 96 for the `Value` trait. pub struct _96; impl Value for _96 { const VALUE: u32 = 96; } +/// Type representing the value 97 for the `Value` trait. +pub struct _97; impl Value for _97 { const VALUE: u32 = 97; } +/// Type representing the value 98 for the `Value` trait. +pub struct _98; impl Value for _98 { const VALUE: u32 = 98; } +/// Type representing the value 99 for the `Value` trait. +pub struct _99; impl Value for _99 { const VALUE: u32 = 99; } +/// Type representing the value 100 for the `Value` trait. +pub struct _100; impl Value for _100 { const VALUE: u32 = 100; } /// Type representing the value 112 for the `Value` trait. pub struct _112; impl Value for _112 { const VALUE: u32 = 112; } /// Type representing the value 128 for the `Value` trait. @@ -87,3 +240,4 @@ pub struct _256; impl Value for _256 { const VALUE: u32 = 256; } pub struct _384; impl Value for _384 { const VALUE: u32 = 384; } /// Type representing the value 512 for the `Value` trait. pub struct _512; impl Value for _512 { const VALUE: u32 = 512; } + diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 5963450360..f412ede0af 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -73,7 +73,11 @@ pub trait EnsureOrigin { /// A return type. type Success; /// Perform the origin check. - fn ensure_origin(o: OuterOrigin) -> result::Result; + fn ensure_origin(o: OuterOrigin) -> result::Result { + Self::try_origin(o).map_err(|_| "Invalid origin") + } + /// Perform the origin check. + fn try_origin(o: OuterOrigin) -> result::Result; } /// Means of changing one type into another in a manner dependent on the source type. diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 2ce4a3e656..bc24de9ddf 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -18,7 +18,7 @@ use primitives::{ed25519::Public as AuthorityId, ed25519, sr25519, Pair, crypto::UncheckedInto}; use node_primitives::AccountId; -use node_runtime::{ConsensusConfig, CouncilSeatsConfig, CouncilVotingConfig, DemocracyConfig, +use node_runtime::{ConsensusConfig, CouncilSeatsConfig, DemocracyConfig, SessionConfig, StakingConfig, StakerStatus, TimestampConfig, BalancesConfig, TreasuryConfig, SudoConfig, ContractConfig, GrandpaConfig, IndicesConfig, Permill, Perbill}; pub use node_runtime::GenesisConfig; @@ -132,11 +132,6 @@ fn staging_testnet_config_genesis() -> GenesisConfig { desired_seats: 0, inactive_grace_period: 1, // one additional vote should go by before an inactive voter can be reaped. }), - council_voting: Some(CouncilVotingConfig { - cooloff_period: 4 * DAYS, - voting_period: 1 * DAYS, - enact_delay_period: 0, - }), timestamp: Some(TimestampConfig { minimum_period: SECS_PER_BLOCK / 2, // due to the nature of aura the slots are 2*period }), @@ -312,11 +307,6 @@ pub fn testnet_genesis( desired_seats: (endowed_accounts.len() / 2 - initial_authorities.len()) as u32, inactive_grace_period: 1, }), - council_voting: Some(CouncilVotingConfig { - cooloff_period: 75, - voting_period: 20, - enact_delay_period: 0, - }), timestamp: Some(TimestampConfig { minimum_period: 2, // 2*2=4 second block time. }), diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 8813850bbd..05dc424d49 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -316,7 +316,6 @@ mod tests { }), democracy: Some(Default::default()), council_seats: Some(Default::default()), - council_voting: Some(Default::default()), timestamp: Some(Default::default()), treasury: Some(Default::default()), contract: Some(Default::default()), diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 5daeccf72c..f0c1a8ae7d 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -22,7 +22,7 @@ use rstd::prelude::*; use support::{construct_runtime, parameter_types}; -use substrate_primitives::u32_trait::{_2, _4}; +use substrate_primitives::u32_trait::{_1, _2, _3, _4}; use node_primitives::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, AuthorityId, Signature, AuthoritySignature }; @@ -37,7 +37,7 @@ use runtime_primitives::traits::{ BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, AuthorityIdFor, Convert, }; use version::RuntimeVersion; -use council::{motions as council_motions, voting as council_voting}; +use council::{motions as council_motions}; #[cfg(feature = "std")] use council::seats as council_seats; #[cfg(any(feature = "std", test))] @@ -156,8 +156,10 @@ const BUCKS: Balance = 1_000_000_000_000; parameter_types! { pub const LaunchPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; pub const VotingPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; + pub const EmergencyVotingPeriod: BlockNumber = 3 * 24 * 60 * MINUTES; pub const MinimumDeposit: Balance = 100 * BUCKS; pub const EnactmentPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; + pub const CooloffPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; } impl democracy::Trait for Runtime { type Proposal = Call; @@ -166,17 +168,21 @@ impl democracy::Trait for Runtime { type EnactmentPeriod = EnactmentPeriod; type LaunchPeriod = LaunchPeriod; type VotingPeriod = VotingPeriod; + type EmergencyVotingPeriod = EmergencyVotingPeriod; type MinimumDeposit = MinimumDeposit; + type ExternalOrigin = council_motions::EnsureProportionAtLeast<_1, _2, AccountId>; + type ExternalMajorityOrigin = council_motions::EnsureProportionAtLeast<_2, _3, AccountId>; + type EmergencyOrigin = council_motions::EnsureProportionAtLeast<_1, _1, AccountId>; + type CancellationOrigin = council_motions::EnsureProportionAtLeast<_2, _3, AccountId>; + type VetoOrigin = council_motions::EnsureMember; + type CooloffPeriod = CooloffPeriod; } impl council::Trait for Runtime { type Event = Event; type BadPresentation = (); type BadReaper = (); -} - -impl council::voting::Trait for Runtime { - type Event = Event; + type OnMembersChanged = CouncilMotions; } impl council::motions::Trait for Runtime { @@ -187,8 +193,8 @@ impl council::motions::Trait for Runtime { impl treasury::Trait for Runtime { type Currency = Balances; - type ApproveOrigin = council_motions::EnsureMembers<_4>; - type RejectOrigin = council_motions::EnsureMembers<_2>; + type ApproveOrigin = council_motions::EnsureMembers<_4, AccountId>; + type RejectOrigin = council_motions::EnsureMembers<_2, AccountId>; type Event = Event; type MintedForSpending = (); type ProposalRejection = (); @@ -236,8 +242,7 @@ construct_runtime!( Staking: staking::{default, OfflineWorker}, Democracy: democracy, Council: council::{Module, Call, Storage, Event}, - CouncilVoting: council_voting, - CouncilMotions: council_motions::{Module, Call, Storage, Event, Origin}, + CouncilMotions: council_motions::{Module, Call, Storage, Event, Origin}, CouncilSeats: council_seats::{Config}, FinalityTracker: finality_tracker::{Module, Call, Inherent}, Grandpa: grandpa::{Module, Call, Storage, Config, Log(), Event}, diff --git a/srml/contract/src/lib.rs b/srml/contract/src/lib.rs index 3f05bb8a8f..0111ce7840 100644 --- a/srml/contract/src/lib.rs +++ b/srml/contract/src/lib.rs @@ -506,10 +506,10 @@ decl_module! { 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() => { + Ok(system::RawOrigin::Signed(ref account)) if aux_sender.is_none() => { (true, account) }, - Some(system::RawOrigin::None) if aux_sender.is_some() => { + Ok(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 \ diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index ac5396e4da..a72e93c9eb 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -18,34 +18,42 @@ #![cfg_attr(not(feature = "std"), no_std)] -pub mod voting; pub mod motions; pub mod seats; pub use crate::seats::{Trait, Module, RawEvent, Event, VoteIndex}; +/// Trait for type that can handle incremental changes to a set of account IDs. +pub trait OnMembersChanged { + /// A number of members `new` just joined the set and replaced some `old` ones. + fn on_members_changed(new: &[AccountId], old: &[AccountId]); +} + +impl OnMembersChanged for () { + fn on_members_changed(_new: &[T], _old: &[T]) {} +} + #[cfg(test)] mod tests { // These re-exports are here for a reason, edit with care pub use super::*; pub use runtime_io::with_externalities; use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch, parameter_types}; - pub use substrate_primitives::H256; - pub use primitives::BuildStorage; - pub use primitives::traits::{BlakeTwo256, IdentityLookup}; - pub use primitives::testing::{Digest, DigestItem, Header}; - pub use substrate_primitives::{Blake2Hasher}; - pub use {seats, motions, voting}; + pub use substrate_primitives::{H256, Blake2Hasher, u32_trait::{_1, _2, _3, _4}}; + pub use primitives::{ + BuildStorage, traits::{BlakeTwo256, IdentityLookup}, testing::{Digest, DigestItem, Header} + }; + pub use {seats, motions}; impl_outer_origin! { pub enum Origin for Test { - motions + motions } } impl_outer_event! { pub enum Event for Test { - balances, democracy, seats, voting, motions, + balances, democracy, seats, motions, } } @@ -86,6 +94,7 @@ mod tests { pub const VotingPeriod: u64 = 3; pub const MinimumDeposit: u64 = 1; pub const EnactmentPeriod: u64 = 0; + pub const CooloffPeriod: u64 = 2; } impl democracy::Trait for Test { type Proposal = Call; @@ -93,22 +102,27 @@ mod tests { type Currency = balances::Module; type EnactmentPeriod = EnactmentPeriod; type LaunchPeriod = LaunchPeriod; + type EmergencyVotingPeriod = VotingPeriod; type VotingPeriod = VotingPeriod; type MinimumDeposit = MinimumDeposit; + type ExternalOrigin = motions::EnsureProportionAtLeast<_1, _2, u64>; + type ExternalMajorityOrigin = motions::EnsureProportionAtLeast<_2, _3, u64>; + type EmergencyOrigin = motions::EnsureProportionAtLeast<_1, _1, u64>; + type CancellationOrigin = motions::EnsureProportionAtLeast<_2, _3, u64>; + type VetoOrigin = motions::EnsureMember; + type CooloffPeriod = CooloffPeriod; } impl seats::Trait for Test { type Event = Event; type BadPresentation = (); type BadReaper = (); + type OnMembersChanged = CouncilMotions; } impl motions::Trait for Test { type Origin = Origin; type Proposal = Call; type Event = Event; } - impl voting::Trait for Test { - type Event = Event; - } pub fn new_test_ext(with_council: bool) -> runtime_io::TestExternalities { let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; @@ -138,11 +152,6 @@ mod tests { desired_seats: 2, term_duration: 5, }.build_storage().unwrap().0); - t.extend(voting::GenesisConfig:: { - cooloff_period: 2, - voting_period: 1, - enact_delay_period: 0, - }.build_storage().unwrap().0); runtime_io::TestExternalities::new(t) } @@ -150,6 +159,5 @@ mod tests { pub type Balances = balances::Module; pub type Democracy = democracy::Module; pub type Council = seats::Module; - pub type CouncilVoting = voting::Module; pub type CouncilMotions = motions::Module; } diff --git a/srml/council/src/motions.rs b/srml/council/src/motions.rs index e560fadb9c..4ab4e84c12 100644 --- a/srml/council/src/motions.rs +++ b/srml/council/src/motions.rs @@ -16,21 +16,27 @@ //! Council voting system. -use rstd::prelude::*; -use rstd::result; +use rstd::{prelude::*, result}; use substrate_primitives::u32_trait::Value as U32; use primitives::traits::{Hash, EnsureOrigin}; -use srml_support::dispatch::{Dispatchable, Parameter}; -use srml_support::{StorageValue, StorageMap, decl_module, decl_event, decl_storage, ensure}; -use super::{Trait as CouncilTrait, Module as Council}; +use srml_support::{ + dispatch::{Dispatchable, Parameter}, codec::{Encode, Decode}, + StorageValue, StorageMap, decl_module, decl_event, decl_storage, ensure +}; +use super::{Trait as CouncilTrait, Module as Council, OnMembersChanged}; use system::{self, ensure_signed}; /// Simple index type for proposal counting. pub type ProposalIndex = u32; +/// A number of council members. +/// +/// This also serves as a number of voting members, and since for motions, each council member may +/// vote exactly once, therefore also the number of votes for any given motion. +pub type MemberCount = u32; pub trait Trait: CouncilTrait { /// The outer origin type. - type Origin: From; + type Origin: From>; /// The outer call dispatch type. type Proposal: Parameter + Dispatchable::Origin>; @@ -42,31 +48,79 @@ pub trait Trait: CouncilTrait { /// Origin for the council module. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -pub enum Origin { - /// It has been condoned by a given number of council members. - Members(u32), +pub enum RawOrigin { + /// It has been condoned by a given number of council members from a given total. + Members(MemberCount, MemberCount), + /// It has been condoned by a single council member. + Member(AccountId), +} + +/// Origin for the council module. +pub type Origin = RawOrigin<::AccountId>; + +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +/// Info for keeping track of a motion being voted on. +pub struct Votes { + /// The proposal's unique index. + index: ProposalIndex, + /// The number of approval votes that are needed to pass the motion. + threshold: MemberCount, + /// The current set of voters that approved it. + ayes: Vec, + /// The current set of voters that rejected it. + nays: Vec, +} + +decl_storage! { + trait Store for Module as CouncilMotions { + /// The hashes of the active proposals. + pub Proposals get(proposals): Vec; + /// Actual proposal for a given hash, if it's current. + pub ProposalOf get(proposal_of): map T::Hash => Option<::Proposal>; + /// Votes on a given proposal, if it is ongoing. + pub Voting get(voting): map T::Hash => Option>; + /// Proposals so far. + pub ProposalCount get(proposal_count): u32; + } } decl_event!( pub enum Event where ::Hash, ::AccountId { - /// A motion (given hash) has been proposed (by given account) with a threshold (given u32). - Proposed(AccountId, ProposalIndex, Hash, u32), + /// A motion (given hash) has been proposed (by given account) with a threshold (given + /// `MemberCount`). + Proposed(AccountId, ProposalIndex, Hash, MemberCount), /// A motion (given hash) has been voted on by given account, leaving - /// a tally (yes votes and no votes given as u32s respectively). - Voted(AccountId, Hash, bool, u32, u32), + /// a tally (yes votes and no votes given respectively as `MemberCount`). + Voted(AccountId, Hash, bool, MemberCount, MemberCount), /// A motion was approved by the required threshold. Approved(Hash), /// A motion was not approved by the required threshold. Disapproved(Hash), /// A motion was executed; `bool` is true if returned without error. Executed(Hash, bool), + /// A single councillor did some action; `bool` is true if returned without error. + MemberExecuted(Hash, bool), } ); decl_module! { pub struct Module for enum Call where origin: ::Origin { fn deposit_event() = default; - fn propose(origin, #[compact] threshold: u32, proposal: Box<::Proposal>) { + + /// Dispatch a proposal from a councilor using the `Member` origin. + /// + /// Origin must be a council member. + fn execute(origin, proposal: Box<::Proposal>) { + let who = ensure_signed(origin)?; + ensure!(Self::is_councillor(&who), "proposer not on council"); + + let proposal_hash = T::Hashing::hash_of(&proposal); + let ok = proposal.dispatch(RawOrigin::Member(who).into()).is_ok(); + Self::deposit_event(RawEvent::MemberExecuted(proposal_hash, ok)); + } + + fn propose(origin, #[compact] threshold: MemberCount, proposal: Box<::Proposal>) { let who = ensure_signed(origin)?; ensure!(Self::is_councillor(&who), "proposer not on council"); @@ -76,14 +130,16 @@ decl_module! { ensure!(!>::exists(proposal_hash), "duplicate proposals not allowed"); if threshold < 2 { - let ok = proposal.dispatch(Origin::Members(1).into()).is_ok(); + let seats = >::active_council().len() as MemberCount; + let ok = proposal.dispatch(RawOrigin::Members(1, seats).into()).is_ok(); Self::deposit_event(RawEvent::Executed(proposal_hash, ok)); } else { let index = Self::proposal_count(); >::mutate(|i| *i += 1); >::mutate(|proposals| proposals.push(proposal_hash)); >::insert(proposal_hash, *proposal); - >::insert(proposal_hash, (index, threshold, vec![who.clone()], vec![])); + let votes = Votes { index, threshold, ayes: vec![who.clone()], nays: vec![] }; + >::insert(proposal_hash, votes); Self::deposit_event(RawEvent::Proposed(who, index, proposal_hash, threshold)); } @@ -95,46 +151,46 @@ decl_module! { ensure!(Self::is_councillor(&who), "voter not on council"); let mut voting = Self::voting(&proposal).ok_or("proposal must exist")?; - ensure!(voting.0 == index, "mismatched index"); + ensure!(voting.index == index, "mismatched index"); - let position_yes = voting.2.iter().position(|a| a == &who); - let position_no = voting.3.iter().position(|a| a == &who); + let position_yes = voting.ayes.iter().position(|a| a == &who); + let position_no = voting.nays.iter().position(|a| a == &who); if approve { if position_yes.is_none() { - voting.2.push(who.clone()); + voting.ayes.push(who.clone()); } else { return Err("duplicate vote ignored") } if let Some(pos) = position_no { - voting.3.swap_remove(pos); + voting.nays.swap_remove(pos); } } else { if position_no.is_none() { - voting.3.push(who.clone()); + voting.nays.push(who.clone()); } else { return Err("duplicate vote ignored") } if let Some(pos) = position_yes { - voting.2.swap_remove(pos); + voting.ayes.swap_remove(pos); } } - let yes_votes = voting.2.len() as u32; - let no_votes = voting.3.len() as u32; + let yes_votes = voting.ayes.len() as MemberCount; + let no_votes = voting.nays.len() as MemberCount; Self::deposit_event(RawEvent::Voted(who, proposal, approve, yes_votes, no_votes)); - let threshold = voting.1; - let potential_votes = >::active_council().len() as u32; - let approved = yes_votes >= threshold; - let disapproved = potential_votes.saturating_sub(no_votes) < threshold; + let seats = >::active_council().len() as MemberCount; + let approved = yes_votes >= voting.threshold; + let disapproved = seats.saturating_sub(no_votes) < voting.threshold; if approved || disapproved { if approved { Self::deposit_event(RawEvent::Approved(proposal)); // execute motion, assuming it exists. if let Some(p) = >::take(&proposal) { - let ok = p.dispatch(Origin::Members(threshold).into()).is_ok(); + let origin = RawOrigin::Members(voting.threshold, seats).into(); + let ok = p.dispatch(origin).is_ok(); Self::deposit_event(RawEvent::Executed(proposal, ok)); } } else { @@ -153,22 +209,6 @@ decl_module! { } } -decl_storage! { - trait Store for Module as CouncilMotions { - /// The (hashes of) the active proposals. - pub Proposals get(proposals): Vec; - /// Actual proposal for a given hash, if it's current. - pub ProposalOf get(proposal_of): map T::Hash => Option< ::Proposal >; - /// Votes for a given proposal: (required_yes_votes, yes_voters, no_voters). - pub Voting get(voting): map T::Hash => Option<(ProposalIndex, u32, Vec, Vec)>; - /// Proposals so far. - pub ProposalCount get(proposal_count): u32; - } - add_extra_genesis { - build(|_, _, _| {}); - } -} - impl Module { pub fn is_councillor(who: &T::AccountId) -> bool { >::active_council().iter() @@ -176,24 +216,101 @@ impl Module { } } -/// Ensure that the origin `o` represents at least `n` council members. Returns -/// `Ok` or an `Err` otherwise. -pub fn ensure_council_members(o: OuterOrigin, n: u32) -> result::Result - where OuterOrigin: Into> +impl OnMembersChanged for Module { + fn on_members_changed(_new: &[T::AccountId], old: &[T::AccountId]) { + // remove accounts from all current voting in motions. + let mut old = old.to_vec(); + old.sort_unstable(); + for h in Self::proposals().into_iter() { + >::mutate(h, |v| + if let Some(mut votes) = v.take() { + votes.ayes = votes.ayes.into_iter() + .filter(|i| old.binary_search(i).is_err()) + .collect(); + votes.nays = votes.nays.into_iter() + .filter(|i| old.binary_search(i).is_err()) + .collect(); + *v = Some(votes); + } + ); + } + } +} + +/// Ensure that the origin `o` represents at least `n` council members. Returns `Ok` or an `Err` +/// otherwise. +pub fn ensure_council_members(o: OuterOrigin, n: MemberCount) + -> result::Result + where OuterOrigin: Into, OuterOrigin>> { match o.into() { - Some(Origin::Members(x)) if x >= n => Ok(n), + Ok(RawOrigin::Members(x, _)) if x >= n => Ok(n), _ => Err("bad origin: expected to be a threshold number of council members"), } } -pub struct EnsureMembers(::rstd::marker::PhantomData); -impl EnsureOrigin for EnsureMembers - where O: Into> -{ - type Success = u32; - fn ensure_origin(o: O) -> result::Result { - ensure_council_members(o, N::VALUE) +pub struct EnsureMember(::rstd::marker::PhantomData); +impl< + O: Into, O>> + From>, + AccountId +> EnsureOrigin for EnsureMember { + type Success = AccountId; + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Member(id) => Ok(id), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureMembers(::rstd::marker::PhantomData<(N, AccountId)>); +impl< + O: Into, O>> + From>, + N: U32, + AccountId, +> EnsureOrigin for EnsureMembers { + type Success = (MemberCount, MemberCount); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Members(n, m) if n >= N::VALUE => Ok((n, m)), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureProportionMoreThan( + ::rstd::marker::PhantomData<(N, D, AccountId)> +); +impl< + O: Into, O>> + From>, + N: U32, + D: U32, + AccountId, +> EnsureOrigin for EnsureProportionMoreThan { + type Success = (); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Members(n, m) if n * D::VALUE > N::VALUE * m => Ok(()), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureProportionAtLeast( + ::rstd::marker::PhantomData<(N, D, AccountId)> +); +impl< + O: Into, O>> + From>, + N: U32, + D: U32, + AccountId, +> EnsureOrigin for EnsureProportionAtLeast { + type Success = (); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Members(n, m) if n * D::VALUE >= N::VALUE * m => Ok(()), + r => Err(O::from(r)), + }) } } @@ -203,12 +320,13 @@ mod tests { use super::RawEvent; use crate::tests::*; use crate::tests::{Call, Origin, Event as OuterEvent}; + use primitives::traits::BlakeTwo256; use srml_support::{Hashable, assert_ok, assert_noop}; use system::{EventRecord, Phase}; use hex_literal::hex; #[test] - fn motions_basic_environment_works() { + fn basic_environment_works() { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); assert_eq!(Balances::free_balance(&42), 0); @@ -221,7 +339,41 @@ mod tests { } #[test] - fn motions_propose_works() { + fn removal_of_old_voters_votes_works() { + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); + let proposal = set_balance_proposal(42); + let hash = BlakeTwo256::hash_of(&proposal); + assert_ok!(CouncilMotions::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(CouncilMotions::vote(Origin::signed(2), hash.clone(), 0, true)); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 3, ayes: vec![1, 2], nays: vec![] }) + ); + CouncilMotions::on_members_changed(&[], &[1]); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 3, ayes: vec![2], nays: vec![] }) + ); + + let proposal = set_balance_proposal(69); + let hash = BlakeTwo256::hash_of(&proposal); + assert_ok!(CouncilMotions::propose(Origin::signed(2), 2, Box::new(proposal.clone()))); + assert_ok!(CouncilMotions::vote(Origin::signed(3), hash.clone(), 1, false)); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![3] }) + ); + CouncilMotions::on_members_changed(&[], &[3]); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![] }) + ); + }); + } + + #[test] + fn propose_works() { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); @@ -229,7 +381,10 @@ mod tests { assert_ok!(CouncilMotions::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); assert_eq!(CouncilMotions::proposals(), vec![hash]); assert_eq!(CouncilMotions::proposal_of(&hash), Some(proposal)); - assert_eq!(CouncilMotions::voting(&hash), Some((0, 3, vec![1], Vec::::new()))); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 3, ayes: vec![1], nays: vec![] }) + ); assert_eq!(System::events(), vec![ EventRecord { @@ -242,7 +397,7 @@ mod tests { } #[test] - fn motions_ignoring_non_council_proposals_works() { + fn ignoring_non_council_proposals_works() { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); @@ -251,7 +406,7 @@ mod tests { } #[test] - fn motions_ignoring_non_council_votes_works() { + fn ignoring_non_council_votes_works() { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); @@ -262,7 +417,7 @@ mod tests { } #[test] - fn motions_ignoring_bad_index_council_vote_works() { + fn ignoring_bad_index_council_vote_works() { with_externalities(&mut new_test_ext(true), || { System::set_block_number(3); let proposal = set_balance_proposal(42); @@ -273,16 +428,22 @@ mod tests { } #[test] - fn motions_revoting_works() { + fn revoting_works() { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); assert_ok!(CouncilMotions::propose(Origin::signed(1), 2, Box::new(proposal.clone()))); - assert_eq!(CouncilMotions::voting(&hash), Some((0, 2, vec![1], Vec::::new()))); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 2, ayes: vec![1], nays: vec![] }) + ); assert_noop!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, true), "duplicate vote ignored"); assert_ok!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, false)); - assert_eq!(CouncilMotions::voting(&hash), Some((0, 2, Vec::::new(), vec![1]))); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 2, ayes: vec![], nays: vec![1] }) + ); assert_noop!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, false), "duplicate vote ignored"); assert_eq!(System::events(), vec![ @@ -301,7 +462,7 @@ mod tests { } #[test] - fn motions_disapproval_works() { + fn disapproval_works() { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); @@ -330,7 +491,7 @@ mod tests { } #[test] - fn motions_approval_works() { + fn approval_works() { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); diff --git a/srml/council/src/seats.rs b/srml/council/src/seats.rs index fb93157981..584a2fb800 100644 --- a/srml/council/src/seats.rs +++ b/srml/council/src/seats.rs @@ -25,6 +25,7 @@ use srml_support::{ }; use democracy; use system::{self, ensure_signed}; +use super::OnMembersChanged; // no polynomial attacks: // @@ -95,6 +96,9 @@ pub trait Trait: democracy::Trait { /// Handler for the unbalanced reduction when slashing an invalid reaping attempt. type BadReaper: OnUnbalanced>; + + /// What to do when the members change. + type OnMembersChanged: OnMembersChanged; } decl_module! { @@ -269,15 +273,16 @@ decl_module! { } /// Set the desired member count; if lower than the current count, then seats will not be up - /// election when they expire. If more, then a new vote will be started if one is not already - /// in progress. + /// election when they expire. If more, then a new vote will be started if one is not + /// already in progress. fn set_desired_seats(#[compact] count: u32) { >::put(count); } - /// Remove a particular member. A tally will happen instantly (if not already in a presentation + /// Remove a particular member from the council. This is effective immediately. + /// + /// Note: A tally should happen instantly (if not already in a presentation /// period) to fill the seat if removal means that the desired members are not met. - /// This is effective immediately. fn remove_member(who: ::Source) { let who = T::Lookup::lookup(who)?; let new_council: Vec<(T::AccountId, T::BlockNumber)> = Self::active_council() @@ -285,6 +290,7 @@ decl_module! { .filter(|i| i.0 != who) .collect(); >::put(new_council); + T::OnMembersChanged::on_members_changed(&[], &[who]); } /// Set the presentation duration. If there is currently a vote being presented for, will @@ -392,6 +398,14 @@ impl Module { >::exists(who) } + /// Iff the councillor `who` still has a seat at blocknumber `n` returns `true`. + pub fn will_still_be_councillor_at(who: &T::AccountId, n: T::BlockNumber) -> bool { + Self::active_council().iter() + .find(|&&(ref a, _)| a == who) + .map(|&(_, expires)| expires > n) + .unwrap_or(false) + } + /// Determine the block that a vote can happen on which is no less than `n`. pub fn next_vote_from(n: T::BlockNumber) -> T::BlockNumber { let voting_period = Self::voting_period(); @@ -514,7 +528,7 @@ impl Module { // return bond to winners. let candidacy_bond = Self::candidacy_bond(); - let incoming: Vec = leaderboard.iter() + let incoming: Vec<_> = leaderboard.iter() .rev() .take_while(|&&(b, _)| !b.is_zero()) .take(coming as usize) @@ -523,7 +537,9 @@ impl Module { .inspect(|a| {T::Currency::unreserve(a, candidacy_bond);}) .collect(); let active_council = Self::active_council(); - let outgoing = active_council.iter().take(expiring.len()).map(|a| a.0.clone()).collect(); + let outgoing: Vec<_> = active_council.iter() + .take(expiring.len()) + .map(|a| a.0.clone()).collect(); // set the new council. let mut new_council: Vec<_> = active_council @@ -534,6 +550,8 @@ impl Module { new_council.sort_by_key(|&(_, expiry)| expiry); >::put(new_council); + T::OnMembersChanged::on_members_changed(&incoming, &outgoing); + // clear all except runners-up from candidate list. let candidates = Self::candidates(); let mut new_candidates = vec![T::AccountId::default(); candidates.len()]; // shrink later. diff --git a/srml/council/src/voting.rs b/srml/council/src/voting.rs deleted file mode 100644 index 0137cd6d2f..0000000000 --- a/srml/council/src/voting.rs +++ /dev/null @@ -1,494 +0,0 @@ -// 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 . - -//! Council voting system. - -use rstd::prelude::*; -use rstd::borrow::Borrow; -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}; -use {system, democracy}; -use super::{Trait as CouncilTrait, Module as Council}; -use system::ensure_signed; - -pub trait Trait: CouncilTrait { - type Event: From> + Into<::Event>; -} - -decl_module! { - pub struct Module for enum Call where origin: T::Origin { - fn deposit_event() = default; - - fn propose(origin, proposal: Box) { - let who = ensure_signed(origin)?; - - let expiry = >::block_number() + Self::voting_period(); - ensure!(Self::will_still_be_councillor_at(&who, expiry), "proposer would not be on council"); - - let proposal_hash = T::Hashing::hash_of(&proposal); - - ensure!(!>::exists(proposal_hash), "duplicate proposals not allowed"); - ensure!(!Self::is_vetoed(&proposal_hash), "proposal is vetoed"); - - let mut proposals = Self::proposals(); - proposals.push((expiry, proposal_hash)); - proposals.sort_by_key(|&(expiry, _)| expiry); - Self::set_proposals(&proposals); - - >::insert(proposal_hash, *proposal); - >::insert(proposal_hash, vec![who.clone()]); - >::insert((proposal_hash, who.clone()), true); - } - - fn vote(origin, proposal: T::Hash, approve: bool) { - let who = ensure_signed(origin)?; - - ensure!(Self::is_councillor(&who), "only councillors may vote on council proposals"); - - if Self::vote_of((proposal, who.clone())).is_none() { - >::mutate(proposal, |voters| voters.push(who.clone())); - } - >::insert((proposal, who), approve); - } - - fn veto(origin, proposal_hash: T::Hash) { - let who = ensure_signed(origin)?; - - ensure!(Self::is_councillor(&who), "only councillors may veto council proposals"); - ensure!(>::exists(&proposal_hash), "proposal must exist to be vetoed"); - - let mut existing_vetoers = Self::veto_of(&proposal_hash) - .map(|pair| pair.1) - .unwrap_or_else(Vec::new); - let insert_position = existing_vetoers.binary_search(&who) - .err().ok_or("a councillor may not veto a proposal twice")?; - existing_vetoers.insert(insert_position, who); - Self::set_veto_of( - &proposal_hash, - >::block_number() + Self::cooloff_period(), - existing_vetoers - ); - - Self::set_proposals( - &Self::proposals().into_iter().filter(|&(_, h)| h != proposal_hash - ).collect::>()); - >::remove(proposal_hash); - >::remove(proposal_hash); - for (c, _) in >::active_council() { - >::remove((proposal_hash, c)); - } - } - - fn set_cooloff_period(#[compact] blocks: T::BlockNumber) { - >::put(blocks); - } - - fn set_voting_period(#[compact] blocks: T::BlockNumber) { - >::put(blocks); - } - - fn on_finalize(n: T::BlockNumber) { - if let Err(e) = Self::end_block(n) { - print("Guru meditation"); - print(e); - } - } - } -} - -decl_storage! { - trait Store for Module as CouncilVoting { - 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 = 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; - pub CouncilVoteOf get(vote_of): map (T::Hash, T::AccountId) => Option; - pub VetoedProposal get(veto_of): map T::Hash => Option<(T::BlockNumber, Vec)>; - } -} - -decl_event!( - pub enum Event where ::Hash { - /// A voting tally has happened for a referendum cancellation vote. - /// Last three are yes, no, abstain counts. - TallyCancelation(Hash, u32, u32, u32), - /// A voting tally has happened for a referendum vote. - /// Last three are yes, no, abstain counts. - TallyReferendum(Hash, u32, u32, u32), - } -); - -impl Module { - pub fn is_vetoed>(proposal: B) -> bool { - Self::veto_of(proposal.borrow()) - .map(|(expiry, _): (T::BlockNumber, Vec)| >::block_number() < expiry) - .unwrap_or(false) - } - - pub fn will_still_be_councillor_at(who: &T::AccountId, n: T::BlockNumber) -> bool { - >::active_council().iter() - .find(|&&(ref a, _)| a == who) - .map(|&(_, expires)| expires > n) - .unwrap_or(false) - } - - pub fn is_councillor(who: &T::AccountId) -> bool { - >::active_council().iter() - .any(|&(ref a, _)| a == who) - } - - pub fn tally(proposal_hash: &T::Hash) -> (u32, u32, u32) { - Self::generic_tally(proposal_hash, |w: &T::AccountId, p: &T::Hash| Self::vote_of((*p, w.clone()))) - } - - // Private - fn set_veto_of(proposal: &T::Hash, expiry: T::BlockNumber, vetoers: Vec) { - >::insert(proposal, (expiry, vetoers)); - } - - fn kill_veto_of(proposal: &T::Hash) { - >::remove(proposal); - } - - fn take_tally(proposal_hash: &T::Hash) -> (u32, u32, u32) { - Self::generic_tally(proposal_hash, |w: &T::AccountId, p: &T::Hash| >::take((*p, w.clone()))) - } - - fn generic_tally Option>(proposal_hash: &T::Hash, vote_of: F) -> (u32, u32, u32) { - let c = >::active_council(); - let (approve, reject) = c.iter() - .filter_map(|&(ref a, _)| vote_of(a, proposal_hash)) - .map(|approve| if approve { (1, 0) } else { (0, 1) }) - .fold((0, 0), |(a, b), (c, d)| (a + c, b + d)); - (approve, reject, c.len() as u32 - approve - reject) - } - - fn set_proposals(p: &Vec<(T::BlockNumber, T::Hash)>) { - >::put(p); - } - - fn take_proposal_if_expiring_at(n: T::BlockNumber) -> Option<(T::Proposal, T::Hash)> { - let proposals = Self::proposals(); - match proposals.first() { - Some(&(expiry, hash)) if expiry == n => { - // yes this is horrible, but fixing it will need substantial work in storage. - Self::set_proposals(&proposals[1..].to_vec()); - >::take(hash).map(|p| (p, hash)) /* defensive only: all queued proposal hashes must have associated proposals*/ - } - _ => None, - } - } - - fn end_block(now: T::BlockNumber) -> Result { - while let Some((proposal, proposal_hash)) = Self::take_proposal_if_expiring_at(now) { - let tally = Self::take_tally(&proposal_hash); - if let Some(&democracy::Call::cancel_referendum(ref_index)) = IsSubType::>::is_aux_sub_type(&proposal) { - Self::deposit_event(RawEvent::TallyCancelation(proposal_hash, tally.0, tally.1, tally.2)); - if let (_, 0, 0) = tally { - >::internal_cancel_referendum(ref_index.into()); - } - } else { - Self::deposit_event(RawEvent::TallyReferendum(proposal_hash.clone(), tally.0, tally.1, tally.2)); - if tally.0 > tally.1 + tally.2 { - Self::kill_veto_of(&proposal_hash); - // If there were no nay-votes from the council, then it's weakly uncontroversial; we enact immediately. - let period = match tally.1 { - 0 => Zero::zero(), - _ => Self::enact_delay_period(), - }; - // If all council members voted yes, then it's strongly uncontroversial; we require a negative - // super-majority at referendum in order to defeat it. - let threshold = match tally { - (_, 0, 0) => democracy::VoteThreshold::SuperMajorityAgainst, - _ => democracy::VoteThreshold::SimpleMajority, - }; - >::internal_start_referendum(proposal, threshold, period).map(|_| ())?; - } - } - } - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::tests::*; - use crate::tests::{Call, Origin}; - use srml_support::{Hashable, assert_ok, assert_noop}; - use democracy::{ReferendumInfo, VoteThreshold}; - - #[test] - fn basic_environment_works() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - assert_eq!(Balances::free_balance(&42), 0); - assert_eq!(CouncilVoting::cooloff_period(), 2); - assert_eq!(CouncilVoting::voting_period(), 1); - assert_eq!(CouncilVoting::will_still_be_councillor_at(&1, 1), true); - assert_eq!(CouncilVoting::will_still_be_councillor_at(&1, 10), false); - assert_eq!(CouncilVoting::will_still_be_councillor_at(&4, 10), false); - assert_eq!(CouncilVoting::is_councillor(&1), true); - assert_eq!(CouncilVoting::is_councillor(&4), false); - assert_eq!(CouncilVoting::proposals(), Vec::<(u64, H256)>::new()); - assert_eq!(CouncilVoting::proposal_voters(H256::default()), Vec::::new()); - assert_eq!(CouncilVoting::is_vetoed(&H256::default()), false); - assert_eq!(CouncilVoting::vote_of((H256::default(), 1)), None); - assert_eq!(CouncilVoting::tally(&H256::default()), (0, 0, 3)); - }); - } - - fn set_balance_proposal(value: u64) -> Call { - Call::Balances(balances::Call::set_balance(42, value.into(), 0)) - } - - fn cancel_referendum_proposal(id: u32) -> Call { - Call::Democracy(democracy::Call::cancel_referendum(id.into())) - } - - #[test] - fn referendum_cancellation_should_work_when_unanimous() { - with_externalities(&mut new_test_ext(true), || { - 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_referenda(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, true)); - assert_eq!(CouncilVoting::proposals(), vec![(2, hash)]); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referenda(), vec![]); - assert_eq!(Balances::free_balance(&42), 0); - }); - } - - #[test] - fn referendum_cancellation_should_fail_when_not_unanimous() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove, 0), 0); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, false)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); - }); - } - - #[test] - fn referendum_cancellation_should_fail_when_abstentions() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove, 0), 0); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); - }); - } - - #[test] - fn veto_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - 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_referenda().len(), 0); - }); - } - - #[test] - fn double_veto_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(3); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_noop!(CouncilVoting::veto(Origin::signed(2), hash), "a councillor may not veto a proposal twice"); - }); - } - - #[test] - fn retry_in_cooloff_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(2); - assert_noop!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone())), "proposal is vetoed"); - }); - } - - #[test] - fn retry_after_cooloff_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(3); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, false)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, true)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(4); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(7, set_balance_proposal(42), VoteThreshold::SimpleMajority, 0))]); - }); - } - - #[test] - fn alternative_double_veto_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(3); - 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_referenda().len(), 0); - }); - } - - #[test] - fn simple_propose_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_eq!(CouncilVoting::proposals().len(), 1); - assert_eq!(CouncilVoting::proposal_voters(&hash), vec![1]); - assert_eq!(CouncilVoting::vote_of((hash, 1)), Some(true)); - assert_eq!(CouncilVoting::tally(&hash), (1, 0, 2)); - }); - } - - #[test] - fn unvoted_proposal_should_expire_without_action() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (1, 0, 2)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referenda().len(), 0); - }); - } - - #[test] - fn unanimous_proposal_should_expire_with_biased_referendum() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), proposal.blake2_256().into(), true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), proposal.blake2_256().into(), true)); - assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (3, 0, 0)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(5, proposal, VoteThreshold::SuperMajorityAgainst, 0))]); - }); - } - - #[test] - fn majority_proposal_should_expire_with_unbiased_referendum() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), proposal.blake2_256().into(), true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), proposal.blake2_256().into(), false)); - assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (2, 1, 0)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(5, proposal, VoteThreshold::SimpleMajority, 0))]); - }); - } - - #[test] - fn propose_by_public_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_noop!(CouncilVoting::propose(Origin::signed(4), Box::new(proposal)), "proposer would not be on council"); - }); - } - - #[test] - fn vote_by_public_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_noop!(CouncilVoting::vote(Origin::signed(4), proposal.blake2_256().into(), true), "only councillors may vote on council proposals"); - }); - } -} diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 1846f3462d..96d51849c9 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -20,7 +20,7 @@ use rstd::prelude::*; use rstd::{result, convert::TryFrom}; -use primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv}; +use primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv, EnsureOrigin, Hash}; use parity_codec::{Encode, Decode, Input, Output}; use srml_support::{ decl_module, decl_storage, decl_event, ensure, @@ -31,7 +31,7 @@ use srml_support::{ } }; use srml_support::dispatch::Result; -use system::ensure_signed; +use system::{ensure_signed, ensure_root}; mod vote_threshold; pub use vote_threshold::{Approved, VoteThreshold}; @@ -188,6 +188,29 @@ pub trait Trait: system::Trait + Sized { /// The minimum amount to be used as a deposit for a public referendum proposal. type MinimumDeposit: Get>; + + /// Origin from which the next tabled referendum may be forced. This is a normal + /// "super-majority-required" referendum. + type ExternalOrigin: EnsureOrigin; + + /// Origin from which the next tabled referendum may be forced; this allows for the tabling of + /// a majority-carries referendum. + type ExternalMajorityOrigin: EnsureOrigin; + + /// Origin from which emergency referenda may be scheduled. + type EmergencyOrigin: EnsureOrigin; + + /// Minimum voting period allowed for an emergency referendum. + type EmergencyVotingPeriod: Get; + + /// Origin from which any referenda may be cancelled in an emergency. + type CancellationOrigin: EnsureOrigin; + + /// Origin for anyone able to veto proposals. + type VetoOrigin: EnsureOrigin; + + /// Period in blocks where an external proposal may not be re-submitted after being vetoed. + type CooloffPeriod: Get; } /// Info regarding an ongoing referendum. @@ -252,13 +275,36 @@ decl_storage! { /// Get the account (and lock periods) to which another account is delegating vote. pub Delegations get(delegations): linked_map T::AccountId => (T::AccountId, Conviction); + + /// True if the last referendum tabled was submitted externally. False if it was a public + /// proposal. + pub LastTabledWasExternal: bool; + + /// The referendum to be tabled whenever it would be valid to table an external proposal. + /// This happens when a referendum needs to be tabled and one of two conditions are met: + /// - `LastTabledWasExternal` is `false`; or + /// - `PublicProps` is empty. + pub NextExternal: Option<(T::Proposal, VoteThreshold)>; + + /// A record of who vetoed what. Maps proposal hash to a possible existent block number + /// (until when it may not be resubmitted) and who vetoed it. + pub Blacklist get(blacklist): map T::Hash => Option<(T::BlockNumber, Vec)>; + + /// Record of all proposals that have been subject to emergency cancellation. + pub Cancellations: map T::Hash => bool; } } decl_event!( - pub enum Event where Balance = BalanceOf, ::AccountId { + pub enum Event where + Balance = BalanceOf, + ::AccountId, + ::Hash, + ::BlockNumber, + { Proposed(PropIndex, Balance), Tabled(PropIndex, Balance, Vec), + ExternalTabled, Started(ReferendumIndex, VoteThreshold), Passed(ReferendumIndex), NotPassed(ReferendumIndex), @@ -266,6 +312,7 @@ decl_event!( Executed(ReferendumIndex, bool), Delegated(AccountId, AccountId), Undelegated(AccountId), + Vetoed(AccountId, Hash, BlockNumber), } ); @@ -274,8 +321,7 @@ decl_module! { fn deposit_event() = default; /// Propose a sensitive action to be taken. - fn propose( - origin, + fn propose(origin, proposal: Box, #[compact] value: BalanceOf ) { @@ -307,7 +353,7 @@ decl_module! { >::insert(proposal, deposit); } - /// Vote in a referendum. If vote is aye, the vote is to enact the proposal; + /// Vote in a referendum. If `vote.is_aye()`, the vote is to enact the proposal; /// otherwise it is a vote to keep the status quo. fn vote(origin, #[compact] ref_index: ReferendumIndex, @@ -317,8 +363,8 @@ decl_module! { Self::do_vote(who, ref_index, vote) } - /// Vote in a referendum on behalf of a stash. If vote is aye, the vote is to enact - /// the proposal; otherwise it is a vote to keep the status quo. + /// Vote in a referendum on behalf of a stash. If `vote.is_aye()`, the vote is to enact + /// the proposal; otherwise it is a vote to keep the status quo. fn proxy_vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote @@ -327,18 +373,95 @@ decl_module! { Self::do_vote(who, ref_index, vote) } - /// Start a referendum. - fn start_referendum( + /// Schedule an emergency referendum. + /// + /// This will create a new referendum for the `proposal`, approved as long as counted votes + /// exceed `threshold` and, if approved, enacted after the given `delay`. + /// + /// It may be called from either the Root or the Emergency origin. + fn emergency_propose(origin, proposal: Box, threshold: VoteThreshold, + voting_period: T::BlockNumber, delay: T::BlockNumber - ) -> Result { + ) { + T::EmergencyOrigin::try_origin(origin) + .map(|_| ()) + .or_else(|origin| ensure_root(origin))?; + let now = >::block_number(); + // We don't consider it an error if `vote_period` is too low, but we do enforce the + // minimum. This is primarily due to practicality. If it's an emergency, we don't want + // to introduce more delays than is strictly needed by requiring a potentially costly + // resubmission in the case of a mistakenly low `vote_period`; better to just let the + // referendum take place with the lowest valid value. + let period = voting_period.max(T::EmergencyVotingPeriod::get()); Self::inject_referendum( - >::block_number() + T::VotingPeriod::get(), + now + period, *proposal, threshold, delay, - ).map(|_| ()) + ).map(|_| ())?; + } + + /// Schedule an emergency cancellation of a referendum. Cannot happen twice to the same + /// referendum. + fn emergency_cancel(origin, ref_index: ReferendumIndex) { + T::CancellationOrigin::ensure_origin(origin)?; + + let info = Self::referendum_info(ref_index).ok_or("unknown index")?; + let h = T::Hashing::hash_of(&info.proposal); + ensure!(!>::exists(h), "cannot cancel the same proposal twice"); + + >::insert(h, true); + Self::clear_referendum(ref_index); + } + + /// Schedule a referendum to be tabled once it is legal to schedule an external + /// referendum. + fn external_propose(origin, proposal: Box) { + T::ExternalOrigin::ensure_origin(origin)?; + ensure!(!>::exists(), "proposal already made"); + let proposal_hash = T::Hashing::hash_of(&proposal); + if let Some((until, _)) = >::get(proposal_hash) { + ensure!(>::block_number() >= until, "proposal still blacklisted"); + } + >::put((*proposal, VoteThreshold::SuperMajorityApprove)); + } + + /// Schedule a majority-carries referendum to be tabled next once it is legal to schedule + /// an external referendum. + fn external_propose_majority(origin, proposal: Box) { + T::ExternalMajorityOrigin::ensure_origin(origin)?; + ensure!(!>::exists(), "proposal already made"); + let proposal_hash = T::Hashing::hash_of(&proposal); + if let Some((until, _)) = >::get(proposal_hash) { + ensure!(>::block_number() >= until, "proposal still blacklisted"); + } + >::put((*proposal, VoteThreshold::SimpleMajority)); + } + + /// Veto and blacklist the external proposal hash. + fn veto_external(origin, proposal_hash: T::Hash) { + let who = T::VetoOrigin::ensure_origin(origin)?; + + if let Some((proposal, _)) = >::get() { + ensure!(proposal_hash == T::Hashing::hash_of(&proposal), "unknown proposal"); + } else { + Err("no external proposal")?; + } + + let mut existing_vetoers = >::get(&proposal_hash) + .map(|pair| pair.1) + .unwrap_or_else(Vec::new); + let insert_position = existing_vetoers.binary_search(&who) + .err().ok_or("identity may not veto a proposal twice")?; + + existing_vetoers.insert(insert_position, who.clone()); + let until = >::block_number() + T::CooloffPeriod::get(); + >::insert(&proposal_hash, (until, existing_vetoers)); + + Self::deposit_event(RawEvent::Vetoed(who, proposal_hash, until)); + >::kill(); } /// Remove a referendum. @@ -347,12 +470,19 @@ decl_module! { } /// Cancel a proposal queued for enactment. - pub fn cancel_queued(#[compact] when: T::BlockNumber, #[compact] which: u32) { + fn cancel_queued( + #[compact] when: T::BlockNumber, + #[compact] which: u32, + #[compact] what: ReferendumIndex + ) { let which = which as usize; - >::mutate( - when, - |items| if items.len() > which { items[which] = None } - ); + let mut items = >::get(when); + if items.get(which).and_then(Option::as_ref).map_or(false, |x| x.1 == what) { + items[which] = None; + >::insert(when, items); + } else { + Err("proposal not found")? + } } fn on_finalize(n: T::BlockNumber) { @@ -603,7 +733,34 @@ impl Module { Self::deposit_event(RawEvent::Executed(index, ok)); } + /// Table the next waiting proposal for a vote. fn launch_next(now: T::BlockNumber) -> Result { + if >::take() { + Self::launch_public(now).or_else(|_| Self::launch_external(now)) + } else { + Self::launch_external(now).or_else(|_| Self::launch_public(now)) + }.map_err(|_| "No proposals waiting") + } + + /// Table the waiting external proposal for a vote, if there is one. + fn launch_external(now: T::BlockNumber) -> Result { + if let Some((proposal, threshold)) = >::take() { + >::put(true); + Self::deposit_event(RawEvent::ExternalTabled); + Self::inject_referendum( + now + T::VotingPeriod::get(), + proposal, + threshold, + T::EnactmentPeriod::get(), + )?; + Ok(()) + } else { + Err("No external proposal waiting") + } + } + + /// Table the waiting public proposal with the highest backing for a vote. + fn launch_public(now: T::BlockNumber) -> Result { let mut public_props = Self::public_props(); if let Some((winner_index, _)) = public_props.iter() .enumerate() @@ -626,9 +783,11 @@ impl Module { T::EnactmentPeriod::get(), )?; } + Ok(()) + } else { + Err("No public proposals waiting") } - Ok(()) } fn bake_referendum( @@ -682,11 +841,13 @@ impl Module { } /// Current era is ending; we should finish up any proposals. - // TODO: move to `initialize_block + // TODO: move to initialize_block #2779 fn end_block(now: T::BlockNumber) -> Result { // pick out another public referendum if it's time. if (now % T::LaunchPeriod::get()).is_zero() { - Self::launch_next(now.clone())?; + // Errors come from the queue being empty. we don't really care about that, and even if + // we did, there is nothing we can do here. + let _ = Self::launch_next(now.clone()); } // tally up votes for any expiring referenda. @@ -712,13 +873,15 @@ mod tests { use super::*; use runtime_io::with_externalities; use srml_support::{ - impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok, parameter_types + impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok, parameter_types, + traits::Contains }; use substrate_primitives::{H256, Blake2Hasher}; use primitives::BuildStorage; use primitives::traits::{BlakeTwo256, IdentityLookup, Bounded}; use primitives::testing::{Digest, DigestItem, Header}; use balances::BalanceLock; + use system::EnsureSignedBy; const AYE: Vote = Vote{ aye: true, conviction: Conviction::None }; const NAY: Vote = Vote{ aye: false, conviction: Conviction::None }; @@ -762,19 +925,39 @@ mod tests { type DustRemoval = (); } parameter_types! { - pub const LaunchPeriod: u64 = 1; - pub const VotingPeriod: u64 = 1; + pub const LaunchPeriod: u64 = 2; + pub const VotingPeriod: u64 = 2; + pub const EmergencyVotingPeriod: u64 = 1; pub const MinimumDeposit: u64 = 1; - pub const EnactmentPeriod: u64 = 1; + pub const EnactmentPeriod: u64 = 2; + pub const CooloffPeriod: u64 = 2; + pub const One: u64 = 1; + pub const Two: u64 = 2; + pub const Three: u64 = 3; + pub const Four: u64 = 4; + pub const Five: u64 = 5; + } + pub struct OneToFive; + impl Contains for OneToFive { + fn contains(n: &u64) -> bool { + *n >= 1 && *n <= 5 + } } - impl Trait for Test { + impl super::Trait for Test { type Proposal = Call; type Event = (); type Currency = balances::Module; type EnactmentPeriod = EnactmentPeriod; type LaunchPeriod = LaunchPeriod; type VotingPeriod = VotingPeriod; + type EmergencyVotingPeriod = EmergencyVotingPeriod; type MinimumDeposit = MinimumDeposit; + type EmergencyOrigin = EnsureSignedBy; + type ExternalOrigin = EnsureSignedBy; + type ExternalMajorityOrigin = EnsureSignedBy; + type CancellationOrigin = EnsureSignedBy; + type VetoOrigin = EnsureSignedBy; + type CooloffPeriod = CooloffPeriod; } fn new_test_ext() -> runtime_io::TestExternalities { @@ -806,13 +989,14 @@ mod tests { } fn set_balance_proposal(value: u64) -> Call { - Call::Balances(balances::Call::set_balance(42, value.into(), 0)) + Call::Balances(balances::Call::set_balance(42, value, 0)) } - fn propose_set_balance(who: u64, value: u64, locked: u64) -> super::Result { + fn propose_set_balance(who: u64, value: u64, delay: u64) -> super::Result { Democracy::propose( Origin::signed(who), - Box::new(set_balance_proposal(value)), locked.into() + Box::new(set_balance_proposal(value)), + delay ) } @@ -821,6 +1005,326 @@ mod tests { System::set_block_number(System::block_number() + 1); } + fn fast_forward_to(n: u64) { + while System::block_number() < n { + next_block(); + } + } + + #[test] + fn external_and_public_interleaving_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(1)), + )); + assert_ok!(propose_set_balance(6, 2, 2)); + + fast_forward_to(1); + + // both waiting: external goes first. + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(1), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish external + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(3)), + )); + + fast_forward_to(3); + + // both waiting: public goes next. + assert_eq!( + Democracy::referendum_info(1), + Some(ReferendumInfo { + end: 4, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // don't replenish public + + fast_forward_to(5); + + // it's external "turn" again, though since public is empty that doesn't really matter + assert_eq!( + Democracy::referendum_info(2), + Some(ReferendumInfo { + end: 6, + proposal: set_balance_proposal(3), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish external + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(5)), + )); + + fast_forward_to(7); + + // external goes again because there's no public waiting. + assert_eq!( + Democracy::referendum_info(3), + Some(ReferendumInfo { + end: 8, + proposal: set_balance_proposal(5), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish both + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(7)), + )); + assert_ok!(propose_set_balance(6, 4, 2)); + + fast_forward_to(9); + + // public goes now since external went last time. + assert_eq!( + Democracy::referendum_info(4), + Some(ReferendumInfo { + end: 10, + proposal: set_balance_proposal(4), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish public again + assert_ok!(propose_set_balance(6, 6, 2)); + // cancel external + let h = BlakeTwo256::hash_of(&set_balance_proposal(7)); + assert_ok!(Democracy::veto_external(Origin::signed(3), h)); + + fast_forward_to(11); + + // public goes again now since there's no external waiting. + assert_eq!( + Democracy::referendum_info(5), + Some(ReferendumInfo { + end: 12, + proposal: set_balance_proposal(6), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + }); + } + + + #[test] + fn emergency_cancel_should_work() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + let r = Democracy::inject_referendum( + 2, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 2 + ).unwrap(); + assert!(Democracy::referendum_info(r).is_some()); + + assert_noop!(Democracy::emergency_cancel(Origin::signed(3), r), "Invalid origin"); + assert_ok!(Democracy::emergency_cancel(Origin::signed(4), r)); + assert!(Democracy::referendum_info(r).is_none()); + + // some time later... + + let r = Democracy::inject_referendum( + 2, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 2 + ).unwrap(); + assert!(Democracy::referendum_info(r).is_some()); + assert_noop!(Democracy::emergency_cancel(Origin::signed(4), r), "cannot cancel the same proposal twice"); + }); + } + + #[test] + fn veto_external_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + )); + assert!(>::exists()); + + let h = BlakeTwo256::hash_of(&set_balance_proposal(2)); + assert_ok!(Democracy::veto_external(Origin::signed(3), h.clone())); + // cancelled. + assert!(!>::exists()); + // fails - same proposal can't be resubmitted. + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + ), "proposal still blacklisted"); + + fast_forward_to(1); + // fails as we're still in cooloff period. + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + ), "proposal still blacklisted"); + + fast_forward_to(2); + // works; as we're out of the cooloff period. + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + )); + assert!(>::exists()); + + // 3 can't veto the same thing twice. + assert_noop!( + Democracy::veto_external(Origin::signed(3), h.clone()), + "identity may not veto a proposal twice" + ); + + // 4 vetoes. + assert_ok!(Democracy::veto_external(Origin::signed(4), h.clone())); + // cancelled again. + assert!(!>::exists()); + + fast_forward_to(3); + // same proposal fails as we're still in cooloff + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + ), "proposal still blacklisted"); + // different proposal works fine. + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(3)), + )); + }); + } + + #[test] + fn emergency_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::emergency_propose( + Origin::signed(6), // invalid + Box::new(set_balance_proposal(2)), + VoteThreshold::SuperMajorityAgainst, + 0, + 0, + ), "bad origin: expected to be a root origin"); + assert_ok!(Democracy::emergency_propose( + Origin::signed(1), + Box::new(set_balance_proposal(2)), + VoteThreshold::SuperMajorityAgainst, + 0, + 0, + )); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 1, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityAgainst, + delay: 0 + }) + ); + + assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); + fast_forward_to(1); + assert_eq!(Balances::free_balance(&42), 0); + fast_forward_to(2); + assert_eq!(Balances::free_balance(&42), 2); + + assert_ok!(Democracy::emergency_propose( + Origin::signed(1), + Box::new(set_balance_proposal(4)), + VoteThreshold::SuperMajorityAgainst, + 3, + 3 + )); + assert_eq!( + Democracy::referendum_info(1), + Some(ReferendumInfo { + end: 5, + proposal: set_balance_proposal(4), + threshold: VoteThreshold::SuperMajorityAgainst, + delay: 3 + }) + ); + assert_ok!(Democracy::vote(Origin::signed(1), 1, AYE)); + fast_forward_to(8); + assert_eq!(Balances::free_balance(&42), 2); + fast_forward_to(9); + assert_eq!(Balances::free_balance(&42), 4); + }); + } + + #[test] + fn external_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::external_propose( + Origin::signed(1), + Box::new(set_balance_proposal(2)), + ), "Invalid origin"); + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + )); + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(1)), + ), "proposal already made"); + fast_forward_to(1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + }); + } + + #[test] + fn external_majority_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::external_propose_majority( + Origin::signed(1), + Box::new(set_balance_proposal(2)) + ), "Invalid origin"); + assert_ok!(Democracy::external_propose_majority( + Origin::signed(3), + Box::new(set_balance_proposal(2)) + )); + fast_forward_to(1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SimpleMajority, + delay: 2, + }) + ); + }); + } + #[test] fn locked_for_should_work() { with_externalities(&mut new_test_ext(), || { @@ -837,25 +1341,74 @@ mod tests { #[test] fn single_proposal_should_work() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert!(Democracy::referendum_info(0).is_none()); + + // end of 0 => next referendum scheduled. + fast_forward_to(1); - System::set_block_number(2); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_eq!(Democracy::referendum_count(), 1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); assert_eq!(Democracy::tally(r), (1, 0, 1)); - next_block(); - next_block(); + fast_forward_to(2); + + // referendum still running + assert!(Democracy::referendum_info(0).is_some()); + + // referendum runs during 1 and 2, ends @ end of 2. + fast_forward_to(3); + + assert!(Democracy::referendum_info(0).is_none()); + assert_eq!(Democracy::dispatch_queue(4), vec![ + Some((set_balance_proposal(2), 0)) + ]); + + // referendum passes and wait another two blocks for enactment. + fast_forward_to(5); + assert_eq!(Balances::free_balance(&42), 2); }); } + #[test] + fn cancel_queued_should_work() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_ok!(propose_set_balance(1, 2, 1)); + + // end of 0 => next referendum scheduled. + fast_forward_to(1); + + assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); + + fast_forward_to(3); + + assert_eq!(Democracy::dispatch_queue(4), vec![ + Some((set_balance_proposal(2), 0)) + ]); + + assert_noop!(Democracy::cancel_queued(3, 0, 0), "proposal not found"); + assert_noop!(Democracy::cancel_queued(4, 1, 0), "proposal not found"); + assert_ok!(Democracy::cancel_queued(4, 0, 0)); + assert_eq!(Democracy::dispatch_queue(4), vec![None]); + }); + } + #[test] fn proxy_should_work() { with_externalities(&mut new_test_ext(), || { @@ -889,22 +1442,19 @@ mod tests { #[test] fn single_proposal_should_work_with_proxy() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + fast_forward_to(1); let r = 0; assert_ok!(Democracy::set_proxy(Origin::signed(1), 10)); assert_ok!(Democracy::proxy_vote(Origin::signed(10), r, AYE)); - assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); assert_eq!(Democracy::tally(r), (1, 0, 1)); - next_block(); - next_block(); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); } @@ -912,27 +1462,23 @@ mod tests { #[test] fn single_proposal_should_work_with_delegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - next_block(); - let r = 0; + fast_forward_to(1); // Delegate vote. assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); + let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - - assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - // Delegated vote is counted. assert_eq!(Democracy::tally(r), (3, 0, 3)); - next_block(); - next_block(); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -941,27 +1487,24 @@ mod tests { #[test] fn single_proposal_should_work_with_cyclic_delegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - next_block(); - let r = 0; + fast_forward_to(1); // Check behavior with cycle. assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); assert_ok!(Democracy::delegate(Origin::signed(3), 2, Conviction::max_value())); assert_ok!(Democracy::delegate(Origin::signed(1), 3, Conviction::max_value())); - + let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - - assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); // Delegated vote is counted. assert_eq!(Democracy::tally(r), (6, 0, 6)); - next_block(); - next_block(); + + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -971,30 +1514,24 @@ mod tests { /// If transactor already voted, delegated vote is overwriten. fn single_proposal_should_work_with_vote_and_delegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - next_block(); - let r = 0; + fast_forward_to(1); + let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - // Vote. assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); - // Delegate vote. assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); - - assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1, 2]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - // Delegated vote is not counted. assert_eq!(Democracy::tally(r), (3, 0, 3)); - next_block(); - next_block(); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -1003,7 +1540,7 @@ mod tests { #[test] fn single_proposal_should_work_with_undelegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); @@ -1011,7 +1548,7 @@ mod tests { assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); assert_ok!(Democracy::undelegate(Origin::signed(2))); - next_block(); + fast_forward_to(1); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); @@ -1022,8 +1559,7 @@ mod tests { // Delegated vote is not counted. assert_eq!(Democracy::tally(r), (1, 0, 1)); - next_block(); - next_block(); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -1033,11 +1569,11 @@ mod tests { /// If transactor voted, delegated vote is overwriten. fn single_proposal_should_work_with_delegation_and_vote() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - next_block(); + fast_forward_to(1); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); @@ -1055,8 +1591,7 @@ mod tests { // Delegated vote is not counted. assert_eq!(Democracy::tally(r), (3, 0, 3)); - next_block(); - next_block(); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -1086,7 +1621,7 @@ mod tests { assert_ok!(Democracy::second(Origin::signed(5), 0)); assert_ok!(Democracy::second(Origin::signed(5), 0)); assert_ok!(Democracy::second(Origin::signed(5), 0)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(3); assert_eq!(Balances::free_balance(&1), 10); assert_eq!(Balances::free_balance(&2), 20); assert_eq!(Balances::free_balance(&5), 50); @@ -1125,11 +1660,11 @@ mod tests { assert_ok!(propose_set_balance(1, 2, 2)); assert_ok!(propose_set_balance(1, 4, 4)); assert_ok!(propose_set_balance(1, 3, 3)); - next_block(); + fast_forward_to(1); assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); - next_block(); + fast_forward_to(3); assert_ok!(Democracy::vote(Origin::signed(1), 1, AYE)); - next_block(); + fast_forward_to(5); assert_ok!(Democracy::vote(Origin::signed(1), 2, AYE)); }); } @@ -1305,7 +1840,7 @@ mod tests { #[test] fn lock_voting_should_work() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); let r = Democracy::inject_referendum( 1, set_balance_proposal(2), @@ -1335,31 +1870,29 @@ mod tests { assert_eq!(Democracy::tally(r), (250, 100, 150)); - next_block(); + fast_forward_to(2); assert_eq!(Balances::locks(1), vec![]); assert_eq!(Balances::locks(2), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), - until: 9, + until: 17, reasons: WithdrawReason::Transfer.into() }]); assert_eq!(Balances::locks(3), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), - until: 5, + until: 9, reasons: WithdrawReason::Transfer.into() }]); assert_eq!(Balances::locks(4), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), - until: 3, + until: 5, reasons: WithdrawReason::Transfer.into() }]); assert_eq!(Balances::locks(5), vec![]); - next_block(); - assert_eq!(Balances::free_balance(&42), 2); }); } @@ -1395,28 +1928,6 @@ mod tests { assert_eq!(Democracy::tally(r), (250, 100, 150)); next_block(); - - assert_eq!(Balances::locks(1), vec![]); - assert_eq!(Balances::locks(2), vec![BalanceLock { - id: DEMOCRACY_ID, - amount: u64::max_value(), - until: 9, - reasons: WithdrawReason::Transfer.into() - }]); - assert_eq!(Balances::locks(3), vec![BalanceLock { - id: DEMOCRACY_ID, - amount: u64::max_value(), - until: 5, - reasons: WithdrawReason::Transfer.into() - }]); - assert_eq!(Balances::locks(4), vec![BalanceLock { - id: DEMOCRACY_ID, - amount: u64::max_value(), - until: u64::max_value(), - reasons: WithdrawReason::Transfer.into() - }]); - assert_eq!(Balances::locks(5), vec![]); - next_block(); assert_eq!(Balances::free_balance(&42), 2); diff --git a/srml/support/src/metadata.rs b/srml/support/src/metadata.rs index b1da7587be..ed3e443afd 100644 --- a/srml/support/src/metadata.rs +++ b/srml/support/src/metadata.rs @@ -246,7 +246,8 @@ mod tests { mod system { pub trait Trait { - type Origin: Into>> + From>; + type Origin: Into, Self::Origin>> + + From>; type AccountId; type BlockNumber; } diff --git a/srml/support/src/origin.rs b/srml/support/src/origin.rs index 48d4be80c6..9bc2cab8b9 100644 --- a/srml/support/src/origin.rs +++ b/srml/support/src/origin.rs @@ -112,12 +112,12 @@ macro_rules! impl_outer_origin { $name::system(x) } } - impl Into>> for $name { - fn into(self) -> Option<$system::Origin<$runtime>> { + impl Into<$crate::rstd::result::Result<$system::Origin<$runtime>, $name>> for $name { + fn into(self) -> $crate::rstd::result::Result<$system::Origin<$runtime>, Self> { if let $name::system(l) = self { - Some(l) + Ok(l) } else { - None + Err(self) } } } @@ -132,12 +132,18 @@ macro_rules! impl_outer_origin { $name::$module(x) } } - impl Into )*>> for $name { - fn into(self) -> Option<$module::Origin $( <$generic_param $(, $generic_instance )? > )*> { + impl Into<$crate::rstd::result::Result< + $module::Origin $( <$generic_param $(, $generic_instance )? > )*, + $name + >> for $name { + fn into(self) -> $crate::rstd::result::Result< + $module::Origin $( <$generic_param $(, $generic_instance )? > )*, + Self + > { if let $name::$module(l) = self { - Some(l) + Ok(l) } else { - None + Err(self) } } } diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index 599de27c2e..3b3c63e223 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -26,12 +26,26 @@ use crate::runtime_primitives::traits::{ use super::for_each_tuple; -/// New trait for querying a single fixed value from a type. +/// A trait for querying a single fixed value from a type. pub trait Get { /// Return a constant value. fn get() -> T; } +/// A trait for querying whether a type can be said to statically "contain" a value. Similar +/// in nature to `Get`, except it is designed to be lazy rather than active (you can't ask it to +/// enumerate all values that it contains) and work for multiple values rather than just one. +pub trait Contains { + /// Return `true` if this "contains" the given value `t`. + fn contains(t: &T) -> bool; +} + +impl> Contains for T { + fn contains(t: &V) -> bool { + &Self::get() == t + } +} + /// The account with the given id was killed. pub trait OnFreeBalanceZero { /// The account was the given id was killed. diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index 641ad9f4b5..796934777d 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -39,7 +39,8 @@ mod system { use super::*; pub trait Trait: 'static + Eq + Clone { - type Origin: Into>> + From>; + type Origin: Into, Self::Origin>> + + From>; type BlockNumber; type Digest: Digest; type Hash; @@ -100,12 +101,9 @@ mod system { } pub fn ensure_root(o: OuterOrigin) -> Result<(), &'static str> - where OuterOrigin: Into>> + where OuterOrigin: Into, OuterOrigin>> { - match o.into() { - Some(RawOrigin::Root) => Ok(()), - _ => Err("bad origin: expected to be a root origin"), - } + o.into().map(|_| ()).map_err(|_| "bad origin: expected to be a root origin") } } diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index 5a3094d821..b08321f860 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -78,14 +78,14 @@ use rstd::prelude::*; use rstd::map; use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, One, Bounded, Lookup, Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, CurrentHeight, BlockNumberToHash, - MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, + MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup }; #[cfg(any(feature = "std", test))] use primitives::traits::Zero; use substrate_primitives::storage::well_known_keys; use srml_support::{ storage, decl_module, decl_event, decl_storage, StorageDoubleMap, StorageValue, - StorageMap, Parameter, for_each_tuple, + StorageMap, Parameter, for_each_tuple, traits::Contains }; use safe_mix::TripletMix; use parity_codec::{Encode, Decode}; @@ -145,7 +145,7 @@ pub fn extrinsics_data_root(xts: Vec>) -> H::Output { pub trait Trait: 'static + Eq + Clone { /// The aggregated `Origin` type used by dispatchable calls. - type Origin: Into>> + From>; + type Origin: Into, Self::Origin>> + From>; /// Account index (aka nonce) type. This stores the number of previous transactions associated with a sender /// account. @@ -376,40 +376,97 @@ decl_storage! { } pub struct EnsureRoot(::rstd::marker::PhantomData); -impl>>, AccountId> EnsureOrigin for EnsureRoot { +impl< + O: Into, O>> + From>, + AccountId, +> EnsureOrigin for EnsureRoot { type Success = (); - fn ensure_origin(o: O) -> Result { - ensure_root(o) + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Root => Ok(()), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureSigned(::rstd::marker::PhantomData); +impl< + O: Into, O>> + From>, + AccountId, +> EnsureOrigin for EnsureSigned { + type Success = AccountId; + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Signed(who) => Ok(who), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureSignedBy(::rstd::marker::PhantomData<(Who, AccountId)>); +impl< + O: Into, O>> + From>, + Who: Contains, + AccountId: PartialEq + Clone, +> EnsureOrigin for EnsureSignedBy { + type Success = AccountId; + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Signed(ref who) if Who::contains(who) => Ok(who.clone()), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureNone(::rstd::marker::PhantomData); +impl< + O: Into, O>> + From>, + AccountId, +> EnsureOrigin for EnsureNone { + type Success = (); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::None => Ok(()), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureNever(::rstd::marker::PhantomData); +impl EnsureOrigin for EnsureNever { + type Success = T; + fn try_origin(o: O) -> Result { + Err(o) } } /// Ensure that the origin `o` represents a signed extrinsic (i.e. transaction). /// Returns `Ok` with the account that signed the extrinsic or an `Err` otherwise. pub fn ensure_signed(o: OuterOrigin) -> Result - where OuterOrigin: Into>> + where OuterOrigin: Into, OuterOrigin>> { match o.into() { - Some(RawOrigin::Signed(t)) => Ok(t), + Ok(RawOrigin::Signed(t)) => Ok(t), _ => Err("bad origin: expected to be a signed origin"), } } /// Ensure that the origin `o` represents the root. Returns `Ok` or an `Err` otherwise. pub fn ensure_root(o: OuterOrigin) -> Result<(), &'static str> - where OuterOrigin: Into>> + where OuterOrigin: Into, OuterOrigin>> { match o.into() { - Some(RawOrigin::Root) => Ok(()), + Ok(RawOrigin::Root) => Ok(()), _ => Err("bad origin: expected to be a root origin"), } } /// Ensure that the origin `o` represents an unsigned extrinsic. Returns `Ok` or an `Err` otherwise. pub fn ensure_none(o: OuterOrigin) -> Result<(), &'static str> - where OuterOrigin: Into>> + where OuterOrigin: Into, OuterOrigin>> { match o.into() { - Some(RawOrigin::None) => Ok(()), + Ok(RawOrigin::None) => Ok(()), _ => Err("bad origin: expected to be no origin"), } } @@ -753,6 +810,13 @@ mod tests { GenesisConfig::::default().build_storage().unwrap().0.into() } + #[test] + fn origin_works() { + let o = Origin::from(RawOrigin::::Signed(1u64)); + let x: Result, Origin> = o.into(); + assert_eq!(x, Ok(RawOrigin::::Signed(1u64))); + } + #[test] fn deposit_event_should_work() { with_externalities(&mut new_test_ext(), || { -- GitLab From 70cf5b0fab30626bc721c4eedba51405bd2afcee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 5 Jun 2019 13:45:18 +0200 Subject: [PATCH 080/140] Build `LongestChain` with `TestClientBuilder` (#2792) * Switch to `TestClientBuilder` and support generating LongestChain * Make sure test-client works without the wasm blob * Use `TestClientBuilder` in more places --- Cargo.lock | 343 +++++++++++----------- core/client/src/client.rs | 80 ++--- core/executor/src/native_executor.rs | 2 +- core/rpc/src/state/tests.rs | 4 +- core/service/src/components.rs | 10 +- core/service/src/lib.rs | 9 +- core/sr-api-macros/tests/runtime_calls.rs | 37 ++- core/test-client/Cargo.toml | 2 +- core/test-client/src/lib.rs | 158 +++++----- core/test-client/src/trait_tests.rs | 8 +- 10 files changed, 320 insertions(+), 333 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 37e52797fe..ba81460ca3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -116,7 +116,7 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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)", ] @@ -128,14 +128,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.26" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.4 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -144,7 +144,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -375,8 +375,8 @@ 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.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "libloading 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -429,7 +429,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -465,15 +465,15 @@ dependencies = [ "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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (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.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.91 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -628,7 +628,7 @@ dependencies = [ "csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -767,7 +767,7 @@ dependencies = [ "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.6 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -780,7 +780,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -788,7 +788,7 @@ name = "error-chain" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -806,7 +806,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -831,7 +831,7 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -855,7 +855,7 @@ 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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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)", @@ -868,7 +868,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide_c_api 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)", @@ -905,8 +905,8 @@ 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.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "libloading 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -972,7 +972,7 @@ 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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -982,7 +982,7 @@ 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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1009,7 +1009,7 @@ dependencies = [ [[package]] name = "h2" -version = "0.1.20" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1020,7 +1020,7 @@ dependencies = [ "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)", + "string 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)", ] @@ -1195,7 +1195,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1205,7 +1205,7 @@ dependencies = [ "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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-buf 0.1.1 (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)", @@ -1240,7 +1240,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1248,7 +1248,7 @@ name = "impl-serde" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1271,7 +1271,7 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1311,9 +1311,9 @@ dependencies = [ "hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 12.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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1324,8 +1324,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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.91 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1370,7 +1370,7 @@ dependencies = [ "jsonrpc-core 12.0.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.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1384,7 +1384,7 @@ 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)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1477,12 +1477,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.55" +version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libloading" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1545,7 +1545,7 @@ dependencies = [ "parity-multiaddr 0.5.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.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (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)", @@ -1604,7 +1604,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1624,7 +1624,7 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (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)", @@ -1650,7 +1650,7 @@ dependencies = [ "parity-multiaddr 0.5.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.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (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)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1709,7 +1709,7 @@ dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.9.0 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.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)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1777,7 +1777,7 @@ dependencies = [ "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.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.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1869,7 +1869,7 @@ dependencies = [ "bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.37 (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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1949,7 +1949,7 @@ name = "memchr" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1997,7 +1997,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2015,7 +2015,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2028,7 +2028,7 @@ dependencies = [ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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)", @@ -2053,7 +2053,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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2096,7 +2096,7 @@ version = "0.2.3" 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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.23 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2113,7 +2113,7 @@ version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2125,7 +2125,7 @@ dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2147,7 +2147,7 @@ dependencies = [ "srml-finality-tracker 2.0.0", "srml-indices 2.0.0", "srml-timestamp 2.0.0", - "structopt 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.2.17 (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", @@ -2163,7 +2163,7 @@ dependencies = [ "substrate-service-test 2.0.0", "substrate-telemetry 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "transaction-factory 0.0.1", ] @@ -2202,7 +2202,7 @@ version = "2.0.0" dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2231,7 +2231,7 @@ dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", @@ -2283,7 +2283,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (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)", ] @@ -2294,7 +2294,7 @@ version = "2.0.0" dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2356,7 +2356,7 @@ name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2395,7 +2395,7 @@ dependencies = [ "cfg-if 0.1.9 (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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2411,7 +2411,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2452,7 +2452,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2478,7 +2478,7 @@ dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2551,7 +2551,7 @@ name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2562,7 +2562,7 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2574,7 +2574,7 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2588,7 +2588,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.54 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2713,7 +2713,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.6.1" +version = "2.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2749,7 +2749,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2759,7 +2759,7 @@ 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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2772,7 +2772,7 @@ 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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2783,7 +2783,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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)", @@ -2838,7 +2838,7 @@ name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2850,7 +2850,7 @@ 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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2899,7 +2899,7 @@ 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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2976,7 +2976,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.37 (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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2987,7 +2987,7 @@ name = "rocksdb" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2997,13 +2997,13 @@ version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3120,7 +3120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3152,15 +3152,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3175,7 +3175,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3268,7 +3268,7 @@ 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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (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)", ] @@ -3390,7 +3390,7 @@ dependencies = [ "num-traits 0.2.8 (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.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (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-std 2.0.0", @@ -3423,7 +3423,7 @@ version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -3433,7 +3433,7 @@ name = "srml-assets" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3449,7 +3449,7 @@ 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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3471,7 +3471,7 @@ 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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3492,7 +3492,7 @@ version = "2.0.0" dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3507,7 +3507,7 @@ name = "srml-consensus" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3527,7 +3527,7 @@ dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-sandbox 2.0.0", @@ -3549,7 +3549,7 @@ dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3566,7 +3566,7 @@ version = "2.0.0" dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3581,7 +3581,7 @@ name = "srml-example" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "srml-balances 2.0.0", @@ -3596,7 +3596,7 @@ version = "2.0.0" dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3614,7 +3614,7 @@ 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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3629,7 +3629,7 @@ name = "srml-grandpa" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3649,7 +3649,7 @@ dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3664,7 +3664,7 @@ name = "srml-metadata" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -3676,7 +3676,7 @@ 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)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3694,7 +3694,7 @@ dependencies = [ "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)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3713,7 +3713,7 @@ name = "srml-sudo" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3732,7 +3732,7 @@ dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3778,7 +3778,7 @@ name = "srml-support-test" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "srml-support 2.0.0", "substrate-inherents 2.0.0", @@ -3793,7 +3793,7 @@ dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3806,7 +3806,7 @@ name = "srml-timestamp" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3821,7 +3821,7 @@ name = "srml-treasury" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3856,8 +3856,11 @@ dependencies = [ [[package]] name = "string" -version = "0.1.3" +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)", +] [[package]] name = "strsim" @@ -3866,16 +3869,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "structopt" -version = "0.2.16" +version = "0.2.17" 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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt-derive 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "structopt-derive" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3977,7 +3980,7 @@ dependencies = [ "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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 2.0.0", "substrate-keyring 2.0.0", "substrate-network 2.0.0", @@ -3989,7 +3992,7 @@ dependencies = [ "sysinfo 0.8.4 (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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4074,7 +4077,7 @@ dependencies = [ "substrate-service 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-client 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4131,7 +4134,7 @@ dependencies = [ "substrate-service 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-client 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4186,7 +4189,7 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-primitives 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4203,7 +4206,7 @@ dependencies = [ "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", "substrate-test-client 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4256,7 +4259,7 @@ dependencies = [ "substrate-service 2.0.0", "substrate-telemetry 2.0.0", "substrate-test-client 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4329,7 +4332,7 @@ dependencies = [ "substrate-peerset 2.0.0", "substrate-primitives 2.0.0", "substrate-test-client 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4348,14 +4351,14 @@ dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (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_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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (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.11 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4379,7 +4382,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-test-client 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4394,7 +4397,7 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4409,7 +4412,7 @@ dependencies = [ "lru-cache 0.1.2 (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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4434,7 +4437,7 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (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)", @@ -4459,7 +4462,7 @@ dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (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", @@ -4473,7 +4476,7 @@ dependencies = [ "substrate-test-client 2.0.0", "substrate-test-runtime 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4484,7 +4487,7 @@ dependencies = [ "jsonrpc-pubsub 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-ws-server 12.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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-rpc 2.0.0", ] @@ -4493,7 +4496,7 @@ dependencies = [ name = "substrate-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4511,7 +4514,7 @@ dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (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 2.0.0", @@ -4530,7 +4533,7 @@ dependencies = [ "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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4548,7 +4551,7 @@ dependencies = [ "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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4587,7 +4590,7 @@ dependencies = [ "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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (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)", @@ -4621,7 +4624,7 @@ dependencies = [ "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.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4653,7 +4656,7 @@ dependencies = [ "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)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime 2.0.0", @@ -4731,7 +4734,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4761,7 +4764,7 @@ version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.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)", @@ -4770,7 +4773,7 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4781,7 +4784,7 @@ name = "termion" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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)", @@ -4808,7 +4811,7 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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)", ] @@ -4840,7 +4843,7 @@ name = "tinytemplate" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4851,13 +4854,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (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.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4874,7 +4877,7 @@ dependencies = [ "tokio-tcp 0.1.3 (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.11 (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-trace-core 0.2.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)", ] @@ -4916,7 +4919,7 @@ dependencies = [ "futures 0.1.27 (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.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5040,7 +5043,7 @@ dependencies = [ [[package]] name = "tokio-trace-core" -version = "0.1.0" +version = "0.2.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)", @@ -5068,7 +5071,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5082,7 +5085,7 @@ name = "toml" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5160,9 +5163,9 @@ 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.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (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)", + "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5321,8 +5324,8 @@ name = "wabt" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (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)", ] @@ -5529,7 +5532,7 @@ version = "2.0.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)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5716,7 +5719,7 @@ dependencies = [ "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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" -"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" +"checksum backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)" = "ada4c783bb7e7443c14e0480f429ae2cc99da95065aeab7ee1b81ada0419404f" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" "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" @@ -5817,7 +5820,7 @@ dependencies = [ "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "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.20 (registry+https://github.com/rust-lang/crates.io-index)" = "2b53def7bb0253af7718036fe9338c15defd209136819464384f3a553e07481b" +"checksum h2 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "09ae3ecbdc15e379c7356430d7c0c6a44d3a937324999429dcf89e970297e54f" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" "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" @@ -5867,8 +5870,8 @@ dependencies = [ "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.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" -"checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" +"checksum libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "6281b86796ba5e4366000be6e9e18bf35580adf9e63fbe2294aadb587613a319" +"checksum libloading 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a5692f82b51823e27c4118b3e5c0d98aee9be90633ebc71ad12afef380b50219" "checksum libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f91d477f61c3451da12de273cbf281a1828eea686248999412e6e6fb23dcbc60" "checksum libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "805f65e99f0c4cc4d6234263325f288fb231468b128dd66e469d4851141f3a26" "checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" @@ -5962,7 +5965,7 @@ dependencies = [ "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.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" +"checksum protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e9076cae823584ab4d8fab3a111658d1232faf106611dc8378161b7d062b628" "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" @@ -5994,7 +5997,7 @@ dependencies = [ "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 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-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" @@ -6013,8 +6016,8 @@ dependencies = [ "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.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 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "32746bf0f26eab52f06af0d0aa1984f641341d06d8d673c693871da2d188c9be" +"checksum serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "46a3223d0c9ba936b61c0d2e3e559e3217dbfb8d65d06d26e8b3c25de38bae3e" "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" @@ -6037,10 +6040,10 @@ dependencies = [ "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 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 string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0bbfb8937e38e34c3444ff00afb28b0811d9554f15c5ad64d12b0308d1d1995" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" -"checksum structopt 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fa19a5a708e22bb5be31c1b6108a2a902f909c4b9ba85cba44c06632386bc0ff" -"checksum structopt-derive 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "c6d59d0ae8ef8de16e49e3ca7afa16024a3e0dfd974a75ef93fdc5464e34523f" +"checksum structopt 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c767a8971f53d7324583085deee2e230903be09e52fb27df9af94c5cb2b43c31" +"checksum structopt-derive 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c57a30c87454ced2186f62f940e981746e8cbbe026d52090c8c4352b636f8235" "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)" = "" @@ -6053,7 +6056,7 @@ dependencies = [ "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.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dc4738f2e68ed2855de5ac9cdbe05c9216773ecde4739b2f095002ab03a13ef" -"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" +"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" "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" @@ -6062,7 +6065,7 @@ dependencies = [ "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4574b75faccaacddb9b284faecdf0b544b80b6b294f3d062d325c5726a209c20" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" -"checksum tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" +"checksum tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "ec2ffcf4bcfc641413fa0f1427bf8f91dfc78f56a6559cbf50e04837ae442a87" "checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" "checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" @@ -6077,7 +6080,7 @@ dependencies = [ "checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" "checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" "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-trace-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9c8a256d6956f7cb5e2bdfe8b1e8022f1a09206c6c2b1ba00f3b746b260c613" "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.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" diff --git a/core/client/src/client.rs b/core/client/src/client.rs index f4183e4958..aa236d1580 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -1728,11 +1728,11 @@ pub(crate) mod tests { 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, SelectChain}; - use test_client::client::backend::Backend as TestBackend; - use test_client::BlockBuilderExt; - use test_client::runtime::{self, Block, Transfer, RuntimeApi, TestAPI}; + use test_client::{ + TestClient, AccountKeyring, client::backend::Backend as TestBackend, TestClientBuilder, + BlockBuilderExt, runtime::{self, Block, Transfer, RuntimeApi, TestAPI} + }; /// Returns tuple, consisting of: /// 1) test client pre-filled with blocks changing balances; @@ -1753,7 +1753,7 @@ pub(crate) mod tests { // prepare client ang import blocks let mut local_roots = Vec::new(); - let remote_client = test_client::new_with_changes_trie(); + let remote_client = TestClientBuilder::new().set_support_changes_trie(true).build(); let mut nonces: HashMap<_, u64> = Default::default(); for (i, block_transfers) in blocks_transfers.into_iter().enumerate() { let mut builder = remote_client.new_block(Default::default()).unwrap(); @@ -1854,7 +1854,10 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); assert_eq!(client.info().chain.best_number, 1); - assert!(client.state_at(&BlockId::Number(1)).unwrap().pairs() != client.state_at(&BlockId::Number(0)).unwrap().pairs()); + assert_ne!( + client.state_at(&BlockId::Number(1)).unwrap().pairs(), + client.state_at(&BlockId::Number(0)).unwrap().pairs() + ); assert_eq!( client.runtime_api().balance_of( &BlockId::Number(client.info().chain.best_number), @@ -1894,7 +1897,10 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); assert_eq!(client.info().chain.best_number, 1); - assert!(client.state_at(&BlockId::Number(1)).unwrap().pairs() != client.state_at(&BlockId::Number(0)).unwrap().pairs()); + assert_ne!( + client.state_at(&BlockId::Number(1)).unwrap().pairs(), + client.state_at(&BlockId::Number(0)).unwrap().pairs() + ); assert_eq!(client.body(&BlockId::Number(1)).unwrap().unwrap().len(), 1) } @@ -1903,18 +1909,14 @@ pub(crate) mod tests { // block tree: // G - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); let genesis_hash = client.info().chain.genesis_hash; - #[allow(deprecated)] - let longest_chain_select = test_client::client::LongestChain::new( - client.backend().clone(), - client.import_lock() - ); - - assert_eq!(genesis_hash.clone(), longest_chain_select.finality_target( - genesis_hash.clone(), None).unwrap().unwrap()); + assert_eq!( + genesis_hash.clone(), + longest_chain_select.finality_target(genesis_hash.clone(), None).unwrap().unwrap() + ); } #[test] @@ -1922,18 +1924,14 @@ pub(crate) mod tests { // block tree: // G - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); let uninserted_block = client.new_block(Default::default()).unwrap().bake().unwrap(); - #[allow(deprecated)] - let backend = client.backend().as_in_memory(); - #[allow(deprecated)] - let longest_chain_select = test_client::client::LongestChain::new( - Arc::new(backend), - client.import_lock()); - assert_eq!(None, longest_chain_select.finality_target( - uninserted_block.hash().clone(), None).unwrap()); + assert_eq!( + None, + longest_chain_select.finality_target(uninserted_block.hash().clone(), None).unwrap() + ); } #[test] @@ -2052,7 +2050,7 @@ pub(crate) mod tests { // block tree: // G -> A1 -> A2 - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); @@ -2063,17 +2061,10 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, a2.clone()).unwrap(); let genesis_hash = client.info().chain.genesis_hash; - #[allow(deprecated)] - 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()); + 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] @@ -2083,7 +2074,7 @@ pub(crate) mod tests { // A1 -> B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); @@ -2152,11 +2143,6 @@ pub(crate) mod tests { assert_eq!(client.info().chain.best_hash, a5.hash()); let genesis_hash = client.info().chain.genesis_hash; - #[allow(deprecated)] - 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())); @@ -2372,7 +2358,7 @@ pub(crate) mod tests { // block tree: // G -> A1 -> A2 - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); @@ -2383,14 +2369,8 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, a2.clone()).unwrap(); let genesis_hash = client.info().chain.genesis_hash; - #[allow(deprecated)] - 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, Some(10)).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target(genesis_hash, Some(10)).unwrap().unwrap()); } #[test] diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index c4f3511c9c..e4a65c811b 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -133,7 +133,7 @@ pub trait NativeExecutionDispatch: Send + Sync { /// A generic `CodeExecutor` implementation that uses a delegate to determine wasm code equivalence /// and dispatch to native code when possible, falling back on `WasmExecutor` when not. #[derive(Debug)] -pub struct NativeExecutor { +pub struct NativeExecutor { /// Dummy field to avoid the compiler complaining about us not using `D`. _dummy: ::std::marker::PhantomData, /// The fallback executor in case native isn't available. diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 889c181415..b40ac06c60 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -21,7 +21,7 @@ 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, LocalExecutor}; +use test_client::{self, runtime, AccountKeyring, TestClient, BlockBuilderExt, LocalExecutor, TestClientBuilder}; use substrate_executor::NativeExecutionDispatch; #[test] @@ -236,7 +236,7 @@ fn should_query_storage() { } run_tests(Arc::new(test_client::new())); - run_tests(Arc::new(test_client::new_with_changes_trie())); + run_tests(Arc::new(TestClientBuilder::new().set_support_changes_trie(true).build())); } #[test] diff --git a/core/service/src/components.rs b/core/service/src/components.rs index a314588d0a..30cb1cb764 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -634,12 +634,12 @@ impl Components for LightComponents { mod tests { use super::*; use consensus_common::BlockOrigin; - use client::LongestChain; - use substrate_test_client::{TestClient, AccountKeyring, runtime::Transfer}; + use substrate_test_client::{TestClient, AccountKeyring, runtime::Transfer, TestClientBuilder}; #[test] fn should_remove_transactions_from_the_pool() { - let client = Arc::new(substrate_test_client::new()); + let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); + let client = Arc::new(client); let pool = TransactionPool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone())); let transaction = Transfer { amount: 5, @@ -647,9 +647,7 @@ mod tests { from: AccountKeyring::Alice.into(), to: Default::default(), }.into_signed_tx(); - #[allow(deprecated)] - let best = LongestChain::new(client.backend().clone(), client.import_lock()) - .best_chain().unwrap(); + let best = longest_chain.best_chain().unwrap(); // store the transaction in the pool pool.submit_one(&BlockId::hash(best.hash()), transaction.clone()).unwrap(); diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index bc40d6008b..92b7a06d38 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -749,21 +749,20 @@ macro_rules! construct_service_factory { #[cfg(test)] mod tests { use super::*; - use client::LongestChain; use consensus_common::SelectChain; use runtime_primitives::traits::BlindCheckable; - use substrate_test_client::{AccountKeyring, runtime::{Extrinsic, Transfer}}; + use substrate_test_client::{AccountKeyring, runtime::{Extrinsic, Transfer}, TestClientBuilder}; #[test] fn should_not_propagate_transactions_that_are_marked_as_such() { // given - let client = Arc::new(substrate_test_client::new()); + let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); + let client = Arc::new(client); let pool = Arc::new(TransactionPool::new( Default::default(), transaction_pool::ChainApi::new(client.clone()) )); - let best = LongestChain::new(client.backend().clone(), client.import_lock()) - .best_chain().unwrap(); + let best = longest_chain.best_chain().unwrap(); let transaction = Transfer { amount: 5, nonce: 0, diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index f4d87ca8ca..0671c4f41d 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -16,7 +16,7 @@ use test_client::{ AccountKeyring, runtime::{TestAPI, DecodeFails, Transfer, Header}, - NativeExecutor, LocalExecutor, + NativeExecutor, LocalExecutor, TestClientBuilder }; use runtime_primitives::{ generic::BlockId, @@ -27,12 +27,11 @@ use state_machine::{ 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); + let client = TestClientBuilder::new().set_execution_strategy(strat).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); @@ -52,7 +51,7 @@ fn calling_wasm_runtime_function() { #[test] #[should_panic(expected = "Could not convert parameter `param` between node and runtime!")] fn calling_native_runtime_function_with_non_decodable_parameter() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeWhenPossible).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); runtime_api.fail_convert_parameter(&block_id, DecodeFails::new()).unwrap(); @@ -61,7 +60,7 @@ fn calling_native_runtime_function_with_non_decodable_parameter() { #[test] #[should_panic(expected = "Could not convert return value from runtime to node!")] fn calling_native_runtime_function_with_non_decodable_return_value() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeWhenPossible).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); runtime_api.fail_convert_return_value(&block_id).unwrap(); @@ -69,7 +68,7 @@ fn calling_native_runtime_function_with_non_decodable_return_value() { #[test] fn calling_native_runtime_signature_changed_function() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeWhenPossible).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); @@ -78,7 +77,7 @@ fn calling_native_runtime_signature_changed_function() { #[test] fn calling_wasm_runtime_signature_changed_old_function() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); @@ -89,7 +88,7 @@ fn calling_wasm_runtime_signature_changed_old_function() { #[test] fn calling_with_both_strategy_and_fail_on_wasm_should_return_error() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); assert!(runtime_api.fail_on_wasm(&block_id).is_err()); @@ -97,7 +96,7 @@ fn calling_with_both_strategy_and_fail_on_wasm_should_return_error() { #[test] fn calling_with_both_strategy_and_fail_on_native_should_work() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_native(&block_id).unwrap(), 1); @@ -106,7 +105,7 @@ fn calling_with_both_strategy_and_fail_on_native_should_work() { #[test] fn calling_with_native_else_wasm_and_faild_on_wasm_should_work() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeElseWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeElseWasm).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_wasm(&block_id).unwrap(), 1); @@ -114,7 +113,7 @@ fn calling_with_native_else_wasm_and_faild_on_wasm_should_work() { #[test] fn calling_with_native_else_wasm_and_fail_on_native_should_work() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeElseWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeElseWasm).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_native(&block_id).unwrap(), 1); @@ -122,7 +121,7 @@ fn calling_with_native_else_wasm_and_fail_on_native_should_work() { #[test] fn use_trie_function() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.use_trie(&block_id).unwrap(), 2); @@ -130,7 +129,7 @@ fn use_trie_function() { #[test] fn initialize_block_works() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.get_block_number(&block_id).unwrap(), 1); @@ -138,7 +137,7 @@ fn initialize_block_works() { #[test] fn initialize_block_is_called_only_once() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.take_block_number(&block_id).unwrap(), Some(1)); @@ -147,7 +146,7 @@ fn initialize_block_is_called_only_once() { #[test] fn initialize_block_is_skipped() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); let block_id = BlockId::Number(client.info().chain.best_number); assert!(runtime_api.without_initialize_block(&block_id).unwrap()); @@ -155,12 +154,12 @@ fn initialize_block_is_skipped() { #[test] fn record_proof_works() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let (client, longest_chain) = TestClientBuilder::new() + .set_execution_strategy(ExecutionStrategy::Both) + .build_with_longest_chain(); let block_id = BlockId::Number(client.info().chain.best_number); - #[allow(deprecated)] - let storage_root = LongestChain::new(client.backend().clone(), client.import_lock()) - .best_chain().unwrap().state_root().clone(); + let storage_root = longest_chain.best_chain().unwrap().state_root().clone(); let transaction = Transfer { amount: 1000, diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index 7628125df4..8de313f9cb 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" client = { package = "substrate-client", path = "../client" } client-db = { package = "substrate-client-db", path = "../client/db", features = ["test-helpers"] } futures = { version = "0.1.17" } -parity-codec = "3.3" +parity-codec = "3.5.1" executor = { package = "substrate-executor", path = "../executor" } consensus = { package = "substrate-consensus-common", path = "../consensus/common" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index 5154fb0c1d..7a176a6c31 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -104,22 +104,78 @@ pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor >; /// A builder for creating a test client instance. -pub struct TestClientBuilder { +pub struct TestClientBuilder { execution_strategies: ExecutionStrategies, genesis_extension: HashMap, Vec>, support_changes_trie: bool, + backend: Arc, + _phantom: std::marker::PhantomData, } -impl TestClientBuilder { +#[cfg(feature = "include-wasm-blob")] +impl TestClientBuilder where + B: backend::LocalBackend, +{ + /// Create a new instance of the test client builder using the given backend. + pub fn new_with_backend(backend: Arc) -> Self { + TestClientBuilder { + execution_strategies: ExecutionStrategies::default(), + genesis_extension: HashMap::default(), + support_changes_trie: false, + backend, + _phantom: Default::default(), + } + } +} + +#[cfg(feature = "include-wasm-blob")] +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, + backend: Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)), + _phantom: Default::default(), + } + } +} + +#[cfg(not(feature = "include-wasm-blob"))] +impl TestClientBuilder where + B: backend::LocalBackend, +{ + /// Create a new instance of the test client builder using the given backend. + pub fn new_with_backend(backend: Arc) -> Self { + TestClientBuilder { + execution_strategies: ExecutionStrategies::default(), + genesis_extension: HashMap::default(), + support_changes_trie: false, + backend, + _phantom: Default::default(), } } +} +#[cfg(not(feature = "include-wasm-blob"))] +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, + backend: Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)), + _phantom: Default::default(), + } + } +} + +impl TestClientBuilder where + B: backend::LocalBackend, + E: executor::NativeExecutionDispatch +{ /// Set the execution strategy that should be used by all contexts. pub fn set_execution_strategy( mut self, @@ -151,60 +207,46 @@ impl TestClientBuilder { } /// Build the test client. - #[cfg(feature = "include-wasm-blob")] pub fn build(self) -> client::Client< - Backend, Executor, runtime::Block, runtime::RuntimeApi + B, + client::LocalCallExecutor>, + runtime::Block, + runtime::RuntimeApi, > { - let backend = Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)); - self.build_with_backend(backend) + self.build_with_longest_chain().0 } - /// 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); + /// Build the test client and longest chain as select chain. + pub fn build_with_longest_chain(self) -> ( + client::Client< + B, + client::LocalCallExecutor>, + runtime::Block, + runtime::RuntimeApi, + >, + client::LongestChain, + ) { + let executor = NativeExecutor::::new(None); + let executor = LocalCallExecutor::new(self.backend.clone(), executor); - client::Client::new( - backend, + let client = client::Client::new( + self.backend.clone(), executor, genesis_storage(self.support_changes_trie, self.genesis_extension), - self.execution_strategies - ).expect("Creates new client") - } + 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); + #[allow(deprecated)] + let longest_chain = client::LongestChain::new(self.backend, client.import_lock()); - client::Client::new( - backend, - executor, - genesis_storage(self.support_changes_trie, self.genesis_extension), - self.execution_strategies - ).expect("Creates new client") + (client, longest_chain) } } /// 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) + TestClientBuilder::new().build() } /// Creates new light client instance used for tests. @@ -221,40 +263,6 @@ pub fn new_light() -> client::Client client::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 -{ - 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 -) -> client::Client< - B, - client::LocalCallExecutor>, - runtime::Block, - runtime::RuntimeApi -> where B: backend::LocalBackend -{ - TestClientBuilder::new() - .set_support_changes_trie(support_changes_trie) - .build_with_backend(backend) -} - fn genesis_config(support_changes_trie: bool) -> GenesisConfig { GenesisConfig::new(support_changes_trie, vec![ AuthorityKeyring::Alice.into(), diff --git a/core/test-client/src/trait_tests.rs b/core/test-client/src/trait_tests.rs index a7ef1a01f6..f39d85a1ca 100644 --- a/core/test-client/src/trait_tests.rs +++ b/core/test-client/src/trait_tests.rs @@ -26,7 +26,7 @@ use crate::{TestClient, AccountKeyring}; use runtime_primitives::traits::Block as BlockT; use crate::backend; use crate::blockchain::{Backend as BlockChainBackendT, HeaderBackend}; -use crate::{BlockBuilderExt, new_with_backend}; +use crate::{BlockBuilderExt, TestClientBuilder}; use runtime::{self, Transfer}; use runtime_primitives::generic::BlockId; @@ -40,7 +40,7 @@ pub fn test_leaves_for_backend(backend: Arc) where // B2 -> C3 // A1 -> D2 - let client = new_with_backend(backend.clone(), false); + let client = TestClientBuilder::new_with_backend(backend.clone()).build(); let blockchain = backend.blockchain(); let genesis_hash = client.info().chain.genesis_hash; @@ -156,7 +156,7 @@ pub fn test_children_for_backend(backend: Arc) where // B2 -> C3 // A1 -> D2 - let client = new_with_backend(backend.clone(), false); + let client = TestClientBuilder::new_with_backend(backend.clone()).build(); let blockchain = backend.blockchain(); // G -> A1 @@ -246,7 +246,7 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let client = new_with_backend(backend.clone(), false); + let client = TestClientBuilder::new_with_backend(backend.clone()).build(); let blockchain = backend.blockchain(); // G -> A1 -- GitLab From 3c2e55bdc103b583b03fac3cdc46e88c77add513 Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Wed, 5 Jun 2019 15:46:01 +0200 Subject: [PATCH 081/140] Move import lock onto backend (#2797) * Drop import_lock from client, move it into backend, impl default version via static mutex * still need to allow depcretion because of client.backend * additional docs * Remove default impl of get_import_lock, impl on instances * Bump parking_lot to 0.8.0 accross the board --- Cargo.lock | 78 +++++++++++++------------- core/client/Cargo.toml | 2 +- core/client/db/Cargo.toml | 2 +- core/client/db/src/lib.rs | 6 ++ core/client/src/backend.rs | 8 +++ core/client/src/client.rs | 21 +------ core/client/src/in_mem.rs | 8 ++- core/client/src/light/backend.rs | 8 ++- core/consensus/aura/Cargo.toml | 2 +- core/consensus/aura/src/lib.rs | 1 - core/consensus/babe/Cargo.toml | 2 +- core/consensus/babe/src/lib.rs | 2 +- core/consensus/common/Cargo.toml | 2 +- core/consensus/rhd/Cargo.toml | 2 +- core/consensus/slots/Cargo.toml | 2 +- core/executor/Cargo.toml | 2 +- core/finality-grandpa/Cargo.toml | 2 +- core/finality-grandpa/src/tests.rs | 3 +- core/inherents/Cargo.toml | 2 +- core/network-libp2p/Cargo.toml | 2 +- core/network/Cargo.toml | 2 +- core/offchain/Cargo.toml | 2 +- core/rpc/Cargo.toml | 2 +- core/service/Cargo.toml | 2 +- core/service/src/lib.rs | 3 +- core/state-db/Cargo.toml | 2 +- core/state-machine/Cargo.toml | 2 +- core/telemetry/Cargo.toml | 2 +- core/test-client/src/lib.rs | 2 +- core/transaction-pool/Cargo.toml | 2 +- core/transaction-pool/graph/Cargo.toml | 2 +- node-template/Cargo.toml | 2 +- node-template/src/service.rs | 5 +- node/cli/src/service.rs | 5 +- srml/aura/Cargo.toml | 2 +- srml/babe/Cargo.toml | 2 +- srml/finality-tracker/Cargo.toml | 2 +- 37 files changed, 101 insertions(+), 97 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba81460ca3..b1b933c3a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -677,7 +677,7 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.4" +version = "1.2.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)", @@ -739,7 +739,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.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.0 (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)", @@ -1009,7 +1009,7 @@ dependencies = [ [[package]] name = "h2" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1195,7 +1195,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.22 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1517,7 +1517,7 @@ dependencies = [ "libp2p-websocket 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 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-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1543,7 +1543,7 @@ dependencies = [ "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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1648,7 +1648,7 @@ dependencies = [ "libp2p-core 0.9.0 (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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1704,7 +1704,7 @@ version = "0.7.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.4 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2271,7 +2271,7 @@ dependencies = [ "log 0.4.6 (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)", + "parking_lot 0.8.0 (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", @@ -2476,7 +2476,7 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2485,7 +2485,7 @@ dependencies = [ [[package]] name = "parity-multihash" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3083,7 +3083,7 @@ 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.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.0 (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.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3448,7 +3448,7 @@ 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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3470,7 +3470,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -3613,7 +3613,7 @@ 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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -4008,7 +4008,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4036,7 +4036,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (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", @@ -4057,7 +4057,7 @@ dependencies = [ "futures 0.1.27 (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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", @@ -4112,7 +4112,7 @@ dependencies = [ "merlin 1.1.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.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 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)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -4157,7 +4157,7 @@ dependencies = [ "libp2p 0.9.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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", @@ -4176,7 +4176,7 @@ dependencies = [ "futures 0.1.27 (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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rhododendron 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", @@ -4199,7 +4199,7 @@ dependencies = [ "futures 0.1.27 (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)", + "parking_lot 0.8.0 (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", @@ -4221,7 +4221,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", "substrate-panic-handler 2.0.0", @@ -4244,7 +4244,7 @@ dependencies = [ "futures 0.1.27 (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)", + "parking_lot 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)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -4278,7 +4278,7 @@ name = "substrate-inherents" version = "2.0.0" dependencies = [ "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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -4321,7 +4321,7 @@ dependencies = [ "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.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)", + "parking_lot 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)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -4349,7 +4349,7 @@ dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p 0.9.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)", + "parking_lot 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)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4374,7 +4374,7 @@ dependencies = [ "futures 0.1.27 (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)", + "parking_lot 0.8.0 (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", @@ -4460,7 +4460,7 @@ dependencies = [ "jsonrpc-pubsub 12.0.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.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)", + "parking_lot 0.8.0 (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.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4513,7 +4513,7 @@ dependencies = [ "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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.92 (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)", @@ -4561,7 +4561,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", ] @@ -4574,7 +4574,7 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", @@ -4588,7 +4588,7 @@ 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)", + "parking_lot 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)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4655,7 +4655,7 @@ dependencies = [ "futures 0.1.27 (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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-primitives 2.0.0", @@ -4670,7 +4670,7 @@ dependencies = [ "futures 0.1.27 (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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-keyring 2.0.0", @@ -5631,7 +5631,7 @@ 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.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5781,7 +5781,7 @@ dependencies = [ "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.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" +"checksum curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4440b7acc6264fde2eee18bae135625129c88ff244f3ded035e3caa585a6bf0a" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" "checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" @@ -5820,7 +5820,7 @@ dependencies = [ "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "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.22 (registry+https://github.com/rust-lang/crates.io-index)" = "09ae3ecbdc15e379c7356430d7c0c6a44d3a937324999429dcf89e970297e54f" +"checksum h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "1e42e3daed5a7e17b12a0c23b5b2fbff23a925a570938ebee4baca1a9a1a2240" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" "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" @@ -5940,7 +5940,7 @@ dependencies = [ "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.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" -"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eb83358a0c05e52c44d658981fec2d146d3516d1adffd9e553684f8c8e9e8fa5" "checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "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" diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index e295894b83..0978b897ec 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" 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 } +parking_lot = { version = "0.8.0", optional = true } hex = { package = "hex-literal", version = "0.1", optional = true } futures = { version = "0.1.17", optional = true } consensus = { package = "substrate-consensus-common", path = "../consensus/common", optional = true } diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 77512ec269..64051164b8 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.7.1" +parking_lot = "0.8" log = "0.4" kvdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } # FIXME replace with release as soon as our rocksdb changes are released upstream https://github.com/paritytech/parity-common/issues/88 diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 302cdfd083..674e8022dc 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -656,6 +656,7 @@ pub struct Backend { blockchain: BlockchainDb, canonicalization_delay: u64, shared_cache: SharedCache, + import_lock: Mutex<()>, } impl> Backend { @@ -722,6 +723,7 @@ impl> Backend { blockchain, canonicalization_delay, shared_cache: new_shared_cache(state_cache_size), + import_lock: Default::default(), }) } @@ -1350,6 +1352,10 @@ impl client::backend::Backend for Backend whe } Ok(()) } + + fn get_import_lock(&self) -> &Mutex<()> { + &self.import_lock + } } impl client::backend::LocalBackend for Backend diff --git a/core/client/src/backend.rs b/core/client/src/backend.rs index d2cc086ecd..5028b9dde7 100644 --- a/core/client/src/backend.rs +++ b/core/client/src/backend.rs @@ -26,6 +26,7 @@ use state_machine::ChangesTrieStorage as StateChangesTrieStorage; use consensus::well_known_cache_keys; use hash_db::Hasher; use trie::MemoryDB; +use parking_lot::Mutex; /// State of a new block. #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -174,6 +175,13 @@ pub trait Backend: AuxStore + Send + Sync where fn get_aux(&self, key: &[u8]) -> error::Result>> { AuxStore::get_aux(self, key) } + + /// Gain access to the import lock around this backend. + /// _Note_ Backend isn't expected to acquire the lock by itself ever. Rather + /// the using components should acquire and hold the lock whenever they do + /// something that the import of a block would interfere with, e.g. importing + /// a new block or calculating the best head. + fn get_import_lock(&self) -> &Mutex<()>; } /// Changes trie storage that supports pruning. diff --git a/core/client/src/client.rs b/core/client/src/client.rs index aa236d1580..f3040f13da 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -124,7 +124,6 @@ pub struct Client where Block: BlockT { storage_notifications: Mutex>, import_notification_sinks: Mutex>>>, finality_notification_sinks: Mutex>>>, - import_lock: Arc>, // holds the block hash currently being imported. TODO: replace this with block queue importing_block: RwLock>, execution_strategies: ExecutionStrategies, @@ -318,7 +317,6 @@ impl Client where storage_notifications: Default::default(), import_notification_sinks: Default::default(), finality_notification_sinks: Default::default(), - import_lock: Default::default(), importing_block: Default::default(), execution_strategies, _phantom: Default::default(), @@ -344,15 +342,6 @@ impl Client where &self.backend } - /// 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(); @@ -744,7 +733,7 @@ impl Client where Err: From, { let inner = || { - let _import_lock = self.import_lock.lock(); + let _import_lock = self.backend.get_import_lock().lock(); let mut op = ClientImportOperation { op: self.backend.begin_operation()?, @@ -1493,17 +1482,14 @@ where /// 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() } } @@ -1515,10 +1501,9 @@ where Block: BlockT, { /// Instantiate a new LongestChain for Backend B - pub fn new(backend: Arc, import_lock: Arc>) -> Self { + pub fn new(backend: Arc) -> Self { LongestChain { backend, - import_lock, _phantom: Default::default() } } @@ -1564,7 +1549,7 @@ where // 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 _import_lock = self.backend.get_import_lock().lock(); let info = self.backend.blockchain().info(); diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index 92d04230dd..dec10d40f7 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -18,7 +18,7 @@ use std::collections::HashMap; use std::sync::Arc; -use parking_lot::RwLock; +use parking_lot::{RwLock, Mutex}; use primitives::{ChangesTrieConfiguration, storage::well_known_keys}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ @@ -541,6 +541,7 @@ where states: RwLock>>, changes_trie_storage: ChangesTrieStorage, blockchain: Blockchain, + import_lock: Mutex<()>, } impl Backend @@ -555,6 +556,7 @@ where states: RwLock::new(HashMap::new()), changes_trie_storage: ChangesTrieStorage(InMemoryChangesTrieStorage::new()), blockchain: Blockchain::new(), + import_lock: Default::default(), } } } @@ -684,6 +686,10 @@ where fn revert(&self, _n: NumberFor) -> error::Result> { Ok(Zero::zero()) } + + fn get_import_lock(&self) -> &Mutex<()> { + &self.import_lock + } } impl backend::LocalBackend for Backend diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index 0c2279bf3d..60b4c66c17 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -20,7 +20,7 @@ use std::collections::HashMap; use std::sync::{Arc, Weak}; use futures::{Future, IntoFuture}; -use parking_lot::RwLock; +use parking_lot::{RwLock, Mutex}; use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::{Backend as StateBackend, TrieBackend, backend::InMemory as InMemoryState}; @@ -41,6 +41,7 @@ const IN_MEMORY_EXPECT_PROOF: &str = "InMemory state backend has Void error type pub struct Backend { blockchain: Arc>, genesis_state: RwLock>>, + import_lock: Mutex<()>, } /// Light block (header and justification) import operation. @@ -77,6 +78,7 @@ impl Backend { Self { blockchain, genesis_state: RwLock::new(None), + import_lock: Default::default(), } } @@ -213,6 +215,10 @@ impl ClientBackend for Backend where fn revert(&self, _n: NumberFor) -> ClientResult> { Err(ClientError::NotAvailableOnLightClient.into()) } + + fn get_import_lock(&self) -> &Mutex<()> { + &self.import_lock + } } impl RemoteBackend for Backend diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index 6e489cf8a9..446dcbff3a 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -23,7 +23,7 @@ authorities = { package = "substrate-consensus-authorities", path = "../authorit runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } futures = "0.1.17" tokio = "0.1.7" -parking_lot = "0.7.1" +parking_lot = "0.8.0" log = "0.4" [dev-dependencies] diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 6f73c6ed65..36561645f0 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -886,7 +886,6 @@ mod tests { #[allow(deprecated)] let select_chain = LongestChain::new( client.backend().clone(), - client.import_lock().clone(), ); let environ = Arc::new(DummyFactory(client.clone())); import_notifications.push( diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index bc557ffb56..04cd42c680 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -24,7 +24,7 @@ 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" +parking_lot = "0.8.0" log = "0.4.6" schnorrkel = "0.1.1" rand = "0.6.5" diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 12c388d329..0cb95c02df 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -975,7 +975,7 @@ mod tests { #[allow(deprecated)] - let select_chain = LongestChain::new(client.backend().clone(), client.import_lock().clone()); + let select_chain = LongestChain::new(client.backend().clone()); let babe = start_babe(BabeParams { config, diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index c2fc7cf231..3d133461e7 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -18,7 +18,7 @@ runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } tokio-timer = "0.2" parity-codec = { version = "3.3", features = ["derive"] } -parking_lot = "0.7.1" +parking_lot = "0.8.0" [dev-dependencies] test_client = { package = "substrate-test-client", path = "../../test-client" } diff --git a/core/consensus/rhd/Cargo.toml b/core/consensus/rhd/Cargo.toml index 3f0a79a863..ee1efb8d06 100644 --- a/core/consensus/rhd/Cargo.toml +++ b/core/consensus/rhd/Cargo.toml @@ -20,7 +20,7 @@ runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } 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" +parking_lot = "0.8.0" log = "0.4" rhododendron = { version = "0.5.0", features = ["codec"] } exit-future = "0.1" diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index 2be9133d54..7a3b487dc6 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -14,7 +14,7 @@ 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" +parking_lot = "0.8.0" log = "0.4" [dev-dependencies] diff --git a/core/executor/Cargo.toml b/core/executor/Cargo.toml index 8f39d35c79..9cc198557d 100644 --- a/core/executor/Cargo.toml +++ b/core/executor/Cargo.toml @@ -17,7 +17,7 @@ panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" wasmi = { version = "0.4.3" } byteorder = "1.1" lazy_static = "1.0" -parking_lot = "0.7.1" +parking_lot = "0.8.0" log = "0.4" libsecp256k1 = "0.2.1" tiny-keccak = "1.4.2" diff --git a/core/finality-grandpa/Cargo.toml b/core/finality-grandpa/Cargo.toml index 9d44c8ee3e..b00c646286 100644 --- a/core/finality-grandpa/Cargo.toml +++ b/core/finality-grandpa/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" fork-tree = { path = "../../core/util/fork-tree" } futures = "0.1" log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" tokio = "0.1.7" rand = "0.6" parity-codec = { version = "3.3", features = ["derive"] } diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 7fc2509f41..18342e3a1e 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -121,8 +121,7 @@ impl TestNetFactory for GrandpaTestNet { PeersClient::Full(ref client) => { #[allow(deprecated)] let select_chain = LongestChain::new( - client.backend().clone(), - client.import_lock().clone() + client.backend().clone() ); let (import, link) = block_import( client.clone(), diff --git a/core/inherents/Cargo.toml b/core/inherents/Cargo.toml index a71661bd1d..606d9c5ae9 100644 --- a/core/inherents/Cargo.toml +++ b/core/inherents/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = { version = "0.7", optional = true } +parking_lot = { version = "0.8.0", optional = true } rstd = { package = "sr-std", path = "../sr-std", default-features = false } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } diff --git a/core/network-libp2p/Cargo.toml b/core/network-libp2p/Cargo.toml index e92738b902..8a03a1c511 100644 --- a/core/network-libp2p/Cargo.toml +++ b/core/network-libp2p/Cargo.toml @@ -13,7 +13,7 @@ bytes = "0.4" fnv = "1.0" futures = "0.1" libp2p = { version = "0.9.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } -parking_lot = "0.7.1" +parking_lot = "0.8.0" lazy_static = "1.2" log = "0.4" rand = "0.6" diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 6576ccabbf..8fbf7daa9c 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -11,7 +11,7 @@ edition = "2018" [dependencies] derive_more = "0.14.0" log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" bitflags = "1.0" futures = "0.1.17" linked-hash-map = "0.5" diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index da2aeb4334..0672ebcc0c 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -13,7 +13,7 @@ futures = "0.1.25" log = "0.4" offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } parity-codec = { version = "3.3", features = ["derive"] } -parking_lot = "0.7.1" +parking_lot = "0.8.0" primitives = { package = "substrate-primitives", path = "../../core/primitives" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } tokio = "0.1.7" diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index a7337858d8..c621f71a43 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -11,7 +11,7 @@ jsonrpc-core-client = "12.0.0" jsonrpc-pubsub = "12.0.0" jsonrpc-derive = "12.0.0" log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" parity-codec = "3.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 89804166d6..0a0cd91553 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] derive_more = "0.14.0" futures = "0.1.17" -parking_lot = "0.7.1" +parking_lot = "0.8.0" lazy_static = "1.0" log = "0.4" slog = {version = "^2", features = ["nested-values"]} diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 92b7a06d38..5129944c54 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -622,7 +622,8 @@ impl network::TransactionPool, ComponentBlock< /// { |_, 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())) +/// #[allow(deprecated)] +/// Ok(LongestChain::new(client.backend().clone())) /// }}, /// FinalityProofProvider = { |client: Arc>| { /// Ok(Some(Arc::new(grandpa::FinalityProofProvider::new(client.clone(), client)) as _)) diff --git a/core/state-db/Cargo.toml b/core/state-db/Cargo.toml index 6f2ac70a30..8c02dbc450 100644 --- a/core/state-db/Cargo.toml +++ b/core/state-db/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.7.1" +parking_lot = "0.8.0" log = "0.4" primitives = { package = "substrate-primitives", path = "../../core/primitives" } parity-codec = { version = "3.3", features = ["derive"] } diff --git a/core/state-machine/Cargo.toml b/core/state-machine/Cargo.toml index 222c543f54..b1cb98ae80 100644 --- a/core/state-machine/Cargo.toml +++ b/core/state-machine/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" hash-db = "0.12" trie-db = "0.12" trie-root = "0.12" diff --git a/core/telemetry/Cargo.toml b/core/telemetry/Cargo.toml index d1fa12abe2..f61d6bc4d3 100644 --- a/core/telemetry/Cargo.toml +++ b/core/telemetry/Cargo.toml @@ -6,7 +6,7 @@ description = "Telemetry utils" edition = "2018" [dependencies] -parking_lot = "0.7.1" +parking_lot = "0.8.0" lazy_static = "1.0" log = "0.4" rand = "0.6" diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index 7a176a6c31..f39ad86b64 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -237,7 +237,7 @@ impl TestClientBuilder where ).expect("Creates new client"); #[allow(deprecated)] - let longest_chain = client::LongestChain::new(self.backend, client.import_lock()); + let longest_chain = client::LongestChain::new(self.backend); (client, longest_chain) } diff --git a/core/transaction-pool/Cargo.toml b/core/transaction-pool/Cargo.toml index 5b2c2350af..ed2cd27833 100644 --- a/core/transaction-pool/Cargo.toml +++ b/core/transaction-pool/Cargo.toml @@ -9,7 +9,7 @@ derive_more = "0.14.0" futures = "0.1" log = "0.4" parity-codec = "3.3" -parking_lot = "0.7.1" +parking_lot = "0.8.0" sr-primitives = { path = "../sr-primitives" } client = { package = "substrate-client", path = "../client" } substrate-primitives = { path = "../primitives" } diff --git a/core/transaction-pool/graph/Cargo.toml b/core/transaction-pool/graph/Cargo.toml index 0ebc74b7da..3f918efa4a 100644 --- a/core/transaction-pool/graph/Cargo.toml +++ b/core/transaction-pool/graph/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" derive_more = "0.14.0" futures = "0.1" log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" serde = { version = "1.0", features = ["derive"] } substrate-primitives = { path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } diff --git a/node-template/Cargo.toml b/node-template/Cargo.toml index 69f9c884cd..e78bb2d27e 100644 --- a/node-template/Cargo.toml +++ b/node-template/Cargo.toml @@ -16,7 +16,7 @@ ctrlc = { version = "3.0", features = ["termination"] } log = "0.4" tokio = "0.1" exit-future = "0.1" -parking_lot = "0.7.1" +parking_lot = "0.8.0" parity-codec = "3.3" trie-root = "0.12.2" sr-io = { path = "../core/sr-io" } diff --git a/node-template/src/service.rs b/node-template/src/service.rs index 934cf87b9c..c8f5dfc0a1 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -129,10 +129,7 @@ construct_service_factory! { SelectChain = LongestChain, Self::Block> { |config: &FactoryFullConfiguration, client: Arc>| { #[allow(deprecated)] - Ok(LongestChain::new( - client.backend().clone(), - client.import_lock() - )) + Ok(LongestChain::new(client.backend().clone())) } }, FinalityProofProvider = { |_client: Arc>| { diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 2991bfe377..415ddbe71b 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -205,10 +205,7 @@ construct_service_factory! { SelectChain = LongestChain, Self::Block> { |config: &FactoryFullConfiguration, client: Arc>| { #[allow(deprecated)] - Ok(LongestChain::new( - client.backend().clone(), - client.import_lock() - )) + Ok(LongestChain::new(client.backend().clone())) } }, FinalityProofProvider = { |client: Arc>| { diff --git a/srml/aura/Cargo.toml b/srml/aura/Cargo.toml index 6a437ce71a..82027871b4 100644 --- a/srml/aura/Cargo.toml +++ b/srml/aura/Cargo.toml @@ -18,7 +18,7 @@ session = { package = "srml-session", path = "../session", default-features = fa [dev-dependencies] lazy_static = "1.0" -parking_lot = "0.7.1" +parking_lot = "0.8.0" substrate-primitives = { path = "../../core/primitives" } runtime_io = { package = "sr-io", path = "../../core/sr-io" } consensus = { package = "srml-consensus", path = "../consensus" } diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml index 0c25a98948..0f189dfcda 100644 --- a/srml/babe/Cargo.toml +++ b/srml/babe/Cargo.toml @@ -20,7 +20,7 @@ babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../ [dev-dependencies] lazy_static = "1.3.0" -parking_lot = "0.7.1" +parking_lot = "0.8.0" substrate-primitives = { path = "../../core/primitives" } runtime_io = { package = "sr-io", path = "../../core/sr-io" } consensus = { package = "srml-consensus", path = "../consensus" } diff --git a/srml/finality-tracker/Cargo.toml b/srml/finality-tracker/Cargo.toml index c7006a3c3e..e6cf47ab25 100644 --- a/srml/finality-tracker/Cargo.toml +++ b/srml/finality-tracker/Cargo.toml @@ -17,7 +17,7 @@ srml-system = { path = "../system", default-features = false } substrate-primitives = { path = "../../core/primitives", default-features = false } sr-io = { path = "../../core/sr-io", default-features = false } lazy_static = "1.0" -parking_lot = "0.7" +parking_lot = "0.8.0" [features] default = ["std"] -- GitLab From c17a54514144ae86f9c545e07638ed2ea4c893ad Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 5 Jun 2019 16:31:20 +0200 Subject: [PATCH 082/140] Small slots refactor (#2780) * Deprecate SlotWorker::on_start * start_slot_worker no longer needs an Arc * start_slot_worker now always succeeds * Removed on_exit parameter from start_*_worker * Minor doc * Fix node-template --- core/consensus/aura/src/lib.rs | 29 +++----- core/consensus/babe/src/lib.rs | 31 +++----- core/consensus/slots/src/lib.rs | 124 +++++++++++++------------------- node-template/src/service.rs | 7 +- node/cli/src/service.rs | 7 +- 5 files changed, 77 insertions(+), 121 deletions(-) diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 36561645f0..e3fffad33f 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -65,7 +65,7 @@ use srml_aura::{ }; use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_WARN, CONSENSUS_INFO}; -use slots::{CheckedHeader, SlotWorker, SlotInfo, SlotCompatible, slot_now, check_equivocation}; +use slots::{CheckedHeader, SlotData, SlotWorker, SlotInfo, SlotCompatible, slot_now, check_equivocation}; pub use aura_primitives::*; pub use consensus_common::{SyncOracle, ExtraVerification}; @@ -125,7 +125,7 @@ impl SlotCompatible for AuraSlotCompatible { } /// 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, @@ -133,7 +133,6 @@ pub fn start_aura( block_import: Arc, env: Arc, sync_oracle: SO, - on_exit: OnExit, inherent_data_providers: InherentDataProviders, force_authoring: bool, ) -> Result, consensus_common::Error> where @@ -156,25 +155,26 @@ pub fn start_aura( I: BlockImport + Send + Sync + 'static, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, SO: SyncOracle + Send + Sync + Clone, - OnExit: Future, { let worker = AuraWorker { client: client.clone(), block_import, env, local_key, - inherent_data_providers: inherent_data_providers.clone(), sync_oracle: sync_oracle.clone(), force_authoring, }; - slots::start_slot_worker::<_, _, _, _, _, AuraSlotCompatible, _>( + register_aura_inherent_data_provider( + &inherent_data_providers, + slot_duration.0.slot_duration() + )?; + Ok(slots::start_slot_worker::<_, _, _, _, _, AuraSlotCompatible>( slot_duration.0, select_chain, - Arc::new(worker), + worker, sync_oracle, - on_exit, inherent_data_providers - ) + )) } struct AuraWorker { @@ -183,7 +183,6 @@ struct AuraWorker { env: Arc, local_key: Arc

, sync_oracle: SO, - inherent_data_providers: InherentDataProviders, force_authoring: bool, } @@ -208,13 +207,6 @@ impl SlotWorker for AuraWorker w { type OnSlot = Box + Send>; - fn on_start( - &self, - slot_duration: u64 - ) -> Result<(), consensus_common::Error> { - register_aura_inherent_data_provider(&self.inherent_data_providers, slot_duration) - } - fn on_slot( &self, chain_head: B::Header, @@ -902,7 +894,7 @@ mod tests { &inherent_data_providers, slot_duration.get() ).expect("Registers aura inherent data provider"); - let aura = start_aura::<_, _, _, _, _, sr25519::Pair, _, _, _, _>( + let aura = start_aura::<_, _, _, _, _, sr25519::Pair, _, _, _>( slot_duration, Arc::new(key.clone().into()), client.clone(), @@ -910,7 +902,6 @@ mod tests { client, environ.clone(), DummyOracle, - futures::empty(), inherent_data_providers, false, ).expect("Starts aura"); diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 0cb95c02df..c66eb68137 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -82,7 +82,7 @@ use futures::{Future, IntoFuture, future}; use tokio::timer::Timeout; use log::{error, warn, debug, info, trace}; -use slots::{SlotWorker, SlotInfo, SlotCompatible, slot_now}; +use slots::{SlotWorker, SlotData, SlotInfo, SlotCompatible, slot_now}; /// A slot duration. Create with `get_or_compute`. @@ -134,7 +134,7 @@ impl SlotCompatible for BabeSlotCompatible { } /// Parameters for BABE. -pub struct BabeParams { +pub struct BabeParams { /// The configuration for BABE. Includes the slot duration, threshold, and /// other parameters. @@ -158,9 +158,6 @@ pub struct BabeParams { /// A sync oracle pub sync_oracle: SO, - /// Exit callback. - pub on_exit: OnExit, - /// Providers for inherent data. pub inherent_data_providers: InherentDataProviders, @@ -169,7 +166,7 @@ pub struct BabeParams { } /// Start the babe worker. The returned future should be run in a tokio runtime. -pub fn start_babe(BabeParams { +pub fn start_babe(BabeParams { config, local_key, client, @@ -177,10 +174,9 @@ pub fn start_babe(BabeParams { block_import, env, sync_oracle, - on_exit, inherent_data_providers, force_authoring, -}: BabeParams) -> Result< +}: BabeParams) -> Result< impl Future, consensus_common::Error, > where @@ -200,26 +196,24 @@ pub fn start_babe(BabeParams { I: BlockImport + Send + Sync + 'static, Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, SO: SyncOracle + Send + Sync + Clone, - 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, _>( + register_babe_inherent_data_provider(&inherent_data_providers, config.0.slot_duration())?; + Ok(slots::start_slot_worker::<_, _, _, _, _, BabeSlotCompatible>( config.0, select_chain, - Arc::new(worker), + worker, sync_oracle, - on_exit, inherent_data_providers - ) + )) } struct BabeWorker { @@ -228,7 +222,6 @@ struct BabeWorker { env: Arc, local_key: Arc, sync_oracle: SO, - inherent_data_providers: InherentDataProviders, force_authoring: bool, threshold: u64, } @@ -253,13 +246,6 @@ impl SlotWorker for BabeWorker w { 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, @@ -985,7 +971,6 @@ mod tests { client, env: environ.clone(), sync_oracle: DummyOracle, - on_exit: futures::empty(), inherent_data_providers, force_authoring: false, }).expect("Starts babe"); diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index 783cb018b9..aee398a9ce 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -41,7 +41,7 @@ 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::sync::mpsc; use std::thread; /// A worker that should be invoked at every new slot. @@ -51,7 +51,8 @@ pub trait SlotWorker { type OnSlot: IntoFuture; /// Called when the proposer starts. - fn on_start(&self, slot_duration: u64) -> Result<(), consensus_common::Error>; + #[deprecated(note = "Not called. Please perform any initialization before calling start_slot_worker.")] + fn on_start(&self, _slot_duration: u64) -> Result<(), consensus_common::Error> { Ok(()) } /// Called when a new slot is triggered. fn on_slot(&self, chain_head: B::Header, slot_info: SlotInfo) -> Self::OnSlot; @@ -70,7 +71,7 @@ pub trait SlotCompatible { pub fn start_slot_worker_thread( slot_duration: SlotDuration, select_chain: C, - worker: Arc, + worker: W, sync_oracle: SO, on_exit: OnExit, inherent_data_providers: InherentDataProviders, @@ -97,29 +98,19 @@ where } }; - let slot_worker_future = match start_slot_worker::<_, _, _, T, _, SC, _>( + let slot_worker_future = 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; - } - }; + ); + + result_sender + .send(Ok(())) + .expect("Receive is not dropped before receiving a result; qed"); - let _ = runtime.block_on(slot_worker_future); + let _ = runtime.block_on(slot_worker_future.select(on_exit).map(|_| ())); }); result_recv @@ -128,67 +119,58 @@ where } /// Start a new slot worker. -pub fn start_slot_worker( +/// +/// Every time a new slot is triggered, `worker.on_slot` is called and the future it returns is +/// polled until completion, unless we are major syncing. +pub fn start_slot_worker( slot_duration: SlotDuration, client: C, - worker: Arc, + worker: W, sync_oracle: SO, - on_exit: OnExit, inherent_data_providers: InherentDataProviders, -) -> Result, consensus_common::Error> +) -> impl Future 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."); + let SlotDuration(slot_duration) = slot_duration; + + // rather than use a timer interval, we schedule our waits ourselves + let mut authorship = Slots::::new(slot_duration.slot_duration(), inherent_data_providers) + .map_err(|e| debug!(target: "slots", "Faulty timer: {:?}", e)) + .for_each(move |slot_info| { + // 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(())); } - - 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(())) => (), + }; + + Either::A(worker.on_slot(chain_head, slot_info).into_future().map_err( + |e| warn!(target: "slots", "Encountered consensus error: {:?}", e), + )) + }); + + future::poll_fn(move || + loop { + let mut authorship = std::panic::AssertUnwindSafe(&mut authorship); + match std::panic::catch_unwind(move || authorship.poll()) { + Ok(Ok(Async::Ready(()))) => + warn!(target: "slots", "Slots stream has terminated unexpectedly."), + Ok(Ok(Async::NotReady)) => break Ok(Async::NotReady), Ok(Err(())) => warn!(target: "slots", "Authorship task terminated unexpectedly. Restarting"), Err(e) => { if let Some(s) = e.downcast_ref::<&'static str>() { @@ -198,12 +180,8 @@ where warn!(target: "slots", "Restarting authorship task"); } } - - Ok(future::Loop::Continue(())) - }) - }); - - Ok(work.select(on_exit).then(|_| Ok(()))) + } + ) } /// A header which has been checked diff --git a/node-template/src/service.rs b/node-template/src/service.rs index c8f5dfc0a1..25e7db8dec 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -14,6 +14,7 @@ use substrate_service::{ }; use basic_authorship::ProposerFactory; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; +use futures::prelude::*; use substrate_client::{self as client, LongestChain}; use primitives::{ed25519::Pair, Pair as PairT}; use inherents::InherentDataProviders; @@ -75,7 +76,7 @@ construct_service_factory! { let client = service.client(); let select_chain = service.select_chain() .ok_or_else(|| ServiceError::SelectChainRequired)?; - executor.spawn(start_aura( + let aura = start_aura( SlotDuration::get_or_compute(&*client)?, key.clone(), client.clone(), @@ -83,10 +84,10 @@ construct_service_factory! { client, proposer, service.network(), - service.on_exit(), service.config.custom.inherent_data_providers.clone(), service.config.force_authoring, - )?); + )?; + executor.spawn(aura.select(service.on_exit()).then(|_| Ok(()))); } Ok(service) diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 415ddbe71b..1458392b0f 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -26,6 +26,7 @@ use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, Nothing use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use node_executor; use primitives::{Pair as PairT, ed25519}; +use futures::prelude::*; use node_primitives::Block; use node_runtime::{GenesisConfig, RuntimeApi}; use substrate_service::{ @@ -92,7 +93,7 @@ construct_service_factory! { let client = service.client(); let select_chain = service.select_chain() .ok_or(ServiceError::SelectChainRequired)?; - executor.spawn(start_aura( + let aura = start_aura( SlotDuration::get_or_compute(&*client)?, key.clone(), client, @@ -100,10 +101,10 @@ construct_service_factory! { block_import.clone(), proposer, service.network(), - service.on_exit(), service.config.custom.inherent_data_providers.clone(), service.config.force_authoring, - )?); + )?; + executor.spawn(aura.select(service.on_exit()).then(|_| Ok(()))); info!("Running Grandpa session as Authority {}", key.public()); } -- GitLab From 21e63bc3ee107f36b0301fff3f4fd3c3c9079577 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 5 Jun 2019 18:14:42 +0300 Subject: [PATCH 083/140] Light client integration tests (#2638) * add light nodes to test_sync && test_consensus * forbid light2light connections * add light nodes to test_connectivity * fixed light2light connection penalty * post-merge fixes * remove best_queued from Client info --- core/client/src/client.rs | 6 -- core/network/src/protocol.rs | 13 ++- core/network/src/sync.rs | 8 +- core/service/test/src/lib.rs | 159 +++++++++++++++++++++++++++-------- 4 files changed, 138 insertions(+), 48 deletions(-) diff --git a/core/client/src/client.rs b/core/client/src/client.rs index f3040f13da..b076d24b18 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -168,10 +168,6 @@ pub trait BlockBody { pub struct ClientInfo { /// Best block hash. pub chain: ChainInfo, - /// Best block number in the queue. - pub best_queued_number: Option<<::Header as HeaderT>::Number>, - /// Best queued block hash. - pub best_queued_hash: Option, } /// Block status. @@ -1171,8 +1167,6 @@ impl Client where let info = self.backend.blockchain().info(); ClientInfo { chain: info, - best_queued_hash: None, - best_queued_number: None, } } diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index a824bd58d3..651f064513 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -845,13 +845,22 @@ impl, H: ExHashT> Protocol { network_out.disconnect_peer(who); return; } + if self.config.roles.is_light() { + // we're not interested in light peers + if status.roles.is_light() { + debug!(target: "sync", "Peer {} is unable to serve light requests", who); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); + return; + } + + // we don't interested in peers that are far behind us let self_best_block = self .context_data .chain .info() - .best_queued_number - .unwrap_or_else(|| Zero::zero()); + .chain.best_number; let blocks_difference = self_best_block .checked_sub(&status.best_number) .unwrap_or_else(Zero::zero) diff --git a/core/network/src/sync.rs b/core/network/src/sync.rs index 62cb0ce14d..f3f62cac01 100644 --- a/core/network/src/sync.rs +++ b/core/network/src/sync.rs @@ -191,8 +191,8 @@ impl ChainSync { _genesis_hash: info.chain.genesis_hash, peers: HashMap::new(), 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), + best_queued_hash: info.chain.best_hash, + best_queued_number: info.chain.best_number, extra_requests: ExtraRequestsAggregator::new(), role, required_block_attributes, @@ -852,8 +852,8 @@ impl ChainSync { self.best_importing_number = Zero::zero(); self.blocks.clear(); let info = protocol.client().info(); - self.best_queued_hash = info.best_queued_hash.unwrap_or(info.chain.best_hash); - self.best_queued_number = info.best_queued_number.unwrap_or(info.chain.best_number); + self.best_queued_hash = info.chain.best_hash; + self.best_queued_number = info.chain.best_number; debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); let ids: Vec = self.peers.drain().map(|(id, _)| id).collect(); for id in ids { diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index 7a6d530030..c31196af97 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -46,23 +46,38 @@ struct TestNet { runtime: Runtime, authority_nodes: Vec<(u32, Arc, Multiaddr)>, full_nodes: Vec<(u32, Arc, Multiaddr)>, - _light_nodes: Vec<(u32, Arc)>, + light_nodes: Vec<(u32, Arc, Multiaddr)>, chain_spec: FactoryChainSpec, base_port: u16, nodes: usize, } impl TestNet { - pub fn run_until_all_full bool + 'static>(&mut self, predicate: P) { + pub fn run_until_all_full( + &mut self, + full_predicate: FP, + light_predicate: LP, + ) + where + FP: Send + Sync + Fn(u32, &F::FullService) -> bool + 'static, + LP: Send + Sync + Fn(u32, &F::LightService) -> bool + 'static, + { let full_nodes = self.full_nodes.clone(); + let light_nodes = self.light_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)) { - Err(()) - } else { - Ok(()) + let full_ready = full_nodes.iter().all(|&(ref id, ref service, _)| full_predicate(*id, service)); + if !full_ready { + return Ok(()); + } + + let light_ready = light_nodes.iter().all(|&(ref id, ref service, _)| light_predicate(*id, service)); + if !light_ready { + return Ok(()); } + + Err(()) }) .timeout(MAX_WAIT_TIME); @@ -152,7 +167,7 @@ impl TestNet { runtime, authority_nodes: Default::default(), full_nodes: Default::default(), - _light_nodes: Default::default(), + light_nodes: Default::default(), chain_spec: spec.clone(), base_port, nodes: 0, @@ -186,28 +201,46 @@ impl TestNet { })); nodes += full as usize; - self._light_nodes.extend((nodes..nodes + light as usize).map(|index| (index as u32, - Arc::new(F::new_light(node_config::(index as u32, &spec, Roles::LIGHT, None, base_port, &temp), executor.clone()) - .expect("Error creating test node service"))) - )); + self.light_nodes.extend((nodes..nodes + light as usize).map(|index| { + let node_config = node_config::(index as u32, &spec, Roles::LIGHT, None, base_port, &temp); + let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); + let service = Arc::new(F::new_light(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 += light as usize; + self.nodes = nodes; } } pub fn connectivity(spec: FactoryChainSpec) { - const NUM_NODES: u32 = 10; + const NUM_FULL_NODES: u32 = 5; + const NUM_LIGHT_NODES: u32 = 5; { let temp = TempDir::new("substrate-connectivity-test").expect("Error creating test dir"); let runtime = { - let mut network = TestNet::::new(&temp, spec.clone(), NUM_NODES, 0, vec![], 30400); + let mut network = TestNet::::new( + &temp, + spec.clone(), + NUM_FULL_NODES, + NUM_LIGHT_NODES, + vec![], + 30400, + ); info!("Checking star topology"); 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_debug_info().len() == NUM_NODES as usize - 1 + for (_, service, _) in network.light_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); + } + network.run_until_all_full( + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize - 1 + + NUM_LIGHT_NODES as usize, + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize, ); network.runtime }; @@ -219,16 +252,35 @@ pub fn connectivity(spec: FactoryChainSpec) { { let temp = TempDir::new("substrate-connectivity-test").expect("Error creating test dir"); { - let mut network = TestNet::::new(&temp, spec, NUM_NODES, 0, vec![], 30400); + let mut network = TestNet::::new( + &temp, + spec, + NUM_FULL_NODES, + NUM_LIGHT_NODES, + vec![], + 30400, + ); info!("Checking linked topology"); 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(); + let max_nodes = ::std::cmp::max(NUM_FULL_NODES, NUM_LIGHT_NODES); + for i in 0..max_nodes { + if i != 0 { + if let Some((_, service, node_id)) = network.full_nodes.get(i as usize) { + service.network().add_reserved_peer(address.to_string()).expect("Error adding reserved peer"); + address = node_id.clone(); + } + } + + if let Some((_, service, node_id)) = network.light_nodes.get(i as usize) { + 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_debug_info().len() == NUM_NODES as usize - 1 - }); + network.run_until_all_full( + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize - 1 + + NUM_LIGHT_NODES as usize, + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize, + ); } temp.close().expect("Error removing temp dir"); } @@ -244,10 +296,18 @@ where B: FnMut(&F::FullService) -> ImportBlock, E: FnMut(&F::FullService) -> FactoryExtrinsic, { - const NUM_NODES: u32 = 10; + const NUM_FULL_NODES: u32 = 10; + const NUM_LIGHT_NODES: u32 = 10; 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); + let mut network = TestNet::::new( + &temp, + spec.clone(), + NUM_FULL_NODES, + NUM_LIGHT_NODES, + vec![], + 30500, + ); info!("Checking block sync"); let first_address = { let first_service = &network.full_nodes[0].1; @@ -264,15 +324,22 @@ where 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().chain.best_number == NUM_BLOCKS.into() + for (_, service, _) in network.light_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().chain.best_number == NUM_BLOCKS.into(), + |_index, service| + service.client().info().chain.best_number == NUM_BLOCKS.into(), ); info!("Checking extrinsic propagation"); let first_service = network.full_nodes[0].1.clone(); let best_block = BlockId::number(first_service.client().info().chain.best_number); first_service.transaction_pool().submit_one(&best_block, extrinsic_factory(&first_service)).unwrap(); - network.run_until_all_full(|_index, service| - service.transaction_pool().ready().count() == 1 + network.run_until_all_full( + |_index, service| service.transaction_pool().ready().count() == 1, + |_index, _service| true, ); } @@ -280,27 +347,47 @@ pub fn consensus(spec: FactoryChainSpec, authorities: Vec) where F: ServiceFactory, { - const NUM_NODES: u32 = 10; + const NUM_FULL_NODES: u32 = 10; + const NUM_LIGHT_NODES: u32 = 0; const NUM_BLOCKS: u32 = 10; // 10 * 2 sec block production time = ~20 seconds 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); + let mut network = TestNet::::new( + &temp, + spec.clone(), + NUM_FULL_NODES / 2, + NUM_LIGHT_NODES / 2, + authorities, + 30600, + ); info!("Checking consensus"); 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.light_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.to_string()).expect("Error adding reserved peer"); } - network.run_until_all_full(|_index, service| { - service.client().info().chain.finalized_number >= (NUM_BLOCKS / 2).into() - }); + network.run_until_all_full( + |_index, service| + service.client().info().chain.finalized_number >= (NUM_BLOCKS / 2).into(), + |_index, service| + service.client().info().chain.best_number >= (NUM_BLOCKS / 2).into(), + ); info!("Adding more peers"); - network.insert_nodes(&temp, NUM_NODES / 2, 0, vec![]); + network.insert_nodes(&temp, NUM_FULL_NODES / 2, NUM_LIGHT_NODES / 2, vec![]); 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().chain.finalized_number >= NUM_BLOCKS.into() + for (_, service, _) in network.light_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().chain.finalized_number >= NUM_BLOCKS.into(), + |_index, service| + service.client().info().chain.best_number >= NUM_BLOCKS.into(), ); } -- GitLab From 498452517f95d399ed1b422ea5097d2aa984fd02 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 5 Jun 2019 19:08:28 +0200 Subject: [PATCH 084/140] Fix subkey (#2798) * Fix ed25519 crypto * Add test * Remove unneeded import * Remove unneeded type * Remove unneeded clutter --- core/primitives/src/ed25519.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/primitives/src/ed25519.rs b/core/primitives/src/ed25519.rs index 135c551e45..e593e997a4 100644 --- a/core/primitives/src/ed25519.rs +++ b/core/primitives/src/ed25519.rs @@ -413,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.0.public.to_bytes(); + let mut acc = self.0.secret.to_bytes(); for j in path { match j { DeriveJunction::Soft(_cc) => return Err(DeriveError::SoftKeyInPath), @@ -473,7 +473,7 @@ impl TraitPair for Pair { impl Pair { /// Get the seed for this key. pub fn seed(&self) -> &Seed { - self.0.public.as_bytes() + self.0.secret.as_bytes() } /// Exactly as `from_string` except that if no matches are found then, the the first 32 @@ -502,6 +502,16 @@ mod test { ); } + #[test] + fn seed_and_derive_should_work() { + let seed = hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60"); + let pair = Pair::from_seed(seed); + assert_eq!(pair.seed(), &seed); + let path = vec![DeriveJunction::Hard([0u8; 32])]; + let derived = pair.derive(path.into_iter()).ok().unwrap(); + assert_eq!(derived.seed(), &hex!("ede3354e133f9c8e337ddd6ee5415ed4b4ffe5fc7d21e933f4930a3730e5b21c")); + } + #[test] fn test_vector_should_work() { let pair: Pair = Pair::from_seed(hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60")); -- GitLab From 0d364a3bc180e0abea52a3c0991531ddacf99f4f Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 6 Jun 2019 11:50:22 +0200 Subject: [PATCH 085/140] Update to libp2p 0.9.1 (#2804) --- Cargo.lock | 62 ++++++++++++++-------------- core/network-libp2p/Cargo.toml | 2 +- core/network-libp2p/src/transport.rs | 4 +- 3 files changed, 33 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b1b933c3a6..b0c9eb1473 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1491,13 +1491,13 @@ dependencies = [ [[package]] name = "libp2p" -version = "0.9.0" +version = "0.9.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.27 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1514,7 +1514,7 @@ dependencies = [ "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-websocket 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1528,7 +1528,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.9.0" +version = "0.9.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)", @@ -1577,7 +1577,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1587,7 +1587,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1603,7 +1603,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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.2 (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)", @@ -1620,7 +1620,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1645,7 +1645,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1669,7 +1669,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1690,7 +1690,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1707,7 +1707,7 @@ dependencies = [ "curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1726,7 +1726,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1743,7 +1743,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1755,7 +1755,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1774,7 +1774,7 @@ dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1799,7 +1799,7 @@ dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1812,7 +1812,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1824,7 +1824,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.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.45 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1833,15 +1833,15 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.9.0" +version = "0.9.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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "soketto 0.1.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.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-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1855,7 +1855,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3317,7 +3317,7 @@ dependencies = [ [[package]] name = "soketto" -version = "0.1.0-alpha.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4154,7 +4154,7 @@ dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4347,7 +4347,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4406,7 +4406,7 @@ name = "substrate-peerset" version = "2.0.0" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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)", @@ -5872,8 +5872,8 @@ dependencies = [ "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "6281b86796ba5e4366000be6e9e18bf35580adf9e63fbe2294aadb587613a319" "checksum libloading 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a5692f82b51823e27c4118b3e5c0d98aee9be90633ebc71ad12afef380b50219" -"checksum libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f91d477f61c3451da12de273cbf281a1828eea686248999412e6e6fb23dcbc60" -"checksum libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "805f65e99f0c4cc4d6234263325f288fb231468b128dd66e469d4851141f3a26" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" "checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" "checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" "checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" @@ -5890,7 +5890,7 @@ dependencies = [ "checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" "checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" "checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" -"checksum libp2p-websocket 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a837bca8813fec5bd7dcb849d2f5f673ddca36e079ac485edfb8fa221a9d752" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" "checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "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" @@ -6033,7 +6033,7 @@ dependencies = [ "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 soketto 0.1.0-alpha.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8baac924db1b5f020050d7c8f8475c09d5ff11676101500fd0d3fdd184e67e" +"checksum soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "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" diff --git a/core/network-libp2p/Cargo.toml b/core/network-libp2p/Cargo.toml index 8a03a1c511..16978ed02c 100644 --- a/core/network-libp2p/Cargo.toml +++ b/core/network-libp2p/Cargo.toml @@ -12,7 +12,7 @@ byteorder = "1.3" bytes = "0.4" fnv = "1.0" futures = "0.1" -libp2p = { version = "0.9.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } +libp2p = { version = "0.9.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } parking_lot = "0.8.0" lazy_static = "1.2" log = "0.4" diff --git a/core/network-libp2p/src/transport.rs b/core/network-libp2p/src/transport.rs index e1843476d9..f6790c98f4 100644 --- a/core/network-libp2p/src/transport.rs +++ b/core/network-libp2p/src/transport.rs @@ -68,9 +68,7 @@ pub fn build_transport( .map(|(id, muxer)| (id, core::muxing::StreamMuxerBox::new(muxer))) }) .with_timeout(Duration::from_secs(20)) - // TODO: pass the error directly, instead of calling `to_string()` - // https://github.com/libp2p/rust-libp2p/issues/1162 - .map_err(|err| io::Error::new(io::ErrorKind::Other, err.to_string())) + .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) .boxed(); (transport, sinks) -- GitLab From d6e91c1335995ba4d046ced403a62ec0338fcb37 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 6 Jun 2019 15:53:22 +0200 Subject: [PATCH 086/140] Require --locked when building runtime (#2813) * Require --locked when building runtime * Update locks * Do it in a different way * Accidentally reverted Cargo.lock * pass on arguments in build.sh scripts --- .gitlab-ci.yml | 8 ++++---- core/executor/wasm/build.sh | 2 +- core/test-runtime/wasm/Cargo.lock | 14 +++++++------- core/test-runtime/wasm/build.sh | 2 +- node-template/runtime/wasm/Cargo.lock | 12 ++++++------ node-template/runtime/wasm/build.sh | 2 +- node/runtime/wasm/Cargo.lock | 12 ++++++------ node/runtime/wasm/build.sh | 2 +- scripts/build.sh | 2 +- 9 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b82a3f1392..ffe0de9cd5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -92,7 +92,7 @@ test-linux-stable: &test variables: - $DEPLOY_TAG script: - - ./scripts/build.sh + - ./scripts/build.sh --locked - time cargo test --all --release --verbose --locked - sccache -s @@ -117,7 +117,7 @@ test-linux-stable-int: &test - $DEPLOY_TAG before_script: - sccache -s - - ./scripts/build.sh + - ./scripts/build.sh --locked script: - time RUST_LOG=sync=trace,consensus=trace,client=trace,state-db=trace,db=trace,forks=trace,state_db=trace,storage_cache=trace cargo test -p node-cli --release --verbose --locked -- --ignored --test-threads=1 - sccache -s @@ -172,7 +172,7 @@ build-linux-release: tags: - linux-docker script: - - ./scripts/build.sh + - ./scripts/build.sh --locked - time cargo build --release --verbose - mkdir -p ./artifacts - mv ./target/release/substrate ./artifacts/. @@ -204,7 +204,7 @@ build-rust-doc-release: tags: - linux-docker script: - - ./scripts/build.sh + - ./scripts/build.sh --locked - rm -f ./crate-docs/index.html # use it as an indicator if the job succeeds - time cargo +nightly doc --release --all --verbose - cp -R ./target/doc ./crate-docs diff --git a/core/executor/wasm/build.sh b/core/executor/wasm/build.sh index c23ac076e2..fe2faeec62 100755 --- a/core/executor/wasm/build.sh +++ b/core/executor/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $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 test do wasm-gc target/wasm32-unknown-unknown/release/runtime_$i.wasm target/wasm32-unknown-unknown/release/runtime_$i.compact.wasm diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index 8763845ab7..ebf96f3fa6 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -2474,7 +2474,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2531,7 +2531,7 @@ dependencies = [ "libp2p 0.9.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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", @@ -2547,7 +2547,7 @@ dependencies = [ "futures 0.1.27 (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)", + "parking_lot 0.8.0 (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", @@ -2566,7 +2566,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", "substrate-panic-handler 2.0.0", @@ -2583,7 +2583,7 @@ name = "substrate-inherents" version = "2.0.0" dependencies = [ "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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2659,7 +2659,7 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", @@ -2673,7 +2673,7 @@ 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)", + "parking_lot 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)", "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/core/test-runtime/wasm/build.sh b/core/test-runtime/wasm/build.sh index 635532babf..0529a974ff 100755 --- a/core/test-runtime/wasm/build.sh +++ b/core/test-runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $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 substrate_test_runtime do wasm-gc "target/wasm32-unknown-unknown/release/$i.wasm" "target/wasm32-unknown-unknown/release/$i.compact.wasm" diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index 2dc001522c..ec014da1b9 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -2627,7 +2627,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2674,7 +2674,7 @@ dependencies = [ "libp2p 0.9.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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", @@ -2693,7 +2693,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", "substrate-panic-handler 2.0.0", @@ -2710,7 +2710,7 @@ name = "substrate-inherents" version = "2.0.0" dependencies = [ "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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2786,7 +2786,7 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", @@ -2800,7 +2800,7 @@ 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)", + "parking_lot 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)", "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/node-template/runtime/wasm/build.sh b/node-template/runtime/wasm/build.sh index f5761cbb1e..566e5de35d 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_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $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/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index 8ec68521c2..d72146ad03 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -2762,7 +2762,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2809,7 +2809,7 @@ dependencies = [ "libp2p 0.9.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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", @@ -2828,7 +2828,7 @@ dependencies = [ "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.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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", "substrate-panic-handler 2.0.0", @@ -2856,7 +2856,7 @@ name = "substrate-inherents" version = "2.0.0" dependencies = [ "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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2932,7 +2932,7 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (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)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", @@ -2946,7 +2946,7 @@ 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)", + "parking_lot 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)", "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/node/runtime/wasm/build.sh b/node/runtime/wasm/build.sh index f0b7c961bd..9a9f412bfc 100755 --- a/node/runtime/wasm/build.sh +++ b/node/runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $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_runtime do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm diff --git a/scripts/build.sh b/scripts/build.sh index 46bc74b7a9..8b3557159b 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -19,7 +19,7 @@ do echo "*** Building wasm binaries in $SRC" cd "$PROJECT_ROOT/$SRC" - ./build.sh + ./build.sh $@ cd - >> /dev/null done -- GitLab From e4bd5085054dec7066bd886713c81ae96462d9f8 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 6 Jun 2019 22:12:55 +0200 Subject: [PATCH 087/140] Don't pass the Endpoint as message (#2814) --- .../src/custom_proto/behaviour.rs | 10 +++++----- .../network-libp2p/src/custom_proto/handler.rs | 18 +++++++++++------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/core/network-libp2p/src/custom_proto/behaviour.rs b/core/network-libp2p/src/custom_proto/behaviour.rs index 0aa6ed9544..41b3b32218 100644 --- a/core/network-libp2p/src/custom_proto/behaviour.rs +++ b/core/network-libp2p/src/custom_proto/behaviour.rs @@ -412,7 +412,7 @@ impl CustomProto { debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", occ_entry.key()); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: occ_entry.key().clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *occ_entry.into_mut() = PeerState::Enabled { connected_point, open }; }, @@ -430,7 +430,7 @@ impl CustomProto { debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", occ_entry.key()); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: occ_entry.key().clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *occ_entry.into_mut() = PeerState::Enabled { connected_point, open: false }; }, @@ -551,7 +551,7 @@ impl CustomProto { debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", incoming.peer_id); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: incoming.peer_id, - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *state = PeerState::Enabled { open: false, connected_point }; @@ -634,7 +634,7 @@ where 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()), + event: CustomProtoHandlerIn::Enable, }); *st = PeerState::Enabled { open: false, connected_point }; } @@ -985,7 +985,7 @@ where debug!(target: "sub-libp2p", "Handler({:?}) <= Enable now that ban has expired", peer_id); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: peer_id.clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *peer_state = PeerState::Enabled { connected_point, open }; } diff --git a/core/network-libp2p/src/custom_proto/handler.rs b/core/network-libp2p/src/custom_proto/handler.rs index 01644f6214..0400c27f82 100644 --- a/core/network-libp2p/src/custom_proto/handler.rs +++ b/core/network-libp2p/src/custom_proto/handler.rs @@ -118,10 +118,11 @@ where self.protocol.clone() } - fn into_handler(self, remote_peer_id: &PeerId, _: &ConnectedPoint) -> Self::Handler { + fn into_handler(self, remote_peer_id: &PeerId, connected_point: &ConnectedPoint) -> Self::Handler { let clock = Clock::new(); CustomProtoHandler { protocol: self.protocol, + endpoint: connected_point.to_endpoint(), remote_peer_id: remote_peer_id.clone(), state: ProtocolState::Init { substreams: SmallVec::new(), @@ -145,6 +146,10 @@ pub struct CustomProtoHandler { /// any influence on the behaviour. remote_peer_id: PeerId, + /// Whether we are the connection dialer or listener. Used to determine who, between the local + /// node and the remote node, has priority. + endpoint: Endpoint, + /// Queue of events to send to the outside. /// /// This queue must only ever be modified to insert elements at the back, or remove the first @@ -208,9 +213,8 @@ enum ProtocolState { /// Event that can be received by a `CustomProtoHandler`. #[derive(Debug)] pub enum CustomProtoHandlerIn { - /// The node should start using custom protocols. Contains whether we are the dialer or the - /// listener of the connection. - Enable(Endpoint), + /// The node should start using custom protocols. + Enable, /// The node should stop using custom protocols. Disable, @@ -265,7 +269,7 @@ where TMessage: CustomMessage, { /// Enables the handler. - fn enable(&mut self, endpoint: Endpoint) { + fn enable(&mut self) { self.state = match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { error!(target: "sub-libp2p", "Handler with {:?} is in poisoned state", @@ -275,7 +279,7 @@ where ProtocolState::Init { substreams: incoming, .. } => { if incoming.is_empty() { - if let Endpoint::Dialer = endpoint { + if let Endpoint::Dialer = self.endpoint { self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(self.protocol.clone()), info: (), @@ -557,7 +561,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { fn inject_event(&mut self, message: CustomProtoHandlerIn) { match message { CustomProtoHandlerIn::Disable => self.disable(), - CustomProtoHandlerIn::Enable(endpoint) => self.enable(endpoint), + CustomProtoHandlerIn::Enable => self.enable(), CustomProtoHandlerIn::SendCustomMessage { message } => self.send_message(message), } -- GitLab From f6cd473bfef46d1e8a92cb005884424939b72071 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 6 Jun 2019 22:15:38 +0200 Subject: [PATCH 088/140] Rewrite telemetry using libp2p (#2812) * Rewrite telemetry using libp2p * Update the Cargo.lock files * Apply suggestion --- .gitlab-ci.yml | 1 + Cargo.lock | 47 +-- core/service/src/lib.rs | 13 +- core/telemetry/Cargo.toml | 13 +- core/telemetry/src/lib.rs | 402 ++++++++++++-------------- core/telemetry/src/worker.rs | 203 +++++++++++++ core/telemetry/src/worker/node.rs | 220 ++++++++++++++ core/test-runtime/wasm/Cargo.lock | 279 +++++++++--------- node-template/runtime/wasm/Cargo.lock | 279 +++++++++--------- node/runtime/wasm/Cargo.lock | 279 +++++++++--------- 10 files changed, 1070 insertions(+), 666 deletions(-) create mode 100644 core/telemetry/src/worker.rs create mode 100644 core/telemetry/src/worker/node.rs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ffe0de9cd5..99b354a60b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -148,6 +148,7 @@ check-web-wasm: - 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-telemetry - time cargo web build -p substrate-trie - sccache -s tags: diff --git a/Cargo.lock b/Cargo.lock index b0c9eb1473..7e92564208 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3251,16 +3251,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -4586,17 +4576,20 @@ dependencies = [ name = "substrate-telemetry" version = "2.0.0" dependencies = [ - "lazy_static 1.3.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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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.8.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.92 (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)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (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.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4739,11 +4732,6 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "target_info" version = "0.1.0" @@ -5581,24 +5569,6 @@ dependencies = [ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -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.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.19 (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.23 (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.1" @@ -6027,7 +5997,6 @@ dependencies = [ "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" "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.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" @@ -6052,7 +6021,6 @@ dependencies = [ "checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" "checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum sysinfo 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65f0e28a49b7bf142cee89befd7077b40627d7cc70aa8a8acfe03afc26016c33" -"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.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dc4738f2e68ed2855de5ac9cdbe05c9216773ecde4739b2f095002ab03a13ef" @@ -6140,7 +6108,6 @@ dependencies = [ "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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ec91ea61b83ce033c43c06c52ddc7532f465c0153281610d44c58b74083aee1a" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 5129944c54..b33608392d 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -81,7 +81,7 @@ pub struct Service { /// Configuration of this Service pub config: FactoryFullConfiguration, _rpc: Box, - _telemetry: Option>, + _telemetry: Option, _offchain_workers: Option, ComponentBlock>>>, _telemetry_on_connect_sinks: Arc>>>, } @@ -351,8 +351,9 @@ impl Service { 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 { + let telemetry = tel::init_telemetry(tel::TelemetryConfig { endpoints, + wasm_external_transport: None, on_connect: Box::new(move || { telemetry!(SUBSTRATE_INFO; "system.connected"; "name" => name.clone(), @@ -369,7 +370,11 @@ impl Service { sink.unbounded_send(()).is_ok() }); }), - })) + }); + task_executor.spawn(telemetry.clone() + .select(exit.clone()) + .then(|_| Ok(()))); + telemetry }); Ok(Service { @@ -402,7 +407,7 @@ impl Service { } /// return a shared instance of Telemetry (if enabled) - pub fn telemetry(&self) -> Option> { + pub fn telemetry(&self) -> Option { self._telemetry.as_ref().map(|t| t.clone()) } } diff --git a/core/telemetry/Cargo.toml b/core/telemetry/Cargo.toml index f61d6bc4d3..1b19796836 100644 --- a/core/telemetry/Cargo.toml +++ b/core/telemetry/Cargo.toml @@ -6,14 +6,19 @@ description = "Telemetry utils" edition = "2018" [dependencies] +bytes = "0.4" parking_lot = "0.8.0" -lazy_static = "1.0" +futures = "0.1" +libp2p = { version = "0.9.1", default-features = false, features = ["libp2p-websocket"] } log = "0.4" rand = "0.6" 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"] } +tokio-io = "0.1" +tokio-timer = "0.2" +void = "1.0" + +[dev-dependencies] +tokio = "0.1" diff --git a/core/telemetry/src/lib.rs b/core/telemetry/src/lib.rs index 3f980c5929..3e5d8278b0 100644 --- a/core/telemetry/src/lib.rs +++ b/core/telemetry/src/lib.rs @@ -14,38 +14,95 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Telemetry utils. +//! Telemetry utilities. +//! +//! Calling `init_telemetry` registers a global `slog` logger using `slog_scope::set_global_logger`. +//! After that, calling `slog_scope::with_logger` will return a logger that sends information to +//! the telemetry endpoints. The `telemetry!` macro is a short-cut for calling +//! `slog_scope::with_logger` followed with `slog_log!`. +//! +//! Note that you are supposed to only ever use `telemetry!` and not `slog_scope::with_logger` at +//! the moment. Substate may eventually be reworked to get proper `slog` support, including sending +//! information to the telemetry. +//! +//! The `Telemetry` struct implements `Future` and must be polled regularly (or sent to a +//! background thread/task) in order for the telemetry to properly function. Dropping the object +//! will also deregister the global logger and replace it with a logger that discards messages. +//! +//! # Example +//! +//! ```no_run +//! let telemetry = substrate_telemetry::init_telemetry(substrate_telemetry::TelemetryConfig { +//! endpoints: substrate_telemetry::TelemetryEndpoints::new(vec![ +//! // The `0` is the maximum verbosity level of messages to send to this endpoint. +//! ("wss://example.com".into(), 0) +//! ]), +//! on_connect: Box::new(|| {}), +//! // Can be used to pass an external implementation of WebSockets. +//! wasm_external_transport: None, +//! }); +//! +//! // The `telemetry` object implements `Future` and must be processed. +//! std::thread::spawn(move || { +//! tokio::run(telemetry); +//! }); +//! +//! // Sends a message on the telemetry. +//! substrate_telemetry::telemetry!(substrate_telemetry::SUBSTRATE_INFO; "test"; +//! "foo" => "bar", +//! ) +//! ``` //! -//! `telemetry` macro may be used anywhere in the Substrate codebase -//! in order to send real-time logging information to the telemetry -//! server (if there is one). We use the async drain adapter of `slog` -//! so that the logging thread doesn't get held up at all. -use std::{io, time, thread}; -use std::sync::Arc; +use futures::{prelude::*, task::AtomicTask}; +use libp2p::{Multiaddr, wasm_ext}; +use log::{trace, warn}; use parking_lot::Mutex; -use slog::{Drain, o, OwnedKVList, Record}; -use log::trace; -use rand::{thread_rng, Rng}; +use serde::{Serialize, Deserialize}; +use std::sync::{Arc, Weak}; +use std::time::{Duration, Instant}; + pub use slog_scope::with_logger; pub use slog; -use serde::{Serialize, Deserialize}; -use core::result; + +mod worker; /// Configuration for telemetry. pub struct TelemetryConfig { /// Collection of telemetry WebSocket servers with a corresponding verbosity level. pub endpoints: TelemetryEndpoints, - /// What do do when we connect to the servers. - /// Note that this closure is executed each time we connect to a telemetry endpoint. + + /// What to do when we connect to a server. + /// + /// This closure is executed each time we connect to a telemetry endpoint, either for the first + /// time or after being disconnected. pub on_connect: Box, + + /// Optional external implementation of a libp2p transport. Used in WASM contexts where we need + /// some binding between the networking provided by the operating system or environment and + /// libp2p. + /// + /// This parameter exists whatever the target platform is, but it is expected to be set to + /// `Some` only when compiling for WASM. + /// + /// > **Important**: Each individual call to `write` corresponds to one message. There is no + /// > internal buffering going on. In the context of WebSockets, each `write` + /// > must be one individual WebSockets frame. + pub wasm_external_transport: Option, } -/// Telemetry service guard. -pub type Telemetry = slog_scope::GlobalLoggerGuard; +/// List of telemetry servers we want to talk to. Contains the URL of the server, and the +/// maximum verbosity level. +/// +/// The URL string can be either a URL or a multiaddress. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TelemetryEndpoints(Vec<(String, u8)>); -/// Size of the channel for passing messages to telemetry thread. -const CHANNEL_SIZE: usize = 262_144; +impl TelemetryEndpoints { + pub fn new(endpoints: Vec<(String, u8)>) -> Self { + TelemetryEndpoints(endpoints) + } +} /// Log levels. pub const SUBSTRATE_DEBUG: &str = "9"; @@ -56,232 +113,145 @@ pub const CONSENSUS_DEBUG: &str = "5"; pub const CONSENSUS_WARN: &str = "4"; 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); - -impl Multiply { - pub fn new(v: Vec) -> Self { - Multiply(v) - } +/// Telemetry object. Implements `Future` and must be polled regularly. +/// Contains an `Arc` and can be cloned and pass around. Only one clone needs to be polled +/// regularly. +/// Dropping all the clones unregisters the telemetry. +#[derive(Clone)] +pub struct Telemetry { + inner: Arc, + /// Slog guard so that we don't get deregistered. + _guard: Arc, } -impl Drain for Multiply { - type Ok = Vec; - type Err = Vec; - - fn log(&self, record: &Record, logger_values: &OwnedKVList) -> result::Result { - let mut oks = Vec::new(); - let mut errs = Vec::new(); - - self.0.iter().for_each(|l| { - let res: Result<::Ok, ::Err> = (*l).log(record, logger_values); - match res { - Ok(o) => oks.push(o), - Err(e) => errs.push(e), - } - }); - - if !errs.is_empty() { - result::Result::Err(errs) - } else { - result::Result::Ok(oks) - } - } +// Implementation notes: considering that logging can happen at any moment, we only have two +// options: locking a mutex (which we currently do), or using a channel (which we should do). +// At the moment, `slog` doesn't provide any easy way to serialize records in order to send them +// over a channel, but ideally that's what should be done. + +/// Shared between `Telemetry` and `TelemetryDrain`. +struct TelemetryInner { + /// Worker for the telemetry. + worker: Mutex, + /// Same field as in the configuration. Called when we connected to an endpoint. + on_connect: Box, + /// Task to wake up when we add a log entry to the worker. + polling_task: AtomicTask, } -/// Initialize telemetry. -pub fn init_telemetry(config: TelemetryConfig) -> slog_scope::GlobalLoggerGuard { - let mut endpoint_drains: Vec>> = Vec::new(); - let mut out_syncs = Vec::new(); - - // Set up a filter/drain for each endpoint - config.endpoints.0.iter().for_each(|(url, verbosity)| { - let writer = TelemetryWriter::new(Arc::new(url.to_owned())); - let out_sync = writer.out.clone(); - out_syncs.push(out_sync); - - let until_verbosity = *verbosity; - let filter = slog::Filter( - slog_json::Json::default(writer).fuse(), - move |rec| { - let tag = rec.tag().parse::() - .expect("`telemetry!` macro requires tag."); - tag <= until_verbosity - }); - - let filter = Box::new(filter) as Box>; - endpoint_drains.push(filter); - }); - - // Set up logging to all endpoints - let drain = slog_async::Async::new(Multiply::new(endpoint_drains).fuse()); - let root = slog::Logger::root(drain.chan_size(CHANNEL_SIZE) - .overflow_strategy(slog_async::OverflowStrategy::DropAndReport) - .build().fuse(), o!() - ); - let logger_guard = slog_scope::set_global_logger(root); - - // Spawn a thread for each endpoint - let on_connect = Arc::new(config.on_connect); - config.endpoints.0.into_iter().for_each(|(url, verbosity)| { - let inner_verbosity = Arc::new(verbosity.to_owned()); - let inner_on_connect = Arc::clone(&on_connect); - - let out_sync = out_syncs.remove(0); - let out_sync = Arc::clone(&out_sync); - - thread::spawn(move || { - loop { - let on_connect = Arc::clone(&inner_on_connect); - let out_sync = Arc::clone(&out_sync); - let verbosity = Arc::clone(&inner_verbosity); - - trace!(target: "telemetry", - "Connecting to Telemetry at {} with verbosity {}", url, Arc::clone(&verbosity)); - - let _ = ws::connect(url.to_owned(), - |out| { - Connection::new(out, Arc::clone(&out_sync), Arc::clone(&on_connect), url.clone()) - }); - - // Sleep for a random time between 5-10 secs. If there are general connection - // issues not all threads should be synchronized in their re-connection time. - let random_sleep = thread_rng().gen_range(0, 5); - thread::sleep(time::Duration::from_secs(5) + time::Duration::from_secs(random_sleep)); - } - }); - }); - - logger_guard +/// Implements `slog::Drain`. +struct TelemetryDrain { + inner: std::panic::AssertUnwindSafe>, } -/// Translates to `slog_scope::info`, but contains an additional verbosity -/// parameter which the log record is tagged with. Additionally the verbosity -/// parameter is added to the record as a key-value pair. -#[macro_export] -macro_rules! telemetry { - ( $a:expr; $b:expr; $( $t:tt )* ) => { - $crate::with_logger(|l| { - $crate::slog::slog_info!(l, #$a, $b; $($t)* ) - }) - } -} - -struct Connection { - out: ws::Sender, - out_sync: Arc>>, - on_connect: Arc>, - url: String, -} - -impl Connection { - fn new( - out: ws::Sender, - out_sync: Arc>>, - on_connect: Arc>, - url: String - ) -> Self { - Connection { - out, - out_sync, - on_connect, - url, +/// Initializes the telemetry. See the crate root documentation for more information. +/// +/// Please be careful to not call this function twice in the same program. The `slog` crate +/// doesn't provide any way of knowing whether a global logger has already been registered. +pub fn init_telemetry(config: TelemetryConfig) -> Telemetry { + // Build the list of telemetry endpoints. + let mut endpoints = Vec::new(); + for &(ref url, verbosity) in &config.endpoints.0 { + match url_to_multiaddr(url) { + Ok(addr) => endpoints.push((addr, verbosity)), + Err(err) => warn!(target: "telemetry", "Invalid telemetry URL {}: {}", url, err), } } -} - -impl ws::Handler for Connection { - fn on_open(&mut self, _: ws::Handshake) -> ws::Result<()> { - trace!(target: "telemetry", "Connected to {}!", self.url); - - *self.out_sync.lock() = Some(self.out.clone()); - (self.on_connect)(); - Ok(()) - } - fn on_close(&mut self, code: ws::CloseCode, reason: &str) { - *self.out_sync.lock() = None; - - trace!(target: "telemetry", "Connection to {} closing due to ({:?}) {}", - self.url, code, reason); - } + let inner = Arc::new(TelemetryInner { + worker: Mutex::new(worker::TelemetryWorker::new(endpoints, config.wasm_external_transport)), + on_connect: config.on_connect, + polling_task: AtomicTask::new(), + }); - fn on_error(&mut self, _: ws::Error) { - *self.out_sync.lock() = None; + let guard = { + let logger = TelemetryDrain { inner: std::panic::AssertUnwindSafe(Arc::downgrade(&inner)) }; + let root = slog::Logger::root(slog::Drain::fuse(logger), slog::o!()); + slog_scope::set_global_logger(root) + }; - // Sleep to ensure that reconnecting isn't spamming logs. - // This happens in it's own thread so it won't block anything. - thread::sleep(time::Duration::from_millis(1000)); + Telemetry { + inner, + _guard: Arc::new(guard), } } -struct TelemetryWriter { - buffer: Vec, - out: Arc>>, - url: Arc, -} +impl Future for Telemetry { + type Item = (); + type Error = (); -impl TelemetryWriter { - fn new(url: Arc) -> Self { - let out = Arc::new(Mutex::new(None)); + fn poll(&mut self) -> Poll<(), ()> { + let before = Instant::now(); - TelemetryWriter { - buffer: Vec::new(), - out, - url, + let mut has_connected = false; + while let Async::Ready(event) = self.inner.worker.lock().poll() { + // Right now we only have one possible event. This line is here in order to not + // forget to handle any possible new event type. + let worker::TelemetryWorkerEvent::Connected = event; + has_connected = true; } - } -} -impl io::Write for TelemetryWriter { - fn write(&mut self, msg: &[u8]) -> io::Result { - let mut iter = msg.split(|x| *x == b'\n'); - let first = iter.next().expect("Split iterator always has at least one element; qed"); - - self.buffer.extend_from_slice(first); - - // Flush for each occurrence of new line character - for continued in iter { - let _ = self.flush(); - self.buffer.extend_from_slice(continued); + if before.elapsed() > Duration::from_millis(200) { + warn!(target: "telemetry", "Polling the telemetry took more than 200ms"); } - Ok(msg.len()) - } - - fn flush(&mut self) -> io::Result<()> { - if self.buffer.is_empty() { - return Ok(()); + // We use an intermediary variable `has_connected` so that the lock is released when we + // call `on_connect`. + if has_connected { + trace!(target: "telemetry", "Running on_connect handlers"); + (self.inner.on_connect)(); } - if let Ok(s) = ::std::str::from_utf8(&self.buffer[..]) { - let mut out = self.out.lock(); - - let error = if let Some(ref mut o) = *out { - let r = o.send(s); - trace!(target: "telemetry", "Sent to telemetry {}: {} -> {:?}", self.url, s, r); - r.is_err() - } else { - trace!(target: "telemetry", "Telemetry socket closed to {}, failed to send: {}", self.url, s); - false - }; + self.inner.polling_task.register(); + Ok(Async::NotReady) + } +} - if error { - *out = None; +impl slog::Drain for TelemetryDrain { + type Ok = (); + type Err = (); + + fn log(&self, record: &slog::Record, values: &slog::OwnedKVList) -> Result { + if let Some(inner) = self.inner.0.upgrade() { + let before = Instant::now(); + let result = inner.worker.lock().log(record, values); + inner.polling_task.notify(); + if before.elapsed() > Duration::from_millis(50) { + warn!(target: "telemetry", "Writing a telemetry log took more than 50ms"); } + result + } else { + Ok(()) } - self.buffer.clear(); - Ok(()) } } -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TelemetryEndpoints (Vec<(String, u8)>); +/// Parses a WebSocket URL into a libp2p `Multiaddr`. +fn url_to_multiaddr(url: &str) -> Result { + // First, assume that we have a `Multiaddr`. + let parse_error = match url.parse() { + Ok(ma) => return Ok(ma), + Err(err) => err, + }; + + // If not, try the `ws://path/url` format. + if let Ok(ma) = libp2p::multiaddr::from_url(url) { + return Ok(ma) + } -impl TelemetryEndpoints { - pub fn new(endpoints: Vec<(String, u8)>) -> Self { - TelemetryEndpoints(endpoints) + // If we have no clue about the format of that string, assume that we were expecting a + // `Multiaddr`. + Err(parse_error) +} + +/// Translates to `slog_scope::info`, but contains an additional verbosity +/// parameter which the log record is tagged with. Additionally the verbosity +/// parameter is added to the record as a key-value pair. +#[macro_export] +macro_rules! telemetry { + ( $a:expr; $b:expr; $( $t:tt )* ) => { + $crate::with_logger(|l| { + $crate::slog::slog_info!(l, #$a, $b; $($t)* ) + }) } } diff --git a/core/telemetry/src/worker.rs b/core/telemetry/src/worker.rs new file mode 100644 index 0000000000..87a3deb6ef --- /dev/null +++ b/core/telemetry/src/worker.rs @@ -0,0 +1,203 @@ +// 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 . + +//! Contains the object that makes the telemetry work. +//! +//! # Usage +//! +//! - Create a `TelemetryWorker` with `TelemetryWorker::new`. +//! - Send messages to the telemetry with `TelemetryWorker::send_message`. Messages will only be +//! sent to the appropriate targets. Messages may be ignored if the target happens to be +//! temporarily unreachable. +//! - You must appropriately poll the worker with `TelemetryWorker::poll`. Polling will/may produce +//! events indicating what happened since the latest polling. +//! + +use bytes::BytesMut; +use futures::prelude::*; +use libp2p::{core::transport::OptionalTransport, core::ConnectedPoint, Multiaddr, Transport, wasm_ext}; +use log::{trace, warn, error}; +use slog::Drain; +use std::{io, time}; +use tokio_io::AsyncWrite; + +mod node; + +/// Timeout after which a connection attempt is considered failed. Includes the WebSocket HTTP +/// upgrading. +const CONNECT_TIMEOUT: time::Duration = time::Duration::from_secs(20); + +/// Event generated when polling the worker. +#[derive(Debug)] +pub enum TelemetryWorkerEvent { + /// We have established a connection to one of the telemetry endpoint, either for the first + /// time or after having been disconnected earlier. + Connected, +} + +/// Telemetry processing machine. +#[derive(Debug)] +pub struct TelemetryWorker { + /// List of nodes with their maximum verbosity level. + nodes: Vec<(node::Node, u8)>, +} + +/// The pile of libp2p transports. +#[cfg(not(target_os = "unknown"))] +type WsTrans = libp2p::core::transport::timeout::TransportTimeout< + libp2p::core::transport::OrTransport< + libp2p::core::transport::map::Map< + OptionalTransport, + fn(wasm_ext::Connection, ConnectedPoint) -> StreamSink + >, + libp2p::websocket::framed::WsConfig> + > +>; +#[cfg(target_os = "unknown")] +type WsTrans = libp2p::core::transport::timeout::TransportTimeout< + libp2p::core::transport::map::Map< + OptionalTransport, + fn(wasm_ext::Connection, ConnectedPoint) -> StreamSink + > +>; + +impl TelemetryWorker { + /// Builds a new `TelemetryWorker`. + /// + /// The endpoints must be a list of targets, plus a verbosity level. When you send a message + /// to the telemetry, only the targets whose verbosity is higher than the verbosity of the + /// message will receive it. + pub fn new( + endpoints: impl IntoIterator, + wasm_external_transport: impl Into> + ) -> Self { + let transport = match wasm_external_transport.into() { + Some(t) => OptionalTransport::some(t), + None => OptionalTransport::none() + }.map((|inner, _| StreamSink(inner)) as fn(_, _) -> _); + + // The main transport is the `wasm_external_transport`, but if we're on desktop we add + // support for TCP+WebSocket+DNS as a fallback. In practice, you're not expected to pass + // an external transport on desktop and the fallback is used all the time. + #[cfg(not(target_os = "unknown"))] + let transport = transport.or_transport({ + let inner = libp2p::dns::DnsConfig::new(libp2p::tcp::TcpConfig::new()); + libp2p::websocket::framed::WsConfig::new(inner) + }); + + let transport = transport.with_timeout(CONNECT_TIMEOUT); + + TelemetryWorker { + nodes: endpoints.into_iter().map(|(addr, verbosity)| { + let node = node::Node::new(transport.clone(), addr); + (node, verbosity) + }).collect() + } + } + + /// Polls the worker for events that happened. + pub fn poll(&mut self) -> Async { + for (node, _) in &mut self.nodes { + loop { + match node.poll() { + Async::Ready(node::NodeEvent::Connected) => + return Async::Ready(TelemetryWorkerEvent::Connected), + Async::Ready(node::NodeEvent::Disconnected(_)) => continue, + Async::NotReady => break, + } + } + } + + Async::NotReady + } + + /// Equivalent to `slog::Drain::log`, but takes `self` by `&mut` instead, which is more convenient. + /// + /// Keep in mind that you should call `TelemetryWorker::poll` in order to process the messages. + /// You should call this function right after calling `slog::Drain::log`. + pub fn log(&mut self, record: &slog::Record, values: &slog::OwnedKVList) -> Result<(), ()> { + let msg_verbosity = match record.tag().parse::() { + Ok(v) => v, + Err(err) => { + warn!(target: "telemetry", "Failed to parse telemetry tag {:?}: {:?}", + record.tag(), err); + return Err(()) + } + }; + + // None of the nodes want that verbosity, so just return without doing any serialization. + if self.nodes.iter().all(|(_, node_max_verbosity)| msg_verbosity > *node_max_verbosity) { + trace!( + target: "telemetry", + "Skipping log entry because verbosity {:?} is too high for all endpoints", + msg_verbosity + ); + return Ok(()) + } + + // Turn the message into JSON. + let serialized = { + let mut out = Vec::new(); + slog_json::Json::default(&mut out).log(record, values).map_err(|_| ())?; + out + }; + + for (node, node_max_verbosity) in &mut self.nodes { + if msg_verbosity > *node_max_verbosity { + trace!(target: "telemetry", "Skipping {:?} for log entry with verbosity {:?}", + node.addr(), msg_verbosity); + continue; + } + + // `send_message` returns an error if we're not connected, which we silently ignore. + let _ = node.send_message(serialized.clone()); + } + + Ok(()) + } +} + +/// Wraps around an `AsyncWrite` and implements `Sink`. Guarantees that each item being sent maps +/// to one call of `write`. +/// +/// For some context, we put this object around the `wasm_ext::ExtTransport` in order to make sure +/// that each telemetry message maps to one single call to `write` in the WASM FFI. +struct StreamSink(T); +impl Sink for StreamSink { + type SinkItem = BytesMut; + type SinkError = io::Error; + + fn start_send(&mut self, item: Self::SinkItem) -> Result, io::Error> { + match self.0.write(&item[..]) { + Ok(n) if n == item.len() => Ok(AsyncSink::Ready), + Ok(_) => { + error!(target: "telemetry", + "Detected some internal buffering happening in the telemetry"); + Err(io::Error::new(io::ErrorKind::Other, "Internal buffering detected")) + }, + Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => Ok(AsyncSink::NotReady(item)), + Err(err) => Err(err), + } + } + + fn poll_complete(&mut self) -> Poll<(), io::Error> { + match self.0.flush() { + Ok(()) => Ok(Async::Ready(())), + Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => Ok(Async::NotReady), + Err(err) => Err(err), + } + } +} diff --git a/core/telemetry/src/worker/node.rs b/core/telemetry/src/worker/node.rs new file mode 100644 index 0000000000..a4d8f8d84e --- /dev/null +++ b/core/telemetry/src/worker/node.rs @@ -0,0 +1,220 @@ +// 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 . + +//! Contains the `Node` struct, which handles communications with a single telemetry endpoint. + +use bytes::BytesMut; +use futures::prelude::*; +use libp2p::Multiaddr; +use libp2p::core::transport::Transport; +use log::{trace, debug, warn, error}; +use rand::Rng as _; +use std::{collections::VecDeque, fmt, mem, time::Duration, time::Instant}; +use tokio_timer::Delay; + +/// Maximum number of pending telemetry messages. +const MAX_PENDING: usize = 10; + +/// Handler for a single telemetry node. +pub struct Node { + /// Address of the node. + addr: Multiaddr, + /// State of the connection. + socket: NodeSocket, + /// Transport used to establish new connections. + transport: TTrans, +} + +enum NodeSocket { + /// We're connected to the node. This is the normal state. + Connected(NodeSocketConnected), + /// We are currently dialing the node. + Dialing(TTrans::Dial), + /// A new connection should be started as soon as possible. + ReconnectNow, + /// Waiting before attempting to dial again. + WaitingReconnect(Delay), + /// Temporary transition state. + Poisoned, +} + +struct NodeSocketConnected { + /// Where to send data. + sink: TTrans::Output, + /// Queue of packets to send. + pending: VecDeque, + /// If true, we need to flush the sink. + need_flush: bool, +} + +/// Event that can happen with this node. +#[derive(Debug)] +pub enum NodeEvent { + /// We are now connected to this node. + Connected, + /// We are now disconnected from this node. + Disconnected(TSinkErr), +} + +impl Node { + /// Builds a new node handler. + pub fn new(transport: TTrans, addr: Multiaddr) -> Self { + Node { + addr, + socket: NodeSocket::ReconnectNow, + transport, + } + } + + /// Returns the address that was passed to `new`. + pub fn addr(&self) -> &Multiaddr { + &self.addr + } +} + +impl Node +where TTrans: Clone, TTrans::Output: Sink, + TSinkErr: fmt::Debug { + /// Sends a WebSocket frame to the node. Returns an error if we are not connected to the node. + /// + /// After calling this method, you should call `poll` in order for it to be properly processed. + pub fn send_message(&mut self, payload: Vec) -> Result<(), ()> { + if let NodeSocket::Connected(NodeSocketConnected { pending, .. }) = &mut self.socket { + if pending.len() <= MAX_PENDING { + trace!(target: "telemetry", "Adding log entry to queue for {:?}", self.addr); + pending.push_back(payload.into()); + Ok(()) + } else { + warn!(target: "telemetry", "Rejected log entry because queue is full for {:?}", + self.addr); + Err(()) + } + } else { + Err(()) + } + } + + /// Polls the node for updates. Must be performed regularly. + pub fn poll(&mut self) -> Async> { + let mut socket = mem::replace(&mut self.socket, NodeSocket::Poisoned); + self.socket = loop { + match socket { + NodeSocket::Connected(mut conn) => match conn.poll(&self.addr) { + Ok(Async::Ready(v)) => void::unreachable(v), + Ok(Async::NotReady) => break NodeSocket::Connected(conn), + Err(err) => { + debug!(target: "telemetry", "Disconnected from {}: {:?}", self.addr, err); + let timeout = gen_rand_reconnect_delay(); + self.socket = NodeSocket::WaitingReconnect(timeout); + return Async::Ready(NodeEvent::Disconnected(err)) + } + } + NodeSocket::Dialing(mut s) => match s.poll() { + Ok(Async::Ready(sink)) => { + debug!(target: "telemetry", "Connected to {}", self.addr); + let conn = NodeSocketConnected { sink, pending: VecDeque::new(), need_flush: false }; + self.socket = NodeSocket::Connected(conn); + return Async::Ready(NodeEvent::Connected) + }, + Ok(Async::NotReady) => break NodeSocket::Dialing(s), + Err(err) => { + debug!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); + let timeout = gen_rand_reconnect_delay(); + socket = NodeSocket::WaitingReconnect(timeout); + } + } + NodeSocket::ReconnectNow => match self.transport.clone().dial(self.addr.clone()) { + Ok(d) => { + debug!(target: "telemetry", "Started dialing {}", self.addr); + socket = NodeSocket::Dialing(d); + } + Err(err) => { + debug!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); + let timeout = gen_rand_reconnect_delay(); + socket = NodeSocket::WaitingReconnect(timeout); + } + } + NodeSocket::WaitingReconnect(mut s) => if let Ok(Async::Ready(_)) = s.poll() { + socket = NodeSocket::ReconnectNow; + } else { + break NodeSocket::WaitingReconnect(s) + } + NodeSocket::Poisoned => { + error!(target: "telemetry", "Poisoned connection with {}", self.addr); + break NodeSocket::Poisoned + } + } + }; + + Async::NotReady + } +} + +/// Generates a `Delay` object with a random timeout. +/// +/// If there are general connection issues, not all endpoints should be synchronized in their +/// re-connection time. +fn gen_rand_reconnect_delay() -> Delay { + let random_delay = rand::thread_rng().gen_range(5, 10); + Delay::new(Instant::now() + Duration::from_secs(random_delay)) +} + +impl NodeSocketConnected +where TTrans::Output: Sink { + /// Processes the queue of messages for the connected socket. + /// + /// The address is passed for logging purposes only. + fn poll(&mut self, my_addr: &Multiaddr) -> Poll { + loop { + if let Some(item) = self.pending.pop_front() { + let item_len = item.len(); + if let AsyncSink::NotReady(item) = self.sink.start_send(item)? { + self.pending.push_front(item); + break + } else { + trace!(target: "telemetry", "Successfully sent {:?} bytes message to {}", + item_len, my_addr); + self.need_flush = true; + } + + } else if self.need_flush && self.sink.poll_complete()?.is_ready() { + self.need_flush = false; + + } else { + break + } + } + + Ok(Async::NotReady) + } +} + +impl fmt::Debug for Node { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let state = match self.socket { + NodeSocket::Connected(_) => "Connected", + NodeSocket::Dialing(_) => "Dialing", + NodeSocket::ReconnectNow => "Pending reconnect", + NodeSocket::WaitingReconnect(_) => "Pending reconnect", + NodeSocket::Poisoned => "Poisoned", + }; + + f.debug_struct("Node") + .field("addr", &self.addr) + .field("state", &state) + .finish() + } +} diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index ebf96f3fa6..cbbc8402dc 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -128,6 +128,14 @@ name = "base58" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "base64" +version = "0.10.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)", +] + [[package]] name = "bigint" version = "4.4.1" @@ -617,19 +625,6 @@ name = "fnv" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -799,6 +794,16 @@ dependencies = [ "hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "http" +version = "0.1.17" +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)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "httparse" version = "1.3.3" @@ -907,11 +912,6 @@ name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" version = "0.2.55" @@ -919,13 +919,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.9.0" +version = "0.9.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.27 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -942,6 +942,7 @@ dependencies = [ "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -955,7 +956,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.9.0" +version = "0.9.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)", @@ -1004,7 +1005,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1014,7 +1015,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1030,7 +1031,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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -1047,7 +1048,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1072,7 +1073,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1096,7 +1097,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1117,7 +1118,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1134,7 +1135,7 @@ dependencies = [ "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1153,7 +1154,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1170,7 +1171,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1182,7 +1183,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1201,7 +1202,7 @@ dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1226,7 +1227,7 @@ dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1239,7 +1240,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1251,20 +1252,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.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.45 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-websocket" +version = "0.9.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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.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-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1394,17 +1413,6 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "mio-extras" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazycell 1.2.1 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mio-uds" version = "0.6.7" @@ -1512,31 +1520,6 @@ name = "opaque-debug" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "openssl" -version = "0.10.23" -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.9 (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.55 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-sys" -version = "0.9.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "owning_ref" version = "0.3.3" @@ -1744,11 +1727,6 @@ name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pkg-config" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "primitive-types" version = "0.2.4" @@ -2044,6 +2022,19 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 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)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" version = "0.1.2" @@ -2094,6 +2085,15 @@ name = "scopeguard" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "sct" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "semver" version = "0.9.0" @@ -2204,16 +2204,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -2258,6 +2248,24 @@ dependencies = [ "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (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.27 (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)", + "log 0.4.6 (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)", + "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)", +] + [[package]] name = "sourcefile" version = "0.1.4" @@ -2528,7 +2536,7 @@ dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2671,17 +2679,19 @@ dependencies = [ name = "substrate-telemetry" version = "2.0.0" dependencies = [ - "lazy_static 1.3.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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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.8.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.91 (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)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.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-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2762,11 +2772,6 @@ dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "termcolor" version = "1.0.4" @@ -2938,6 +2943,19 @@ dependencies = [ "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-sync" version = "0.1.5" @@ -3148,11 +3166,6 @@ name = "utf8-ranges" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "vcpkg" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "version_check" version = "0.1.5" @@ -3279,6 +3292,24 @@ dependencies = [ "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "weedle" version = "0.9.0" @@ -3333,24 +3364,6 @@ dependencies = [ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -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.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.19 (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.23 (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 = "ws2_32-sys" version = "0.2.1" @@ -3426,6 +3439,7 @@ dependencies = [ "checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" "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 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" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" @@ -3486,8 +3500,6 @@ dependencies = [ "checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" "checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "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" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" @@ -3510,6 +3522,7 @@ dependencies = [ "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.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 idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" @@ -3525,10 +3538,9 @@ dependencies = [ "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.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" -"checksum libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f91d477f61c3451da12de273cbf281a1828eea686248999412e6e6fb23dcbc60" -"checksum libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "805f65e99f0c4cc4d6234263325f288fb231468b128dd66e469d4851141f3a26" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" "checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" "checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" "checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" @@ -3545,6 +3557,7 @@ dependencies = [ "checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" "checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" "checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" "checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "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" @@ -3560,7 +3573,6 @@ dependencies = [ "checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" "checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" -"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.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" @@ -3574,8 +3586,6 @@ dependencies = [ "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.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" -"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" "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)" = "" @@ -3597,7 +3607,6 @@ dependencies = [ "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 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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" @@ -3632,12 +3641,14 @@ dependencies = [ "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_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" "checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" "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 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 scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "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" @@ -3651,11 +3662,11 @@ dependencies = [ "checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "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.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.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 soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "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" @@ -3669,7 +3680,6 @@ dependencies = [ "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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" -"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" @@ -3685,6 +3695,7 @@ dependencies = [ "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-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" "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" @@ -3708,7 +3719,6 @@ dependencies = [ "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" "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.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" @@ -3722,6 +3732,8 @@ dependencies = [ "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.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" "checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" @@ -3730,7 +3742,6 @@ dependencies = [ "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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" "checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index ec014da1b9..14398725e5 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -128,6 +128,14 @@ name = "base58" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "base64" +version = "0.10.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)", +] + [[package]] name = "bigint" version = "4.4.1" @@ -617,19 +625,6 @@ name = "fnv" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -799,6 +794,16 @@ dependencies = [ "hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "http" +version = "0.1.17" +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)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "httparse" version = "1.3.3" @@ -907,11 +912,6 @@ name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" version = "0.2.55" @@ -919,13 +919,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.9.0" +version = "0.9.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.27 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -942,6 +942,7 @@ dependencies = [ "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -955,7 +956,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.9.0" +version = "0.9.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)", @@ -1004,7 +1005,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1014,7 +1015,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1030,7 +1031,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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -1047,7 +1048,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1072,7 +1073,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1096,7 +1097,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1117,7 +1118,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1134,7 +1135,7 @@ dependencies = [ "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1153,7 +1154,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1170,7 +1171,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1182,7 +1183,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1201,7 +1202,7 @@ dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1226,7 +1227,7 @@ dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1239,7 +1240,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1251,20 +1252,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.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.45 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-websocket" +version = "0.9.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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.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-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1394,17 +1413,6 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "mio-extras" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazycell 1.2.1 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mio-uds" version = "0.6.7" @@ -1546,31 +1554,6 @@ name = "opaque-debug" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "openssl" -version = "0.10.23" -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.9 (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.55 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-sys" -version = "0.9.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "owning_ref" version = "0.3.3" @@ -1778,11 +1761,6 @@ name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pkg-config" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "primitive-types" version = "0.2.4" @@ -2078,6 +2056,19 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 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)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" version = "0.1.2" @@ -2128,6 +2119,15 @@ name = "scopeguard" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "sct" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "semver" version = "0.9.0" @@ -2238,16 +2238,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -2292,6 +2282,24 @@ dependencies = [ "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (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.27 (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)", + "log 0.4.6 (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)", + "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)", +] + [[package]] name = "sourcefile" version = "0.1.4" @@ -2671,7 +2679,7 @@ dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2798,17 +2806,19 @@ dependencies = [ name = "substrate-telemetry" version = "2.0.0" dependencies = [ - "lazy_static 1.3.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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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.8.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.91 (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)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.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-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2855,11 +2865,6 @@ dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "termcolor" version = "1.0.4" @@ -3031,6 +3036,19 @@ dependencies = [ "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-sync" version = "0.1.5" @@ -3241,11 +3259,6 @@ name = "utf8-ranges" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "vcpkg" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "version_check" version = "0.1.5" @@ -3372,6 +3385,24 @@ dependencies = [ "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "weedle" version = "0.9.0" @@ -3426,24 +3457,6 @@ dependencies = [ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -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.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.19 (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.23 (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 = "ws2_32-sys" version = "0.2.1" @@ -3519,6 +3532,7 @@ dependencies = [ "checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" "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 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" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" @@ -3579,8 +3593,6 @@ dependencies = [ "checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" "checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "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" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" @@ -3603,6 +3615,7 @@ dependencies = [ "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.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 idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" @@ -3618,10 +3631,9 @@ dependencies = [ "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.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" -"checksum libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f91d477f61c3451da12de273cbf281a1828eea686248999412e6e6fb23dcbc60" -"checksum libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "805f65e99f0c4cc4d6234263325f288fb231468b128dd66e469d4851141f3a26" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" "checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" "checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" "checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" @@ -3638,6 +3650,7 @@ dependencies = [ "checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" "checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" "checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" "checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "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" @@ -3653,7 +3666,6 @@ dependencies = [ "checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" "checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" -"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.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" @@ -3667,8 +3679,6 @@ dependencies = [ "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.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" -"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" "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)" = "" @@ -3690,7 +3700,6 @@ dependencies = [ "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 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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" @@ -3725,12 +3734,14 @@ dependencies = [ "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_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" "checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" "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 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 scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "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" @@ -3744,11 +3755,11 @@ dependencies = [ "checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "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.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.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 soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "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" @@ -3762,7 +3773,6 @@ dependencies = [ "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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" -"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" @@ -3778,6 +3788,7 @@ dependencies = [ "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-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" "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" @@ -3801,7 +3812,6 @@ dependencies = [ "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" "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.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" @@ -3815,6 +3825,8 @@ dependencies = [ "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.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" "checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" @@ -3823,7 +3835,6 @@ dependencies = [ "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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" "checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index d72146ad03..ab9b39afbd 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -128,6 +128,14 @@ name = "base58" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "base64" +version = "0.10.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)", +] + [[package]] name = "bigint" version = "4.4.1" @@ -617,19 +625,6 @@ name = "fnv" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -799,6 +794,16 @@ dependencies = [ "hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "http" +version = "0.1.17" +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)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "httparse" version = "1.3.3" @@ -907,11 +912,6 @@ name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" version = "0.2.55" @@ -919,13 +919,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.9.0" +version = "0.9.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.27 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -942,6 +942,7 @@ dependencies = [ "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -955,7 +956,7 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.9.0" +version = "0.9.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)", @@ -1004,7 +1005,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1014,7 +1015,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1030,7 +1031,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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (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)", @@ -1047,7 +1048,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1072,7 +1073,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1096,7 +1097,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1117,7 +1118,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1134,7 +1135,7 @@ dependencies = [ "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1153,7 +1154,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1170,7 +1171,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1182,7 +1183,7 @@ 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.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1201,7 +1202,7 @@ dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (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.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1226,7 +1227,7 @@ dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (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)", @@ -1239,7 +1240,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1251,20 +1252,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-send-wrapper 0.1.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.45 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-websocket" +version = "0.9.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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.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-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.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.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1394,17 +1413,6 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "mio-extras" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazycell 1.2.1 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mio-uds" version = "0.6.7" @@ -1568,31 +1576,6 @@ name = "opaque-debug" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "openssl" -version = "0.10.23" -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.9 (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.55 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-sys" -version = "0.9.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "owning_ref" version = "0.3.3" @@ -1800,11 +1783,6 @@ name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pkg-config" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "primitive-types" version = "0.2.4" @@ -2110,6 +2088,19 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 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)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" version = "0.1.2" @@ -2160,6 +2151,15 @@ name = "scopeguard" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "sct" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "semver" version = "0.9.0" @@ -2270,16 +2270,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -2324,6 +2314,24 @@ dependencies = [ "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (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.27 (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)", + "log 0.4.6 (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)", + "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)", +] + [[package]] name = "sourcefile" version = "0.1.4" @@ -2806,7 +2814,7 @@ dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2944,17 +2952,19 @@ dependencies = [ name = "substrate-telemetry" version = "2.0.0" dependencies = [ - "lazy_static 1.3.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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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.8.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.91 (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)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.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-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3001,11 +3011,6 @@ dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "termcolor" version = "1.0.4" @@ -3177,6 +3182,19 @@ dependencies = [ "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +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.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-sync" version = "0.1.5" @@ -3387,11 +3405,6 @@ name = "utf8-ranges" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "vcpkg" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "version_check" version = "0.1.5" @@ -3519,6 +3532,24 @@ dependencies = [ "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "weedle" version = "0.9.0" @@ -3573,24 +3604,6 @@ dependencies = [ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -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.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.19 (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.23 (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 = "ws2_32-sys" version = "0.2.1" @@ -3666,6 +3679,7 @@ dependencies = [ "checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" "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 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" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" @@ -3726,8 +3740,6 @@ dependencies = [ "checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" "checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "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" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" @@ -3750,6 +3762,7 @@ dependencies = [ "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.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 idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" @@ -3765,10 +3778,9 @@ dependencies = [ "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.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" -"checksum libp2p 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f91d477f61c3451da12de273cbf281a1828eea686248999412e6e6fb23dcbc60" -"checksum libp2p-core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "805f65e99f0c4cc4d6234263325f288fb231468b128dd66e469d4851141f3a26" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" "checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" "checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" "checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" @@ -3785,6 +3797,7 @@ dependencies = [ "checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" "checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" "checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" "checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "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" @@ -3800,7 +3813,6 @@ dependencies = [ "checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" "checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" -"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.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" @@ -3814,8 +3826,6 @@ dependencies = [ "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.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" -"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" "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)" = "" @@ -3837,7 +3847,6 @@ dependencies = [ "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 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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" @@ -3873,12 +3882,14 @@ dependencies = [ "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_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" "checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" "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 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 scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "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" @@ -3892,11 +3903,11 @@ dependencies = [ "checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "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.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.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 soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "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" @@ -3910,7 +3921,6 @@ dependencies = [ "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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" -"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" @@ -3926,6 +3936,7 @@ dependencies = [ "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-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" "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" @@ -3949,7 +3960,6 @@ dependencies = [ "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" "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.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" @@ -3963,6 +3973,8 @@ dependencies = [ "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.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" "checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" @@ -3971,7 +3983,6 @@ dependencies = [ "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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" "checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" -- GitLab From d91ea1c6c919a53cc40b721493f7272b0d1947f8 Mon Sep 17 00:00:00 2001 From: Joshy Orndorff Date: Thu, 6 Jun 2019 16:16:24 -0400 Subject: [PATCH 089/140] Move Council and Democracy logic to block initialization (#2806) * s/on_finalize/on_initialize * bump impl_version --- node/runtime/src/lib.rs | 2 +- srml/council/src/seats.rs | 2 +- srml/democracy/src/lib.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index f0c1a8ae7d..c5104f331e 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 92, - impl_version: 92, + impl_version: 93, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/council/src/seats.rs b/srml/council/src/seats.rs index 584a2fb800..15817df70b 100644 --- a/srml/council/src/seats.rs +++ b/srml/council/src/seats.rs @@ -305,7 +305,7 @@ decl_module! { >::put(count); } - fn on_finalize(n: T::BlockNumber) { + fn on_initialize(n: T::BlockNumber) { if let Err(e) = Self::end_block(n) { print("Guru meditation"); print(e); diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 96d51849c9..2ccff71869 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -485,7 +485,7 @@ decl_module! { } } - fn on_finalize(n: T::BlockNumber) { + fn on_initialize(n: T::BlockNumber) { if let Err(e) = Self::end_block(n) { runtime_io::print(e); } -- GitLab From 1407e56f83c7cdc6e4788e5252457949abba68af Mon Sep 17 00:00:00 2001 From: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> Date: Thu, 6 Jun 2019 16:16:59 -0400 Subject: [PATCH 090/140] Add digest subtypes and update dependencies (#2734) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add different digest types for different parts of the code * Add script to update dependencies * Remove an old changelog * `Inherent` → `PreRuntime` --- core/client/src/client.rs | 2 +- core/sr-primitives/src/generic/digest.rs | 171 +++++++++++++++++++---- core/sr-primitives/src/generic/mod.rs | 4 +- core/test-runtime/wasm/Cargo.lock | 6 +- node-template/runtime/wasm/Cargo.lock | 6 +- node/runtime/wasm/Cargo.lock | 6 +- scripts/update-deps.sh | 9 ++ 7 files changed, 166 insertions(+), 38 deletions(-) create mode 100755 scripts/update-deps.sh diff --git a/core/client/src/client.rs b/core/client/src/client.rs index b076d24b18..59af1b6419 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -482,7 +482,7 @@ impl Client where if first > last_num { return Err(error::Error::ChangesTrieAccessFailed("Invalid changes trie range".into())); } - let finalized_number = self.backend.blockchain().info().finalized_number; + let finalized_number = self.backend.blockchain().info().finalized_number; let oldest = storage.oldest_changes_trie_block(&config, finalized_number); let first = ::std::cmp::max(first, oldest); Ok(Some((first, last))) diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index 79a2991e5f..c0724bb134 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -58,34 +58,151 @@ impl traits::Digest for Digest where } } -/// Digest item that is able to encode/decode 'system' digest items and -/// provide opaque access to other items. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum DigestItem { - /// System digest item announcing that authorities set has been changed - /// in the block. Contains the new set of authorities. - AuthoritiesChange(Vec), - /// System digest item that contains the root of changes trie at given - /// block. It is created for every block iff runtime supports changes - /// trie creation. - ChangesTrieRoot(Hash), - /// A message from the runtime to the consensus engine. This should *never* - /// be generated by the native code of any consensus engine, but this is not - /// checked (yet). - Consensus(ConsensusEngineId, Vec), - /// Put a Seal on it. This is only used by native code, and is never seen - /// by runtimes. - Seal(ConsensusEngineId, SealSignature), - /// A pre-runtime digest. +// Macro black magic. +macro_rules! gen_digest_type { + ( + $( #[doc = $main_docs:tt] )* + pub enum $main:ident $(<$($main_params: tt),+>)? { } + $( + $( #[doc = $doc_attr:tt] )* + pub enum $n:ident $(<$($t: tt),+>)? { + $( + $( #[doc = $variant_doc:tt] )* + $variant:ident(($($interior: ty),*), $q: tt), + )* + } + )+ + ) => { + $( #[doc = $main_docs] )* + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Debug))] + pub enum $main $(<$($main_params),+>)? { + $( + $( + $( #[doc = $variant_doc] )* + $variant($($interior),*), + )* + )* + } + + gen_digest_type! { + @internal + $main : $main $(<$($main_params),+>)? => $( + $( #[doc = $doc_attr] )* + pub enum $n $(<$($t),+>)? { + $( + $( #[doc = $variant_doc] )* + $variant(($($interior),*), $q), + )* + } + )+ + } + }; + ( + @internal + $main_id:tt : $main:ty => $( + $( #[doc = $doc_attr:tt] )* + pub enum $n:ident $(<$($t: tt),+>)? { + $( + $( #[doc = $variant_doc:tt] )* + $variant:ident(($($interior: ty),*), $q: tt), + )* + } + )+ + ) => { + $( + $( #[doc = $doc_attr] )* + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Debug))] + pub enum $n $(<$($t),+>)? { + $( + $( #[doc = $variant_doc] )* + $variant($($interior),*), + )* + } + + impl From<$n $(<$($t),*>)?> + for $main { + fn from(digest: $n $(<$($t),+>)?) -> Self { + match digest { + $( + $n::$variant $q => $main_id::$variant $q, + )* + } + } + } + )* + }; +} + +gen_digest_type! { + /// Digest item that is able to encode/decode 'system' digest items and + /// provide opaque access to other items. /// - /// These are messages from the consensus engine to the runtime, although - /// the consensus engine can (and should) read them itself to avoid - /// code and state duplication. It is erroneous for a runtime to produce - /// these, but this is not (yet) checked. - PreRuntime(ConsensusEngineId, Vec), - /// Any 'non-system' digest item, opaque to the native code. - Other(Vec), + /// For all variants that include a `ConsensusEngineId`, consensus engine + /// implementations **MUST** ignore digests that have a `ConsensusEngineId` + /// that is not theirs. Node implementations **MUST** reject digests that + /// have a `ConsensusEngineId` that corresponds to a consensus engine not in + /// use. Node implementations **MUST** reject blocks as malformed if they + /// reject any of the block’s digest. If the runtime supports this, the + /// node that issued the block **SHOULD** be reported as having committed + /// severe misbehavior and punished accordingly. The invalid block, or its + /// hash, **SHOULD** constitute adequate proof of such misbehavior. + pub enum DigestItem {} + + /// A digest item that can be produced by consensus engines. Consensus + /// engine implementations **MUST NOT** push digests not in this variant. + /// This **SHOULD** be detected at compile time. If it is not, the behavior + /// of the blockchain is undefined. + pub enum ConsensusDigest { + /// Put a Seal on it. This **MUST** come after all other `DigestItem` + /// variants. There **MUST** be exactly one `Seal` per consensus engine, + /// and its `ConsensusEngineId` **MUST** be that of the consensus engine + /// that produced it. Runtimes will not see this variant. + Seal((ConsensusEngineId, SealSignature), (a, b)), + /// An inherent digest. + /// + /// These are messages from the consensus engine to the runtime, + /// although the consensus engine can (and should) read them itself to + /// avoid code and state duplication. It is erroneous for a runtime to + /// produce these, but this is checked at compile time. Runtimes can + /// (and should) trust these, as with any other inherent. Consensus + /// engines MUST verify them. + PreRuntime((ConsensusEngineId, Vec), (a, b)), + } + + /// A digest item that can be produced by runtimes. Runtime mplementations + /// **MUST NOT** push digests not in this variant. This **SHOULD** be + /// detected at compile time. If it is not, the behavior of the blockchain + /// is undefined. + pub enum RuntimeDigest { + /// A message from the runtime to the consensus engine. This MUST NOT be + /// generated by the native code of any consensus engine, but this is + /// caught at compile time. The `ConsensusEngineId` is that of the + /// consensus engine for which this digest is intended. Consensus + /// engines MUST ignore digests with `ConsensusEngineId`s other than + /// their own. + Consensus((ConsensusEngineId, Vec), (a, b)), + /// Any 'non-system' digest item, opaque to the native code. Runtimes + /// MUST verify these, and reject any they did not produce. These MUST + /// NOT be produced by native code. + Other((Vec), (a)), + } + + /// A digest item that is reserved for the SRML. Only the SRML is allowed to + /// push these digests. Consensus engines and third-party runtime code + /// **MUST NOT** push digests in this variant. This **SHOULD** be detected + /// at compile time. If it is not, the behavior of the blockchain is + /// undefined. + pub enum SystemDigest { + /// System digest item announcing that authorities set has been changed + /// in the block. Contains the new set of authorities. + AuthoritiesChange((Vec), (a)), + /// System digest item that contains the root of changes trie at given + /// block. It is created for every block iff runtime supports changes + /// trie creation. + ChangesTrieRoot((Hash), (a)), + } } #[cfg(feature = "std")] diff --git a/core/sr-primitives/src/generic/mod.rs b/core/sr-primitives/src/generic/mod.rs index 89c4291d79..d9c53c5fd4 100644 --- a/core/sr-primitives/src/generic/mod.rs +++ b/core/sr-primitives/src/generic/mod.rs @@ -36,7 +36,9 @@ pub use self::era::{Era, Phase}; pub use self::checked_extrinsic::CheckedExtrinsic; pub use self::header::Header; pub use self::block::{Block, SignedBlock, BlockId}; -pub use self::digest::{Digest, DigestItem, DigestItemRef}; +pub use self::digest::{ + Digest, DigestItem, DigestItemRef, ConsensusDigest, RuntimeDigest, SystemDigest, +}; use crate::codec::Encode; use rstd::prelude::*; diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index cbbc8402dc..be1e3ab84f 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -111,7 +111,7 @@ dependencies = [ "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2006,7 +2006,7 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3638,7 +3638,7 @@ dependencies = [ "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 ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index 14398725e5..c94150dc5b 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -111,7 +111,7 @@ dependencies = [ "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2040,7 +2040,7 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3731,7 +3731,7 @@ dependencies = [ "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 ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index ab9b39afbd..050cbdcb7e 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -111,7 +111,7 @@ dependencies = [ "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2072,7 +2072,7 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3879,7 +3879,7 @@ dependencies = [ "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 ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" diff --git a/scripts/update-deps.sh b/scripts/update-deps.sh new file mode 100755 index 0000000000..cd6b7c8538 --- /dev/null +++ b/scripts/update-deps.sh @@ -0,0 +1,9 @@ +#!/bin/sh -- +set -eu +case $0 in + (/*) dir=${0%/*}/;; + (*/*) dir=./${0%/*};; + (*) dir=.;; +esac + +find "$dir/.." -name Cargo.lock -execdir cargo update \; -- GitLab From 12f4f5d8a63df924937b0e7c69a862bf8ac82ffe Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Fri, 7 Jun 2019 14:14:18 +0200 Subject: [PATCH 091/140] srml-contract: update complexity.md (#2795) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update COMPLEXITY.md * Update the doc. * Mention child tries. And format. * most probably → most likely * Update for state rent * Apply suggestions from code review Co-Authored-By: thiolliere * Update COMPLEXITY.md --- srml/contract/COMPLEXITY.md | 63 ++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/srml/contract/COMPLEXITY.md b/srml/contract/COMPLEXITY.md index c2d75efaba..d87525a982 100644 --- a/srml/contract/COMPLEXITY.md +++ b/srml/contract/COMPLEXITY.md @@ -83,7 +83,25 @@ The size of the arguments and the return value depends on the exact function in `AccountDb` is an abstraction that supports collecting changes to accounts with the ability to efficiently reverting them. Contract execution contexts operate on the AccountDb. All changes are flushed into underlying storage only after origin transaction succeeds. -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. +## Relation to the underlying storage + +At present, `AccountDb` is implemented as a cascade of overlays with the direct storage at the bottom. The direct +storage `AccountDb` leverages child tries. 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 +and on revert, the overlay is just discarded. + +> ℹ️ The underlying storage has a overlay layer implemented as a `Map`. If the runtime reads a storage location and the +> respective key doesn't exist in the overlay, then the underlying storage performs a DB access, but the value won't be +> placed into the overlay. The overlay is only filled with writes. +> +> This means that the overlay can be abused in the following ways: +> +> - The overlay can be inflated by issuing a lot of writes to unique locations, +> - Deliberate cache misses can be induced by reading non-modified storage locations, + +It also worth noting that the performance degrades with more state stored in the trie. Due to this +there is not negligible chance that gas schedule will be updated for all operations that involve +storage access. ## get_storage, get_code_hash, get_rent_allowance, get_balance, contract_exists @@ -158,20 +176,36 @@ Assuming marshaled size of a balance value is of the constant size we can neglec This function receives input data for the contract execution. The execution consists of the following steps: -1. Loading code from the DB. -2. `transfer`-ing funds between the caller and the destination account. -3. Executing the code of the destination account. -4. Committing overlayed changed to the underlying `AccountDb`. +1. Checking rent payment. +2. Loading code from the DB. +3. `transfer`-ing funds between the caller and the destination account. +4. Executing the code of the destination account. +5. Committing overlayed changed to the underlying `AccountDb`. **Note** that the complexity of executing the contract code should be considered separately. -Loading code most probably will trigger a DB read, since the code is immutable and therefore will not get into the cache (unless a suicide removes it). +Checking for rent involves 2 unconditional DB reads: `ContractInfoOf` and `block_number` +and on top of that at most once per block: + +- DB read to `free_balance` and +- `rent_deposit_offset` and +- `rent_byte_price` and +- `Currency::minimum_balance` and +- `tombstone_deposit`. +- Calls to `ensure_can_withdraw`, `withdraw`, `make_free_balance_be` can perform arbitrary logic and should be considered separately, +- `child_storage_root` +- `kill_child_storage` +- mutation of `ContractInfoOf` + +Loading code most likely will trigger a DB read, since the code is immutable and therefore will not get into the cache (unless a suicide removes it, or it has been created in the same call chain). Also, `transfer` can make up to 2 DB reads and up to 2 DB writes (if flushed to the storage) in the standard case. If removal of the source account takes place then it will additionally perform a DB write per one storage entry that the account has. Finally, all changes are `commit`-ted into the underlying overlay. The complexity of this depends on the number of changes performed by the code. Thus, the pricing of storage modification should account for that. -**complexity**: Up to 3 DB reads. DB read of the code is of dynamic size. There can also be up to 2 DB writes (if flushed to the storage). Additionally, if the source account removal takes place a DB write will be performed per one storage entry that the account has. +**complexity**: +- Only for the first invocation of the contract: up to 5 DB reads and one DB write as well as logic executed by `ensure_can_withdraw`, `withdraw`, `make_free_balance_be`. +- On top of that for every invocation: Up to 5 DB reads. DB read of the code is of dynamic size. There can also be up to 2 DB writes (if flushed to the storage). Additionally, if the source account removal takes place a DB write will be performed per one storage entry that the account has. ## Create @@ -185,7 +219,7 @@ This function takes the code of the constructor and input data. Creation of a co **Note** that the complexity of executing the constructor code should be considered separately. -**Note** that the complexity of `DetermineContractAddress` hook should be considered separately as well. Most probably it will use some kind of hashing over the code of the constructor and input data. The default `SimpleAddressDeterminator` does precisely that. +**Note** that the complexity of `DetermineContractAddress` hook should be considered separately as well. Most likely it will use some kind of hashing over the code of the constructor and input data. The default `SimpleAddressDeterminator` does precisely that. **Note** that the constructor returns code in the owned form and it's obtained via return facilities, which should have take fee for the return value. @@ -224,9 +258,11 @@ This function receives a `key` as an argument. It consists of the following step Key is of a constant size. Therefore, the sandbox memory load can be considered to be of constant complexity. -However, a read from the contract's storage can hit the DB, and the size of this read is dynamical. +Unless the value is cached, a DB read will be performed. The size of the value is not known until the read is +performed. Moreover, the DB read has to be synchronous and no progress can be made until the value is fetched. -**complexity**: The memory and computing complexity is proportional to the size of the fetched value. +**complexity**: The memory and computing complexity is proportional to the size of the fetched value. This function performs a +DB read. ## ext_call @@ -242,7 +278,7 @@ It consists of the following steps: 1. Loading `callee` buffer from the sandbox memory (see sandboxing memory get) and then decoding it. 2. Loading `value` buffer from the sandbox memory and then decoding it. 3. Loading `input_data` buffer from the sandbox memory. -4. Invoking `call` executive function. +4. Invoking the executive function `call`. Loading of `callee` and `value` buffers should be charged. This is because the sizes of buffers are specified by the calling code, even though marshaled representations are, essentially, of constant size. This can be fixed by assigning an upper bound for sizes of `AccountId` and `Balance`. @@ -326,6 +362,8 @@ This function copies slice of data from the input buffer to the sandbox memory. ## ext_scratch_size +This function returns the size of the scratch buffer. + **complexity**: This function is of constant complexity. ## ext_scratch_copy @@ -356,4 +394,5 @@ 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. +**complexity**: Assuming that the rent allowance is of constant size, this function has constant complexity. This +function performs a DB read. -- GitLab From 840456893df7170c5bed55cb565ead678339b43b Mon Sep 17 00:00:00 2001 From: Kian Peymani Date: Fri, 7 Jun 2019 15:27:32 +0200 Subject: [PATCH 092/140] Enhanced Council. (#2407) * first --unclean-- working version of locks and weight decay * Refactor voter activity history. * Tuning offset calculation and tests * Remove print. * Configurable decay ratio. * Remove spaces. * Name for activity. * Fix some style * Re-write voters as chunked map-vec. * Adds panic todo. * Fix some of the grumbles. * Fix some of the grumbles. * Chunked approvals vector. * Introduce voter_index for set_approvas in favor of complexity. * Add a bit more docs * Add boolean approvals as scalar. * Some cleanups TODO removes. * enhance some error checking. * No more double_map * Combined voter info and fee. * Fix global tests * Bump. * Fix line length * Fix error message. * Kill As. * Final fix. * _Further_ kill As. * Proper imbalance for fee. * Bump. * Fix spacing. * Update * Address grumbles. * Line width. --- node/cli/src/chain_spec.rs | 7 +- node/runtime/src/lib.rs | 3 + srml/council/src/lib.rs | 116 ++- srml/council/src/motions.rs | 32 +- srml/council/src/seats.rs | 1659 +++++++++++++++++++++++++++++------ srml/indices/src/lib.rs | 2 +- 6 files changed, 1485 insertions(+), 334 deletions(-) diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index bc24de9ddf..242c5078f5 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -124,12 +124,14 @@ fn staging_testnet_config_genesis() -> GenesisConfig { active_council: vec![], candidacy_bond: 10 * DOLLARS, voter_bond: 1 * DOLLARS, + voting_fee: 2 * DOLLARS, present_slash_per_voter: 1 * CENTS, carry_count: 6, presentation_duration: 1 * DAYS, approval_voting_period: 2 * DAYS, term_duration: 28 * DAYS, desired_seats: 0, + decay_ratio: 0, inactive_grace_period: 1, // one additional vote should go by before an inactive voter can be reaped. }), timestamp: Some(TimestampConfig { @@ -234,6 +236,7 @@ pub fn testnet_genesis( const STASH: u128 = 1 << 20; const ENDOWMENT: u128 = 1 << 20; + let council_desired_seats = (endowed_accounts.len() / 2 - initial_authorities.len()) as u32; let mut contract_config = ContractConfig { signed_claim_handicap: 2, rent_byte_price: 4, @@ -299,12 +302,14 @@ pub fn testnet_genesis( .map(|a| (a.clone(), 1000000)).collect(), candidacy_bond: 10, voter_bond: 2, + voting_fee: 5, present_slash_per_voter: 1, carry_count: 4, presentation_duration: 10, approval_voting_period: 20, term_duration: 1000000, - desired_seats: (endowed_accounts.len() / 2 - initial_authorities.len()) as u32, + desired_seats: council_desired_seats, + decay_ratio: council_desired_seats / 3, inactive_grace_period: 1, }), timestamp: Some(TimestampConfig { diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index c5104f331e..427ee8d1fc 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -182,9 +182,12 @@ impl council::Trait for Runtime { type Event = Event; type BadPresentation = (); type BadReaper = (); + type BadVoterIndex = (); + type LoserCandidate = (); type OnMembersChanged = CouncilMotions; } + impl council::motions::Trait for Runtime { type Origin = Origin; type Proposal = Call; diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index a72e93c9eb..fd69805732 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -116,6 +116,8 @@ mod tests { type Event = Event; type BadPresentation = (); type BadReaper = (); + type BadVoterIndex = (); + type LoserCandidate = (); type OnMembersChanged = CouncilMotions; } impl motions::Trait for Test { @@ -124,35 +126,91 @@ mod tests { type Event = Event; } - pub fn new_test_ext(with_council: bool) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(balances::GenesisConfig::{ - transaction_base_fee: 0, - transaction_byte_fee: 0, - balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], - existential_deposit: 0, - transfer_fee: 0, - creation_fee: 0, - vesting: vec![], - }.build_storage().unwrap().0); - t.extend(democracy::GenesisConfig::::default().build_storage().unwrap().0); - t.extend(seats::GenesisConfig:: { - candidacy_bond: 9, - voter_bond: 3, - present_slash_per_voter: 1, - carry_count: 2, - inactive_grace_period: 1, - active_council: if with_council { vec![ - (1, 10), - (2, 10), - (3, 10) - ] } else { vec![] }, - approval_voting_period: 4, - presentation_duration: 2, - desired_seats: 2, - term_duration: 5, - }.build_storage().unwrap().0); - runtime_io::TestExternalities::new(t) + pub struct ExtBuilder { + balance_factor: u64, + decay_ratio: u32, + voting_fee: u64, + voter_bond: u64, + bad_presentation_punishment: u64, + with_council: bool, + } + + impl Default for ExtBuilder { + fn default() -> Self { + Self { + balance_factor: 1, + decay_ratio: 24, + voting_fee: 0, + voter_bond: 0, + bad_presentation_punishment: 1, + with_council: false, + } + } + } + + impl ExtBuilder { + pub fn with_council(mut self, council: bool) -> Self { + self.with_council = council; + self + } + pub fn balance_factor(mut self, factor: u64) -> Self { + self.balance_factor = factor; + self + } + pub fn decay_ratio(mut self, ratio: u32) -> Self { + self.decay_ratio = ratio; + self + } + pub fn voting_fee(mut self, fee: u64) -> Self { + self.voting_fee = fee; + self + } + pub fn bad_presentation_punishment(mut self, fee: u64) -> Self { + self.bad_presentation_punishment = fee; + self + } + pub fn voter_bond(mut self, fee: u64) -> Self { + self.voter_bond = fee; + self + } + pub fn build(self) -> runtime_io::TestExternalities { + let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; + t.extend(balances::GenesisConfig::{ + transaction_base_fee: 0, + transaction_byte_fee: 0, + balances: vec![ + (1, 10 * self.balance_factor), + (2, 20 * self.balance_factor), + (3, 30 * self.balance_factor), + (4, 40 * self.balance_factor), + (5, 50 * self.balance_factor), + (6, 60 * self.balance_factor) + ], + existential_deposit: 0, + transfer_fee: 0, + creation_fee: 0, + vesting: vec![], + }.build_storage().unwrap().0); + t.extend(seats::GenesisConfig:: { + candidacy_bond: 3, + voter_bond: self.voter_bond, + present_slash_per_voter: self.bad_presentation_punishment, + carry_count: 2, + inactive_grace_period: 1, + active_council: if self.with_council { vec![ + (1, 10), + (2, 10), + (3, 10) + ] } else { vec![] }, + approval_voting_period: 4, + presentation_duration: 2, + desired_seats: 2, + decay_ratio: self.decay_ratio, + voting_fee: self.voting_fee, + term_duration: 5, + }.build_storage().unwrap().0); + runtime_io::TestExternalities::new(t) + } } pub type System = system::Module; diff --git a/srml/council/src/motions.rs b/srml/council/src/motions.rs index 4ab4e84c12..df357ac8c8 100644 --- a/srml/council/src/motions.rs +++ b/srml/council/src/motions.rs @@ -326,8 +326,8 @@ mod tests { use hex_literal::hex; #[test] - fn basic_environment_works() { - with_externalities(&mut new_test_ext(true), || { + fn motions_basic_environment_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); assert_eq!(Balances::free_balance(&42), 0); assert_eq!(CouncilMotions::proposals(), Vec::::new()); @@ -340,7 +340,7 @@ mod tests { #[test] fn removal_of_old_voters_votes_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = BlakeTwo256::hash_of(&proposal); @@ -374,7 +374,7 @@ mod tests { #[test] fn propose_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = proposal.blake2_256().into(); @@ -397,8 +397,8 @@ mod tests { } #[test] - fn ignoring_non_council_proposals_works() { - with_externalities(&mut new_test_ext(true), || { + fn motions_ignoring_non_council_proposals_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); assert_noop!(CouncilMotions::propose(Origin::signed(42), 3, Box::new(proposal.clone())), "proposer not on council"); @@ -406,8 +406,8 @@ mod tests { } #[test] - fn ignoring_non_council_votes_works() { - with_externalities(&mut new_test_ext(true), || { + fn motions_ignoring_non_council_votes_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -417,8 +417,8 @@ mod tests { } #[test] - fn ignoring_bad_index_council_vote_works() { - with_externalities(&mut new_test_ext(true), || { + fn motions_ignoring_bad_index_council_vote_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(3); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -428,8 +428,8 @@ mod tests { } #[test] - fn revoting_works() { - with_externalities(&mut new_test_ext(true), || { + fn motions_revoting_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -462,8 +462,8 @@ mod tests { } #[test] - fn disapproval_works() { - with_externalities(&mut new_test_ext(true), || { + fn motions_disapproval_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -491,8 +491,8 @@ mod tests { } #[test] - fn approval_works() { - with_externalities(&mut new_test_ext(true), || { + fn motions_approval_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); diff --git a/srml/council/src/seats.rs b/srml/council/src/seats.rs index 15817df70b..3e80584900 100644 --- a/srml/council/src/seats.rs +++ b/srml/council/src/seats.rs @@ -17,13 +17,18 @@ //! Council system: Handles the voting in and maintenance of council members. use rstd::prelude::*; -use primitives::traits::{Zero, One, StaticLookup}; +use primitives::traits::{Zero, One, StaticLookup, Bounded, Saturating}; use runtime_io::print; use srml_support::{ - StorageValue, StorageMap, dispatch::Result, decl_storage, decl_event, ensure, - traits::{Currency, ReservableCurrency, OnUnbalanced} + StorageValue, StorageMap, + dispatch::Result, decl_storage, decl_event, ensure, decl_module, + traits::{ + Currency, ReservableCurrency, OnUnbalanced, LockIdentifier, + LockableCurrency, WithdrawReasons, WithdrawReason, ExistenceRequirement + } }; use democracy; +use parity_codec::{Encode, Decode}; use system::{self, ensure_signed}; use super::OnMembersChanged; @@ -81,13 +86,51 @@ use super::OnMembersChanged; // after each vote as all but K entries are cleared. newly registering candidates must use cleared // entries before they increase the capacity. -use srml_support::decl_module; -pub type VoteIndex = u32; +/// The activity status of a voter. +#[derive(PartialEq, Eq, Copy, Clone, Encode, Decode, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct VoterInfo { + /// Last VoteIndex in which this voter assigned (or initialized) approvals. + last_active: VoteIndex, + /// Last VoteIndex in which one of this voter's approvals won. + /// Note that `last_win = N` indicates a last win at index `N-1`, hence `last_win = 0` means no win ever. + last_win: VoteIndex, + /// The amount of stored weight as a result of not winning but changing approvals. + pot: Balance, + /// Current staked amount. A lock equal to this value always exists. + stake: Balance, +} + +/// Used to demonstrate the status of a particular index in the global voter list. +#[derive(PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum CellStatus { + /// Any out of bound index. Means a push a must happen to the chunk pointed by `NextVoterSet`. + /// Voting fee is applied in case a new chunk is created. + Head, + /// Already occupied by another voter. Voting fee is applied. + Occupied, + /// Empty hole which should be filled. No fee will be applied. + Hole, +} + +const COUNCIL_SEATS_ID: LockIdentifier = *b"councils"; + +pub const VOTER_SET_SIZE: usize = 64; +pub const APPROVAL_SET_SIZE: usize = 8; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +type SetIndex = u32; +pub type VoteIndex = u32; + +// all three must be in sync. +type ApprovalFlag = u32; +pub const APPROVAL_FLAG_MASK: ApprovalFlag = 0x8000_0000; +pub const APPROVAL_FLAG_LEN: usize = 32; + pub trait Trait: democracy::Trait { type Event: From> + Into<::Event>; @@ -97,6 +140,11 @@ pub trait Trait: democracy::Trait { /// Handler for the unbalanced reduction when slashing an invalid reaping attempt. type BadReaper: OnUnbalanced>; + /// Handler for the unbalanced reduction when submitting a bad `voter_index`. + type BadVoterIndex: OnUnbalanced>; + + /// Handler for the unbalanced reduction when a candidate has lost (and is not a runner up) + type LoserCandidate: OnUnbalanced>; /// What to do when the members change. type OnMembersChanged: OnMembersChanged; } @@ -107,22 +155,40 @@ decl_module! { /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots /// are registered. - fn set_approvals(origin, votes: Vec, #[compact] index: VoteIndex) -> Result { + /// + /// Locks the total balance of caller indefinitely. + /// Only [`retract_voter`] or [`reap_inactive_voter`] can unlock the balance. + /// + /// `hint` argument is interpreted differently based on: + /// - if `origin` is setting approvals for the first time: The index will be checked + /// for being a valid _hole_ in the voter list. + /// - if the hint is correctly pointing to a hole, no fee is deducted from `origin`. + /// - Otherwise, the call will succeed but the index is ignored and simply a push to the last chunk + /// with free space happens. If the new push causes a new chunk to be created, a fee indicated by + /// [`VotingFee`] is deducted. + /// - if `origin` is already a voter: the index __must__ be valid and point to the correct + /// position of the `origin` in the current voters list. + /// + /// Note that any trailing `false` votes in `votes` is ignored; In approval voting, not voting for a candidate + /// and voting false, are equal. + fn set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, hint: SetIndex) -> Result { let who = ensure_signed(origin)?; - Self::do_set_approvals(who, votes, index) + Self::do_set_approvals(who, votes, index, hint) } /// Set candidate approvals from a proxy. Approval slots stay valid as long as candidates in those slots /// are registered. - fn proxy_set_approvals(origin, votes: Vec, #[compact] index: VoteIndex) -> Result { + fn proxy_set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, hint: SetIndex) -> Result { let who = >::proxy(ensure_signed(origin)?).ok_or("not a proxy")?; - Self::do_set_approvals(who, votes, index) + Self::do_set_approvals(who, votes, index, hint) } /// Remove a voter. For it not to be a bond-consuming no-op, all approved candidate indices /// must now be either unregistered or registered to a candidate that registered the slot after /// the voter gave their last approval set. /// + /// Both indices must be provided as explained in [`voter_at`] function. + /// /// May be called by anyone. Returns the voter deposit to `signed`. fn reap_inactive_voter( origin, @@ -132,34 +198,49 @@ decl_module! { #[compact] assumed_vote_index: VoteIndex ) { let reporter = ensure_signed(origin)?; - let who = T::Lookup::lookup(who)?; + ensure!(!Self::presentation_active(), "cannot reap during presentation period"); - ensure!(Self::voter_last_active(&reporter).is_some(), "reporter must be a voter"); - let last_active = Self::voter_last_active(&who).ok_or("target for inactivity cleanup must be active")?; + ensure!(Self::voter_info(&reporter).is_some(), "reporter must be a voter"); + + let info = Self::voter_info(&who).ok_or("target for inactivity cleanup must be active")?; + let last_active = info.last_active; + ensure!(assumed_vote_index == Self::vote_index(), "vote index not current"); - ensure!(assumed_vote_index > last_active + Self::inactivity_grace_period(), "cannot reap during grace period"); - let voters = Self::voters(); + ensure!( + assumed_vote_index > last_active+ Self::inactivity_grace_period(), + "cannot reap during grace period" + ); + let reporter_index = reporter_index as usize; let who_index = who_index as usize; - ensure!(reporter_index < voters.len() && voters[reporter_index] == reporter, "bad reporter index"); - ensure!(who_index < voters.len() && voters[who_index] == who, "bad target index"); + let assumed_reporter = Self::voter_at(reporter_index).ok_or("invalid reporter index")?; + let assumed_who = Self::voter_at(who_index).ok_or("invalid target index")?; + + ensure!(assumed_reporter == reporter, "bad reporter index"); + ensure!(assumed_who == who, "bad target index"); - // will definitely kill one of signed or who now. + // will definitely kill one of reporter or who now. - let valid = !Self::approvals_of(&who).iter() + let valid = !Self::all_approvals_of(&who).iter() .zip(Self::candidates().iter()) .any(|(&appr, addr)| appr && *addr != T::AccountId::default() && - Self::candidate_reg_info(addr).map_or(false, |x| x.0 <= last_active)/*defensive only: all items in candidates list are registered*/ + // defensive only: all items in candidates list are registered + Self::candidate_reg_info(addr).map_or(false, |x| x.0 <= last_active) ); Self::remove_voter( if valid { &who } else { &reporter }, - if valid { who_index } else { reporter_index }, - voters + if valid { who_index } else { reporter_index } ); + + T::Currency::remove_lock( + COUNCIL_SEATS_ID, + if valid { &who } else { &reporter } + ); + if valid { // This only fails if `reporter` doesn't exist, which it clearly must do since its the origin. // Still, it's no more harmful to propagate any error at this point. @@ -173,23 +254,32 @@ decl_module! { } /// Remove a voter. All votes are cancelled and the voter deposit is returned. + /// + /// The index must be provided as explained in [`voter_at`] function. + /// + /// Also removes the lock on the balance of the voter. See [`do_set_approvals()`]. fn retract_voter(origin, #[compact] index: u32) { let who = ensure_signed(origin)?; ensure!(!Self::presentation_active(), "cannot retract when presenting"); - ensure!(>::exists(&who), "cannot retract non-voter"); - let voters = Self::voters(); + ensure!(>::exists(&who), "cannot retract non-voter"); let index = index as usize; - ensure!(index < voters.len(), "retraction index invalid"); - ensure!(voters[index] == who, "retraction index mismatch"); + let voter = Self::voter_at(index).ok_or("retraction index invalid")?; + ensure!(voter == who, "retraction index mismatch"); - Self::remove_voter(&who, index, voters); + Self::remove_voter(&who, index); T::Currency::unreserve(&who, Self::voting_bond()); + T::Currency::remove_lock(COUNCIL_SEATS_ID, &who); } /// Submit oneself for candidacy. /// /// Account must have enough transferrable funds in it to pay the bond. + /// + /// NOTE: if `origin` has already assigned approvals via [`set_approvals`], + /// it will NOT have any usable funds to pass candidacy bond and must first retract. + /// Note that setting approvals will lock the entire balance of the voter until + /// retraction or being reported. fn submit_candidacy(origin, #[compact] slot: u32) { let who = ensure_signed(origin)?; @@ -218,7 +308,7 @@ decl_module! { } /// Claim that `signed` is one of the top Self::carry_count() + current_vote().1 candidates. - /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()`` + /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()` /// `signed` should have at least fn present_winner( origin, @@ -227,15 +317,21 @@ decl_module! { #[compact] index: VoteIndex ) -> Result { let who = ensure_signed(origin)?; - ensure!(!total.is_zero(), "stake deposited to present winner and be added to leaderboard should be non-zero"); + ensure!( + !total.is_zero(), + "stake deposited to present winner and be added to leaderboard should be non-zero" + ); let candidate = T::Lookup::lookup(candidate)?; ensure!(index == Self::vote_index(), "index not current"); 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::::from(voters.len() as u32); - ensure!(T::Currency::can_slash(&who, bad_presentation_punishment), "presenter must have sufficient slashable funds"); + let bad_presentation_punishment = + Self::present_slash_per_voter() + * BalanceOf::::from(Self::voter_count() 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")?; ensure!(total > leaderboard[0].0, "candidate not worthy of leaderboard"); @@ -244,17 +340,24 @@ decl_module! { ensure!(p < expiring.len(), "candidate must not form a duplicated member if elected"); } + let voters = Self::all_voters(); let (registered_since, candidate_index): (VoteIndex, u32) = Self::candidate_reg_info(&candidate).ok_or("presented candidate must be current")?; let actual_total = voters.iter() - .zip(stakes.iter()) - .filter_map(|(voter, stake)| - match Self::voter_last_active(voter) { - Some(b) if b >= registered_since => - Self::approvals_of(voter).get(candidate_index as usize) - .and_then(|approved| if *approved { Some(*stake) } else { None }), - _ => None, - }) + .filter_map(|maybe_voter| maybe_voter.as_ref()) + .filter_map(|voter| match Self::voter_info(voter) { + Some(b) if b.last_active >= registered_since => { + let last_win = b.last_win; + let now = Self::vote_index(); + let stake = b.stake; + let offset = Self::get_offset(stake, now - last_win); + let weight = stake + offset + b.pot; + if Self::approvals_of_at(voter, candidate_index as usize) { + Some(weight) + } else { None } + }, + _ => None, + }) .fold(Zero::zero(), |acc, n| acc + n); let dupe = leaderboard.iter().find(|&&(_, ref c)| c == &candidate).is_some(); if total == actual_total && !dupe { @@ -317,18 +420,20 @@ decl_module! { decl_storage! { trait Store for Module as Council { - // parameters + // ---- parameters /// How much should be locked up in order to submit one's candidacy. 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 amount of fee paid upon each vote submission, unless if they submit a _hole_ index and replace it. + pub VotingFee get(voting_fee) config(voting_fee): BalanceOf; /// The punishment, per voter, if you provide an invalid presentation. 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 = 1000.into(); - /// How many vote indexes need to go by after a target voter's last vote before they can be reaped if their + /// How many vote indices 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. @@ -337,37 +442,49 @@ decl_storage! { 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; + /// Decay factor of weight when being accumulated. It should typically be set to + /// __at least__ `council_size -1` to keep the council secure. + /// When set to `N`, it indicates `(1/N)^t` of staked is decayed at weight increment step `t`. + /// 0 will result in no weight being added at all (normal approval voting). + pub DecayRatio get(decay_ratio) config(decay_ratio): u32 = 24; - // permanent state (always relevant, changes only at the finalization of voting) + // ---- permanent state (always relevant, changes only at the finalization of voting) /// The current council. When there's a vote going on, this should still be used for executive /// matters. The block number (second element in the tuple) is the block that their position is /// active until (calculated by the sum of the block number when the council member was elected /// and their term duration). pub ActiveCouncil get(active_council) config(): Vec<(T::AccountId, T::BlockNumber)>; - /// The total number of votes that have happened or are in progress. + /// The total number of vote rounds that have happened or are in progress. pub VoteCount get(vote_index): VoteIndex; - // persistent state (always relevant, changes constantly) - /// A list of votes for each voter, respecting the last cleared vote index that this voter was - /// last active at. - pub ApprovalsOf get(approvals_of): map T::AccountId => Vec; + // ---- persistent state (always relevant, changes constantly) + /// A list of votes for each voter. The votes are stored as numeric values and parsed in a bit-wise manner. + /// + /// In order to get a human-readable representation (`Vec`), use [`all_approvals_of`]. + /// + /// Furthermore, each vector of scalars is chunked with the cap of `APPROVAL_SET_SIZE`. + pub ApprovalsOf get(approvals_of): map (T::AccountId, SetIndex) => Vec; /// The vote index and list slot that the candidate `who` was registered or `None` if they are not /// currently registered. pub RegisterInfoOf get(candidate_reg_info): map T::AccountId => Option<(VoteIndex, u32)>; - /// The last cleared vote index that this voter was last active at. - pub LastActiveOf get(voter_last_active): map T::AccountId => Option; - /// The present voter list. - pub Voters get(voters): Vec; + /// Basic information about a voter. + pub VoterInfoOf get(voter_info): map T::AccountId => Option>>; + /// The present voter list (chunked and capped at [`VOTER_SET_SIZE`]). + pub Voters get(voters): map SetIndex => Vec>; + /// the next free set to store a voter in. This will keep growing. + pub NextVoterSet get(next_nonfull_voter_set): SetIndex = 0; + /// Current number of Voters. + pub VoterCount get(voter_count): SetIndex = 0; /// The present candidate list. pub Candidates get(candidates): Vec; // has holes + /// Current number of active candidates pub CandidateCount get(candidate_count): u32; - // temporary state (only relevant during finalization/presentation) + // ---- temporary state (only relevant during finalization/presentation) /// The accounts holding the seats that will become free on the next tally. pub NextFinalize get(next_finalize): Option<(T::BlockNumber, u32, Vec)>; - /// The stakes as they were at the point that the vote ended. - pub SnapshotedStakes get(snapshoted_stakes): Vec>; - /// Get the leaderboard if we;re in the presentation phase. + /// Get the leaderboard if we're in the presentation phase. The first element is the weight of each entry; + /// It may be the direct summed approval stakes, or a weighted version of it. pub Leaderboard get(leaderboard): Option, T::AccountId)> >; // ORDERED low -> high } } @@ -460,15 +577,21 @@ impl Module { Ok(()) } - /// Remove a voter from the system. Trusts that Self::voters()[index] != voter. - fn remove_voter(voter: &T::AccountId, index: usize, mut voters: Vec) { - >::put({ voters.swap_remove(index); voters }); - >::remove(voter); - >::remove(voter); + /// Remove a voter at a specified index from the system. + fn remove_voter(voter: &T::AccountId, index: usize) { + let (set_index, vec_index) = Self::split_index(index, VOTER_SET_SIZE); + let mut set = Self::voters(set_index); + set[vec_index] = None; + >::insert(set_index, set); + >::mutate(|c| *c = *c - 1); + Self::remove_all_approvals_of(voter); + >::remove(voter); } - // Actually do the voting. - fn do_set_approvals(who: T::AccountId, votes: Vec, index: VoteIndex) -> Result { + /// Actually do the voting. + /// + /// The voter index must be provided as explained in [`voter_at`] function. + fn do_set_approvals(who: T::AccountId, votes: Vec, index: VoteIndex, hint: SetIndex) -> Result { let candidates = Self::candidates(); ensure!(!Self::presentation_active(), "no approval changes during presentation period"); @@ -477,39 +600,98 @@ impl Module { // Prevent a vote from voters that provide a list of votes that exceeds the candidates length // since otherwise an attacker may be able to submit a very long list of `votes` that far exceeds // the amount of candidates and waste more computation than a reasonable voting bond would cover. - ensure!(candidates.len() >= votes.len(), "amount of candidate approval votes cannot exceed amount of candidates"); + ensure!(candidates.len() >= votes.len(), "amount of candidate votes cannot exceed amount of candidates"); + + // Amount to be locked up. + let mut locked_balance = T::Currency::total_balance(&who); + let mut pot_to_set = Zero::zero(); + let hint = hint as usize; + + if let Some(info) = Self::voter_info(&who) { + // already a voter. Index must be valid. No fee. update pot. O(1) + let voter = Self::voter_at(hint).ok_or("invalid voter index")?; + ensure!(voter == who, "wrong voter index"); + + // write new accumulated offset. + let last_win = info.last_win; + let now = index; + let offset = Self::get_offset(info.stake, now - last_win); + pot_to_set = info.pot + offset; + } else { + // not yet a voter. Index _could be valid_. Fee might apply. Bond will be reserved O(1). + ensure!( + T::Currency::free_balance(&who) > Self::voting_bond(), + "new voter must have sufficient funds to pay the bond" + ); - if !>::exists(&who) { - // not yet a voter - deduct bond. - // NOTE: this must be the last potential bailer, since it changes state. - T::Currency::reserve(&who, Self::voting_bond())?; + let (set_index, vec_index) = Self::split_index(hint, VOTER_SET_SIZE); + match Self::cell_status(set_index, vec_index) { + CellStatus::Hole => { + // requested cell was a valid hole. + >::mutate(set_index, |set| set[vec_index] = Some(who.clone())); + }, + CellStatus::Head | CellStatus::Occupied => { + // Either occupied or out-of-range. + let next = Self::next_nonfull_voter_set(); + let mut set = Self::voters(next); + // Caused a new set to be created. Pay for it. + // This is the last potential error. Writes will begin afterwards. + if set.is_empty() { + let imbalance = T::Currency::withdraw( + &who, + Self::voting_fee(), + WithdrawReason::Fee, + ExistenceRequirement::KeepAlive, + )?; + T::BadVoterIndex::on_unbalanced(imbalance); + // NOTE: this is safe since the `withdraw()` will check this. + locked_balance -= Self::voting_fee(); + } + Self::checked_push_voter(&mut set, who.clone(), next); + >::insert(next, set); + } + } - >::mutate(|v| v.push(who.clone())); + T::Currency::reserve(&who, Self::voting_bond())?; + >::mutate(|c| *c = *c + 1); } - >::insert(&who, index); - >::insert(&who, votes); + + T::Currency::set_lock( + COUNCIL_SEATS_ID, + &who, + locked_balance, + T::BlockNumber::max_value(), + WithdrawReasons::all() + ); + + >::insert( + &who, + VoterInfo::> { + last_active: index, + last_win: index, + stake: locked_balance, + pot: pot_to_set, + } + ); + Self::set_approvals_chunked(&who, votes); Ok(()) } - /// Close the voting, snapshot the staking and the number of seats that are actually up for grabs. + /// Close the voting, record the number of seats that are actually up for grabs. fn start_tally() { let active_council = Self::active_council(); let desired_seats = Self::desired_seats() as usize; let number = >::block_number(); - let expiring = active_council.iter().take_while(|i| i.1 == number).map(|i| i.0.clone()).collect::>(); + let expiring = active_council.iter().take_while(|i| i.1 <= number).map(|i| i.0.clone()).collect::>(); let retaining_seats = active_council.len() - expiring.len(); if retaining_seats < desired_seats { let empty_seats = desired_seats - retaining_seats; >::put((number + Self::presentation_duration(), empty_seats as u32, expiring)); - let voters = Self::voters(); - let votes = voters.iter().map(T::Currency::total_balance).collect::>(); - >::put(votes); - // initialize leaderboard. let leaderboard_size = empty_seats + Self::carry_count() as usize; - >::put(vec![(BalanceOf::::zero(), T::AccountId::default()); leaderboard_size]); + >::put(vec![(Zero::zero(), T::AccountId::default()); leaderboard_size]); Self::deposit_event(RawEvent::TallyStarted(empty_seats as u32)); } @@ -520,7 +702,6 @@ impl Module { /// a new vote is started. /// Clears all presented candidates, returning the bond of the elected ones. fn finalize_tally() -> Result { - >::kill(); let (_, coming, expiring): (T::BlockNumber, u32, Vec) = >::take().ok_or("finalize can only be called after a tally is started.")?; let leaderboard: Vec<(BalanceOf, T::AccountId)> = >::take().unwrap_or_default(); @@ -534,8 +715,20 @@ impl Module { .take(coming as usize) .map(|(_, a)| a) .cloned() - .inspect(|a| {T::Currency::unreserve(a, candidacy_bond);}) + .inspect(|a| { T::Currency::unreserve(a, candidacy_bond); }) .collect(); + + // Update last win index for anyone voted for any of the incomings. + incoming.iter().filter_map(|i| Self::candidate_reg_info(i)).for_each(|r| { + let index = r.1 as usize; + Self::all_voters() + .iter() + .filter_map(|mv| mv.as_ref()) + .filter(|v| Self::approvals_of_at(*v, index)) + .for_each(|v| >::mutate(v, |a| { + if let Some(activity) = a { activity.last_win = Self::vote_index() + 1; } + })); + }); let active_council = Self::active_council(); let outgoing: Vec<_> = active_council.iter() .take(expiring.len()) @@ -583,6 +776,205 @@ impl Module { >::put(Self::vote_index() + 1); Ok(()) } + + fn checked_push_voter(set: &mut Vec>, who: T::AccountId, index: u32) { + let len = set.len(); + + // Defensive only: this should never happen. Don't push since it will break more things. + if len == VOTER_SET_SIZE { return; } + + set.push(Some(who)); + if len + 1 == VOTER_SET_SIZE { + >::put(index + 1); + } + } + + /// Get the set and vector index of a global voter index. + /// + /// Note that this function does not take holes into account. + /// See [`voter_at`]. + fn split_index(index: usize, scale: usize) -> (SetIndex, usize) { + let set_index = (index / scale) as u32; + let vec_index = index % scale; + (set_index, vec_index) + } + + /// Return a concatenated vector over all voter sets. + fn all_voters() -> Vec> { + let mut all = >::get(0); + let mut index = 1; + // NOTE: we could also use `Self::next_nonfull_voter_set()` here but that might change based + // on how we do chunking. This is more generic. + loop { + let next_set = >::get(index); + if next_set.is_empty() { + break; + } else { + index += 1; + all.extend(next_set); + } + } + all + } + + /// Shorthand for fetching a voter at a specific (global) index. + /// + /// NOTE: this function is used for checking indices. Yet, it does not take holes into account. + /// This means that any account submitting an index at any point in time should submit: + /// `VOTER_SET_SIZE * set_index + local_index`, meaning that you are ignoring all holes in the + /// first `set_index` sets. + fn voter_at(index: usize) -> Option { + let (set_index, vec_index) = Self::split_index(index, VOTER_SET_SIZE); + let set = Self::voters(set_index); + if vec_index < set.len() { + set[vec_index].clone() + } else { + None + } + } + + /// A more sophisticated version of `voter_at`. Will be kept separate as most often it is an overdue + /// compared to `voter_at`. Only used when setting approvals. + fn cell_status(set_index: SetIndex, vec_index: usize) -> CellStatus { + let set = Self::voters(set_index); + if vec_index < set.len() { + if let Some(_) = set[vec_index] { + CellStatus::Occupied + } else { + CellStatus::Hole + } + } else { + CellStatus::Head + } + } + + /// Sets the approval of a voter in a chunked manner. + fn set_approvals_chunked(who: &T::AccountId, approvals: Vec) { + let approvals_flag_vec = Self::bool_to_flag(approvals); + approvals_flag_vec + .chunks(APPROVAL_SET_SIZE) + .enumerate() + .for_each(|(index, slice)| >::insert((who.clone(), index as SetIndex), slice.to_vec())); + } + + /// shorthand for fetching a specific approval of a voter at a specific (global) index. + /// + /// Using this function to read a vote is preferred as it reads `APPROVAL_SET_SIZE` items of type + /// `ApprovalFlag` from storage at most; not all of them. + /// + /// Note that false is returned in case of no-vote or an explicit `false`. + fn approvals_of_at(who: &T::AccountId, index: usize) -> bool { + let (flag_index, bit) = Self::split_index(index, APPROVAL_FLAG_LEN); + let (set_index, vec_index) = Self::split_index(flag_index as usize, APPROVAL_SET_SIZE); + let set = Self::approvals_of((who.clone(), set_index)); + if vec_index < set.len() { + // This is because bit_at treats numbers in lsb -> msb order. + let reversed_index = set.len() - 1 - vec_index; + Self::bit_at(set[reversed_index], bit) + } else { + false + } + } + + /// Return true of the bit `n` of scalar `x` is set to `1` and false otherwise. + fn bit_at(x: ApprovalFlag, n: usize) -> bool { + if n < APPROVAL_FLAG_LEN { + // x & ( APPROVAL_FLAG_MASK >> n ) != 0 + x & ( 1 << n ) != 0 + } else { + false + } + } + + /// Convert a vec of boolean approval flags to a vec of integers, as denoted by + /// the type `ApprovalFlag`. see `bool_to_flag_should_work` test for examples. + pub fn bool_to_flag(x: Vec) -> Vec { + let mut result: Vec = Vec::with_capacity(x.len() / APPROVAL_FLAG_LEN); + if x.is_empty() { + return result; + } + result.push(0); + let mut index = 0; + let mut counter = 0; + loop { + let shl_index = counter % APPROVAL_FLAG_LEN; + result[index] += (if x[counter] { 1 } else { 0 }) << shl_index; + counter += 1; + if counter > x.len() - 1 { break; } + if counter % APPROVAL_FLAG_LEN == 0 { + result.push(0); + index += 1; + } + } + result + } + + /// Convert a vec of flags (u32) to boolean. + pub fn flag_to_bool(chunk: Vec) -> Vec { + let mut result = Vec::with_capacity(chunk.len()); + if chunk.is_empty() { return vec![] } + chunk.into_iter() + .map(|num| (0..APPROVAL_FLAG_LEN).map(|bit| Self::bit_at(num, bit)).collect::>()) + .for_each(|c| { + let last_approve = match c.iter().rposition(|n| *n) { + Some(index) => index + 1, + None => 0 + }; + result.extend(c.into_iter().take(last_approve)); + }); + result + } + + /// Return a concatenated vector over all approvals of a voter as boolean. + /// The trailing zeros are removed. + fn all_approvals_of(who: &T::AccountId) -> Vec { + let mut all: Vec = vec![]; + let mut index = 0_u32; + loop { + let chunk = Self::approvals_of((who.clone(), index)); + if chunk.is_empty() { break; } + all.extend(Self::flag_to_bool(chunk)); + index += 1; + } + all + } + + /// Remove all approvals associated with one account. + fn remove_all_approvals_of(who: &T::AccountId) { + let mut index = 0; + loop { + let set = Self::approvals_of((who.clone(), index)); + if set.len() > 0 { + >::remove((who.clone(), index)); + index += 1; + } else { + break + } + } + } + + /// Calculates the offset value (stored pot) of a stake, based on the distance + /// to the last win_index, `t`. Regardless of the internal implementation, + /// it should always be used with the following structure: + /// + /// Given Stake of voter `V` being `x` and distance to last_win index `t`, the new weight + /// of `V` is `x + get_offset(x, t)`. + /// + /// In other words, this function returns everything extra that should be added + /// to a voter's stake value to get the correct weight. Indeed, zero is + /// returned if `t` is zero. + fn get_offset(stake: BalanceOf, t: VoteIndex) -> BalanceOf { + let decay_ratio: BalanceOf = Self::decay_ratio().into(); + if t > 150 { return stake * decay_ratio } + let mut offset = stake; + let mut r = Zero::zero(); + let decay = decay_ratio + One::one(); + for _ in 0..t { + offset = offset.saturating_sub(offset / decay); + r += offset + } + r + } } #[cfg(test)] @@ -591,16 +983,86 @@ mod tests { use crate::tests::*; use srml_support::{assert_ok, assert_noop, assert_err}; + fn voter_ids() -> Vec { + Council::all_voters().iter().map(|v| v.unwrap_or(0) ).collect::>() + } + + fn vote(i: u64, l: usize) { + let _ = Balances::make_free_balance_be(&i, 20); + assert_ok!(Council::set_approvals(Origin::signed(i), (0..l).map(|_| true).collect::>(), 0, 0)); + } + + fn vote_at(i: u64, l: usize, index: VoteIndex) { + let _ = Balances::make_free_balance_be(&i, 20); + assert_ok!(Council::set_approvals(Origin::signed(i), (0..l).map(|_| true).collect::>(), 0, index)); + } + + fn create_candidate(i: u64, index: u32) { + let _ = Balances::make_free_balance_be(&i, 20); + assert_ok!(Council::submit_candidacy(Origin::signed(i), index)); + } + + fn bond() -> u64 { + Council::voting_bond() + } + + + #[test] + fn bool_to_flag_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_eq!(Council::bool_to_flag(vec![]), vec![]); + assert_eq!(Council::bool_to_flag(vec![false]), vec![0]); + assert_eq!(Council::bool_to_flag(vec![true]), vec![1]); + assert_eq!(Council::bool_to_flag(vec![true, true, true, true]), vec![15]); + assert_eq!(Council::bool_to_flag(vec![true, true, true, true, true]), vec![15 + 16]); + + let set_1 = vec![ + true, false, false, false, // 0x1 + false, true, true, true, // 0xE + ]; + assert_eq!( + Council::bool_to_flag(set_1.clone()), + vec![0x00_00_00_E1_u32] + ); + assert_eq!( + Council::flag_to_bool(vec![0x00_00_00_E1_u32]), + set_1 + ); + + let set_2 = vec![ + false, false, false, true, // 0x8 + false, true, false, true, // 0xA + ]; + assert_eq!( + Council::bool_to_flag(set_2.clone()), + vec![0x00_00_00_A8_u32] + ); + assert_eq!( + Council::flag_to_bool(vec![0x00_00_00_A8_u32]), + set_2 + ); + + let mut rhs = (0..100/APPROVAL_FLAG_LEN).map(|_| 0xFFFFFFFF_u32).collect::>(); + // NOTE: this might be need change based on `APPROVAL_FLAG_LEN`. + rhs.extend(vec![0x00_00_00_0F]); + assert_eq!( + Council::bool_to_flag((0..100).map(|_| true).collect()), + rhs + ) + }) + } + #[test] fn params_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::next_vote_from(1), 4); assert_eq!(Council::next_vote_from(4), 4); assert_eq!(Council::next_vote_from(5), 8); assert_eq!(Council::vote_index(), 0); - assert_eq!(Council::candidacy_bond(), 9); - assert_eq!(Council::voting_bond(), 3); + assert_eq!(Council::candidacy_bond(), 3); + assert_eq!(Council::voting_bond(), 0); + assert_eq!(Council::voting_fee(), 0); assert_eq!(Council::present_slash_per_voter(), 1); assert_eq!(Council::presentation_duration(), 2); assert_eq!(Council::inactivity_grace_period(), 1); @@ -618,15 +1080,225 @@ mod tests { assert_eq!(Council::is_a_candidate(&1), false); assert_eq!(Council::candidate_reg_info(1), None); - assert_eq!(Council::voters(), Vec::::new()); - assert_eq!(Council::voter_last_active(1), None); - assert_eq!(Council::approvals_of(1), vec![]); + assert_eq!(Council::voters(0), Vec::>::new()); + assert_eq!(Council::voter_info(1), None); + assert_eq!(Council::all_approvals_of(&1), vec![]); }); } + #[test] + fn voter_set_growth_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + // create 65. 64 (set0) + 1 (set1) + (1..=63).for_each(|i| vote(i, 2)); + assert_eq!(Council::next_nonfull_voter_set(), 0); + vote(64, 2); + assert_eq!(Council::next_nonfull_voter_set(), 1); + vote(65, 2); + + let set1 = Council::voters(0); + let set2 = Council::voters(1); + + assert_eq!(set1.len(), 64); + assert_eq!(set2.len(), 1); + + assert_eq!(set1[0], Some(1)); + assert_eq!(set1[10], Some(11)); + assert_eq!(set2[0], Some(65)); + }) + } + + #[test] + fn voter_set_reclaim_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + (1..=129).for_each(|i| vote(i, 2)); + assert_eq!(Council::next_nonfull_voter_set(), 2); + + assert_ok!(Council::retract_voter(Origin::signed(11), 10)); + + assert_ok!(Council::retract_voter(Origin::signed(66), 65)); + assert_ok!(Council::retract_voter(Origin::signed(67), 66)); + + // length does not show it but holes do exist. + assert_eq!(Council::voters(0).len(), 64); + assert_eq!(Council::voters(1).len(), 64); + assert_eq!(Council::voters(2).len(), 1); + + assert_eq!(Council::voters(0)[10], None); + assert_eq!(Council::voters(1)[1], None); + assert_eq!(Council::voters(1)[2], None); + // Next set with capacity is 2. + assert_eq!(Council::next_nonfull_voter_set(), 2); + + // But we can fill a hole. + vote_at(130, 2, 10); + + // Nothing added to set 2. A hole was filled. + assert_eq!(Council::voters(0).len(), 64); + assert_eq!(Council::voters(1).len(), 64); + assert_eq!(Council::voters(2).len(), 1); + + // and the next two (scheduled) to the second set. + assert_eq!(Council::next_nonfull_voter_set(), 2); + }) + } + + #[test] + fn approvals_set_growth_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + // create candidates and voters. + (1..=250).for_each(|i| create_candidate(i, (i-1) as u32)); + (1..=250).for_each(|i| vote(i, i as usize)); + + // all approvals of should return the exact expected vector. + assert_eq!(Council::all_approvals_of(&180), (0..180).map(|_| true).collect::>()); + + assert_eq!(Council::all_approvals_of(&32), (0..32).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&8), (0..8).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&64), (0..64).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&65), (0..65).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&63), (0..63).map(|_| true).collect::>()); + + // NOTE: assuming that APPROVAL_SET_SIZE is more or less small-ish. Might fail otherwise. + let full_sets = (180 / APPROVAL_FLAG_LEN) / APPROVAL_SET_SIZE; + let left_over = (180 / APPROVAL_FLAG_LEN) / APPROVAL_SET_SIZE; + let rem = 180 % APPROVAL_FLAG_LEN; + + // grab and check the last full set, if it exists. + if full_sets > 0 { + assert_eq!( + Council::approvals_of((180, (full_sets-1) as SetIndex )), + Council::bool_to_flag((0..APPROVAL_SET_SIZE * APPROVAL_FLAG_LEN).map(|_| true).collect::>()) + ); + } + + // grab and check the last, half-empty, set. + if left_over > 0 { + assert_eq!( + Council::approvals_of((180, full_sets as SetIndex)), + Council::bool_to_flag((0..left_over * APPROVAL_FLAG_LEN + rem).map(|_| true).collect::>()) + ); + } + }) + } + + + #[test] + fn cell_status_works() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + (1..=63).for_each(|i| vote(i, 2)); + + assert_ok!(Council::retract_voter(Origin::signed(11), 10)); + assert_ok!(Council::retract_voter(Origin::signed(21), 20)); + + assert_eq!(Council::cell_status(0, 10), CellStatus::Hole); + assert_eq!(Council::cell_status(0, 0), CellStatus::Occupied); + assert_eq!(Council::cell_status(0, 20), CellStatus::Hole); + assert_eq!(Council::cell_status(0, 63), CellStatus::Head); + assert_eq!(Council::cell_status(1, 0), CellStatus::Head); + assert_eq!(Council::cell_status(1, 10), CellStatus::Head); + }) + } + + #[test] + fn initial_set_approvals_ignores_voter_index() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + + // Last argument is essentially irrelevant. You might get or miss a tip. + assert_ok!(Council::set_approvals(Origin::signed(3), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 5)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 0, 100)); + + // indices are more or less ignored. all is pushed. + assert_eq!(voter_ids(), vec![3, 4, 5]); + }) + } + + #[test] + fn bad_approval_index_slashes_voters_and_bond_reduces_stake() { + with_externalities(&mut ExtBuilder::default().voting_fee(5).voter_bond(2).build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + (1..=63).for_each(|i| vote(i, 2)); + assert_eq!(Balances::free_balance(&1), 20 - 5 - 2); // -5 fee -2 bond + assert_eq!(Balances::free_balance(&10), 20 - 2); + assert_eq!(Balances::free_balance(&60), 20 - 2); + + // still no fee + vote(64, 2); + assert_eq!(Balances::free_balance(&64), 20 - 2); // -2 bond + assert_eq!( + Council::voter_info(&64).unwrap(), + VoterInfo { last_win: 0, last_active: 0, stake: 20, pot:0 } + ); + + assert_eq!(Council::next_nonfull_voter_set(), 1); + + // now we charge the next voter. + vote(65, 2); + assert_eq!(Balances::free_balance(&65), 20 - 5 - 2); + assert_eq!( + Council::voter_info(&65).unwrap(), + VoterInfo { last_win: 0, last_active: 0, stake: 15, pot:0 } + ); + }); + } + + #[test] + fn subsequent_set_approvals_checks_voter_index() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + + assert_ok!(Council::set_approvals(Origin::signed(3), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 5)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 0, 100)); + + // invalid index + assert_noop!(Council::set_approvals(Origin::signed(4), vec![true], 0, 5), "invalid voter index"); + // wrong index + assert_noop!(Council::set_approvals(Origin::signed(4), vec![true], 0, 0), "wrong voter index"); + // correct + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 1)); + }) + } + + #[test] + fn voter_index_does_not_take_holes_into_account() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + // create 65. 64 (set0) + 1 (set1) + (1..=65).for_each(|i| vote(i, 2)); + + // account 65 has global index 65. + assert_eq!(Council::voter_at(64).unwrap(), 65); + + assert_ok!(Council::retract_voter(Origin::signed(1), 0)); + assert_ok!(Council::retract_voter(Origin::signed(2), 1)); + + // still the same. These holes are in some other set. + assert_eq!(Council::voter_at(64).unwrap(), 65); + // proof: can submit a new approval with the old index. + assert_noop!(Council::set_approvals(Origin::signed(65), vec![false, true], 0, 64 - 2), "wrong voter index"); + assert_ok!(Council::set_approvals(Origin::signed(65), vec![false, true], 0, 64)); + }) + } + #[test] fn simple_candidate_submission_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_eq!(Council::candidate_reg_info(1), None); @@ -651,7 +1323,7 @@ mod tests { } fn new_test_ext_with_candidate_holes() -> runtime_io::TestExternalities { - let mut t = new_test_ext(false); + let mut t = ExtBuilder::default().build(); with_externalities(&mut t, || { >::put(vec![0, 0, 1]); >::put(1); @@ -694,7 +1366,9 @@ mod tests { #[test] fn candidate_submission_not_using_free_slot_should_not_work() { - with_externalities(&mut new_test_ext_with_candidate_holes(), || { + let mut t = new_test_ext_with_candidate_holes(); + + with_externalities(&mut t, || { System::set_block_number(1); assert_noop!(Council::submit_candidacy(Origin::signed(4), 3), "invalid candidate slot"); }); @@ -702,7 +1376,7 @@ mod tests { #[test] fn bad_candidate_slot_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_noop!(Council::submit_candidacy(Origin::signed(1), 1), "invalid candidate slot"); @@ -711,7 +1385,7 @@ mod tests { #[test] fn non_free_candidate_slot_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); @@ -722,7 +1396,7 @@ mod tests { #[test] fn dupe_candidate_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); @@ -733,45 +1407,367 @@ mod tests { #[test] fn poor_candidate_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_noop!(Council::submit_candidacy(Origin::signed(7), 0), "candidate has not enough funds"); }); } + #[test] + fn balance_should_lock_to_the_maximum() { + with_externalities(&mut ExtBuilder::default().build(), || { + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Balances::free_balance(&2), 20); + + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + + assert_eq!(Balances::free_balance(&2), 20 - bond() ); + assert_noop!(Balances::reserve(&2, 1), "account liquidity restrictions prevent withdrawal"); // locked. + + // deposit a bit more. + let _ = Balances::deposit_creating(&2, 100); + assert_ok!(Balances::reserve(&2, 1)); // locked but now has enough. + + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + assert_noop!(Balances::reserve(&2, 1), "account liquidity restrictions prevent withdrawal"); // locked. + assert_eq!(Balances::locks(&2).len(), 1); + assert_eq!(Balances::locks(&2)[0].amount, 100 + 20); + + assert_ok!(Council::retract_voter(Origin::signed(2), 0)); + + assert_eq!(Balances::locks(&2).len(), 0); + assert_eq!(Balances::free_balance(&2), 120 - 1); // 1 ok call to .reserve() happened. + assert_ok!(Balances::reserve(&2, 1)); // unlocked. + }); + } + + #[test] + fn balance_should_lock_on_submit_approvals_unlock_on_retract() { + with_externalities(&mut ExtBuilder::default().voter_bond(8).voting_fee(0).build(), || { + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Balances::free_balance(&2), 20); + + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + + assert_eq!(Balances::free_balance(&2), 12); // 20 - 8 (bond) + assert_noop!(Balances::reserve(&2, 10), "account liquidity restrictions prevent withdrawal"); // locked. + + assert_ok!(Council::retract_voter(Origin::signed(2), 0)); + + assert_eq!(Balances::free_balance(&2), 20); + assert_ok!(Balances::reserve(&2, 10)); // unlocked. + }); + } + + #[test] + fn accumulating_weight_and_decaying_should_work() { + with_externalities(&mut ExtBuilder::default().balance_factor(10).build(), || { + System::set_block_number(4); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 2)); + + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![false, false, true], 0, 0)); + + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (5, 11)]); + assert_eq!(Council::voter_info(6).unwrap(), VoterInfo { last_win: 1, last_active: 0, stake: 600, pot: 0}); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 1, last_active: 0, stake: 500, pot: 0}); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot: 0}); + + System::set_block_number(12); + // retract needed to unlock approval funds => submit candidacy again. + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 1, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 1, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(14); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100 + Council::get_offset(100, 1), 1), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100 + 96, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 19), (5, 19)]); + assert_eq!( + Council::voter_info(6).unwrap(), + VoterInfo { last_win: 2, last_active: 1, stake: 600, pot:0 } + ); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 2, last_active: 1, stake: 500, pot:0 }); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot:0 }); + + System::set_block_number(20); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 2, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 2, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(22); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 2), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 2), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100 + Council::get_offset(100, 2), 2), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100 + 96 + 93, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 27), (5, 27)]); + assert_eq!( + Council::voter_info(6).unwrap(), + VoterInfo { last_win: 3, last_active: 2, stake: 600, pot: 0} + ); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 3, last_active: 2, stake: 500, pot: 0}); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot: 0}); + + + System::set_block_number(28); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 3, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 3, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(30); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 3), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 3), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100 + Council::get_offset(100, 3), 3), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100 + 96 + 93 + 90, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 35), (5, 35)]); + assert_eq!( + Council::voter_info(6).unwrap(), + VoterInfo { last_win: 4, last_active: 3, stake: 600, pot: 0} + ); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 4, last_active: 3, stake: 500, pot: 0}); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot: 0}); + }) + } + + #[test] + fn winning_resets_accumulated_pot() { + with_externalities(&mut ExtBuilder::default().balance_factor(10).build(), || { + System::set_block_number(4); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 3)); + + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, true, false, false], 0, 1)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true, true], 0, 2)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 4, 400, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(3), 3, 300, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(2), 2, 300, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(300, 2), (300, 3), (400, 4), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (4, 11)]); + + System::set_block_number(12); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(4), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false, false], 1, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, true, false, false], 1, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(14); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 4, 400, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(3), 3, 300 + Council::get_offset(300, 1), 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(2), 2, 300 + Council::get_offset(300, 1), 1), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(400, 4), (588, 2), (588, 3), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 19), (3, 19)]); + + System::set_block_number(20); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(22); + // 2 will not get re-elected with 300 + 288, instead just 300. + // because one of 3's candidates (3) won in previous round + // 4 on the other hand will get extra weight since it was unlucky. + assert_eq!(Council::present_winner(Origin::signed(3), 2, 300, 2), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 4, 400 + Council::get_offset(400, 1), 2), Ok(())); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(4, 27), (2, 27)]); + }) + } + + #[test] + fn resubmitting_approvals_stores_pot() { + with_externalities(&mut ExtBuilder::default() + .voter_bond(0) + .voting_fee(0) + .balance_factor(10) + .build(), + || { System::set_block_number(4); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 2)); + + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 0, 1)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![false, false, true], 0, 2)); + + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (5, 11)]); + + System::set_block_number(12); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 1, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 1, 1)); + // give 1 some new high balance + let _ = Balances::make_free_balance_be(&1, 997); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![false, false, true], 1, 2)); + assert_eq!(Council::voter_info(1).unwrap(), + VoterInfo { + stake: 1000, // 997 + 3 which is candidacy bond. + pot: Council::get_offset(100, 1), + last_active: 1, + last_win: 1, + } + ); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (5, 11)]); + + System::set_block_number(14); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 1000 + 96 /* pot */, 1), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (500, 5), (600, 6), (1096, 1)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(1, 19), (6, 19)]); + }) + } + + #[test] + fn get_offset_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_eq!(Council::get_offset(100, 0), 0); + assert_eq!(Council::get_offset(100, 1), 96); + assert_eq!(Council::get_offset(100, 2), 96 + 93); + assert_eq!(Council::get_offset(100, 3), 96 + 93 + 90); + assert_eq!(Council::get_offset(100, 4), 96 + 93 + 90 + 87); + // limit + assert_eq!(Council::get_offset(100, 1000), 100 * 24); + + assert_eq!(Council::get_offset(50_000_000_000, 0), 0); + assert_eq!(Council::get_offset(50_000_000_000, 1), 48_000_000_000); + assert_eq!(Council::get_offset(50_000_000_000, 2), 48_000_000_000 + 46_080_000_000); + assert_eq!(Council::get_offset(50_000_000_000, 3), 48_000_000_000 + 46_080_000_000 + 44_236_800_000); + assert_eq!( + Council::get_offset(50_000_000_000, 4), + 48_000_000_000 + 46_080_000_000 + 44_236_800_000 + 42_467_328_000 + ); + // limit + assert_eq!(Council::get_offset(50_000_000_000, 1000), 50_000_000_000 * 24); + }) + } + + #[test] + fn get_offset_with_zero_decay() { + with_externalities(&mut ExtBuilder::default().decay_ratio(0).build(), || { + assert_eq!(Council::get_offset(100, 0), 0); + assert_eq!(Council::get_offset(100, 1), 0); + assert_eq!(Council::get_offset(100, 2), 0); + assert_eq!(Council::get_offset(100, 3), 0); + // limit + assert_eq!(Council::get_offset(100, 1000), 0); + }) + } + #[test] fn voting_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 1)); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::voters(), vec![1, 4]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(voter_ids(), vec![1, 4]); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0, 2)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0, 3)); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); - assert_eq!(Council::voters(), vec![1, 4, 2, 3]); + assert_eq!(voter_ids(), vec![1, 4, 2, 3]); }); } #[test] fn proxy_voting_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); @@ -780,74 +1776,79 @@ mod tests { Democracy::force_proxy(2, 12); Democracy::force_proxy(3, 13); Democracy::force_proxy(4, 14); + assert_ok!(Council::proxy_set_approvals(Origin::signed(11), vec![true], 0, 0)); + assert_ok!(Council::proxy_set_approvals(Origin::signed(14), vec![true], 0, 1)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(11), vec![true], 0)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(14), vec![true], 0)); - - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::voters(), vec![1, 4]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(voter_ids(), vec![1, 4]); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(12), vec![false, true, true], 0)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(13), vec![false, true, true], 0)); + assert_ok!(Council::proxy_set_approvals(Origin::signed(12), vec![false, true, true], 0, 2)); + assert_ok!(Council::proxy_set_approvals(Origin::signed(13), vec![false, true, true], 0, 3)); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); - assert_eq!(Council::voters(), vec![1, 4, 2, 3]); + assert_eq!(voter_ids(), vec![1, 4, 2, 3]); }); } #[test] fn setting_any_approval_vote_count_without_any_candidate_count_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates().len(), 0); - assert_noop!(Council::set_approvals(Origin::signed(4), vec![], 0), "amount of candidates to receive approval votes should be non-zero"); + assert_noop!( + Council::set_approvals(Origin::signed(4), vec![], 0, 0), + "amount of candidates to receive approval votes should be non-zero" + ); }); } #[test] fn setting_an_approval_vote_count_more_than_candidate_count_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); assert_eq!(Council::candidates().len(), 1); - assert_noop!(Council::set_approvals(Origin::signed(4), vec![true, true], 0), "amount of candidate approval votes cannot exceed amount of candidates"); + assert_noop!( + Council::set_approvals(Origin::signed(4),vec![true, true], 0, 0), + "amount of candidate votes cannot exceed amount of candidates" + ); }); } #[test] fn resubmitting_voting_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 0)); - assert_eq!(Council::approvals_of(4), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); assert_eq!(Council::candidates().len(), 3); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0, 0)); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); }); } #[test] fn retracting_voter_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); @@ -855,88 +1856,108 @@ mod tests { assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); assert_eq!(Council::candidates().len(), 3); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0, 1)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0, 2)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0, 3)); - assert_eq!(Council::voters(), vec![1, 2, 3, 4]); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![1, 2, 3, 4]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); assert_ok!(Council::retract_voter(Origin::signed(1), 0)); - assert_eq!(Council::voters(), vec![4, 2, 3]); - assert_eq!(Council::approvals_of(1), Vec::::new()); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![0, 2, 3, 4]); + assert_eq!(Council::all_approvals_of(&1), Vec::::new()); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); assert_ok!(Council::retract_voter(Origin::signed(2), 1)); - assert_eq!(Council::voters(), vec![4, 3]); - assert_eq!(Council::approvals_of(1), Vec::::new()); - assert_eq!(Council::approvals_of(2), Vec::::new()); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![0, 0, 3, 4]); + assert_eq!(Council::all_approvals_of(&1), Vec::::new()); + assert_eq!(Council::all_approvals_of(&2), Vec::::new()); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); - assert_ok!(Council::retract_voter(Origin::signed(3), 1)); + assert_ok!(Council::retract_voter(Origin::signed(3), 2)); - assert_eq!(Council::voters(), vec![4]); - assert_eq!(Council::approvals_of(1), Vec::::new()); - assert_eq!(Council::approvals_of(2), Vec::::new()); - assert_eq!(Council::approvals_of(3), Vec::::new()); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![0, 0, 0, 4]); + assert_eq!(Council::all_approvals_of(&1), Vec::::new()); + assert_eq!(Council::all_approvals_of(&2), Vec::::new()); + assert_eq!(Council::all_approvals_of(&3), Vec::::new()); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); }); } #[test] fn invalid_retraction_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); - assert_eq!(Council::voters(), vec![1, 2]); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + assert_eq!(voter_ids(), vec![1, 2]); assert_noop!(Council::retract_voter(Origin::signed(1), 1), "retraction index mismatch"); }); } #[test] fn overflow_retraction_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); assert_noop!(Council::retract_voter(Origin::signed(1), 1), "retraction index invalid"); }); } #[test] fn non_voter_retraction_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); assert_noop!(Council::retract_voter(Origin::signed(2), 0), "cannot retract non-voter"); }); } + #[test] + fn approval_storage_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![], 0, 0)); + + assert_eq!(Council::all_approvals_of(&2), vec![true]); + // NOTE: these two are stored in mem differently though. + assert_eq!(Council::all_approvals_of(&3), vec![]); + assert_eq!(Council::all_approvals_of(&4), vec![]); + + assert_eq!(Council::approvals_of((3, 0)), vec![0]); + assert_eq!(Council::approvals_of((4, 0)), vec![]); + }); + } + #[test] fn simple_tally_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); - assert_eq!(Council::voters(), vec![2, 5]); - assert_eq!(Council::approvals_of(2), vec![true, false]); - assert_eq!(Council::approvals_of(5), vec![false, true]); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); + assert_eq!(voter_ids(), vec![2, 5]); + assert_eq!(Council::all_approvals_of(&2), vec![true]); + assert_eq!(Council::all_approvals_of(&5), vec![false, true]); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -953,34 +1974,71 @@ mod tests { assert!(!Council::is_a_candidate(&2)); assert!(!Council::is_a_candidate(&5)); assert_eq!(Council::vote_index(), 1); - assert_eq!(Council::voter_last_active(2), Some(0)); - assert_eq!(Council::voter_last_active(5), Some(0)); + assert_eq!(Council::voter_info(2), Some(VoterInfo { last_win: 1, last_active: 0, stake: 20, pot: 0 })); + assert_eq!(Council::voter_info(5), Some(VoterInfo { last_win: 1, last_active: 0, stake: 50, pot: 0 })); + }); + } + + #[test] + fn seats_should_be_released() { + with_externalities(&mut ExtBuilder::default().build(), || { + System::set_block_number(4); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(4), 2, 20, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 5, 50, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (0, 0), (20, 2), (50, 5)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(5, 11), (2, 11)]); + let mut current = System::block_number(); + let free_block; + loop { + current += 1; + System::set_block_number(current); + assert_ok!(Council::end_block(System::block_number())); + if Council::active_council().len() == 0 { + free_block = current; + break; + } + } + // 11 + 2 which is the next voting period. + assert_eq!(free_block, 14); }); } #[test] fn presentations_with_zero_staked_deposit_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_noop!(Council::present_winner(Origin::signed(4), 2, 0, 0), "stake deposited to present winner and be added to leaderboard should be non-zero"); + assert_noop!( + Council::present_winner(Origin::signed(4), 2, 0, 0), + "stake deposited to present winner and be added to leaderboard should be non-zero" + ); }); } #[test] fn double_presentations_should_be_punished() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { assert!(Balances::can_slash(&4, 10)); System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -996,10 +2054,10 @@ mod tests { #[test] fn retracting_inactive_voter_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1008,7 +2066,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1016,24 +2074,24 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); assert_ok!(Council::reap_inactive_voter(Origin::signed(5), - (Council::voters().iter().position(|&i| i == 5).unwrap() as u32).into(), - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 5).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 )); - assert_eq!(Council::voters(), vec![5]); - assert_eq!(Council::approvals_of(2).len(), 0); - assert_eq!(Balances::total_balance(&2), 17); - assert_eq!(Balances::total_balance(&5), 53); + assert_eq!(voter_ids(), vec![0, 5]); + assert_eq!(Council::all_approvals_of(&2).len(), 0); + assert_eq!(Balances::total_balance(&2), 20); + assert_eq!(Balances::total_balance(&5), 50); }); } #[test] fn presenting_for_double_election_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_eq!(Council::submit_candidacy(Origin::signed(2), 0), Ok(())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1041,21 +2099,26 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); + // NOTE: This is now mandatory to disable the lock + assert_ok!(Council::retract_voter(Origin::signed(2), 0)); assert_eq!(Council::submit_candidacy(Origin::signed(2), 0), Ok(())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_noop!(Council::present_winner(Origin::signed(4), 2, 20, 1), "candidate must not form a duplicated member if elected"); + assert_noop!( + Council::present_winner(Origin::signed(4), 2, 20, 1), + "candidate must not form a duplicated member if elected" + ); }); } #[test] fn retracting_inactive_voter_with_other_candidates_in_slots_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().voter_bond(2).build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1064,7 +2127,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1075,24 +2138,24 @@ mod tests { assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); assert_ok!(Council::reap_inactive_voter(Origin::signed(5), - (Council::voters().iter().position(|&i| i == 5).unwrap() as u32).into(), - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 5).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 )); - assert_eq!(Council::voters(), vec![5]); - assert_eq!(Council::approvals_of(2).len(), 0); - assert_eq!(Balances::total_balance(&2), 17); - assert_eq!(Balances::total_balance(&5), 53); + assert_eq!(voter_ids(), vec![0, 5]); + assert_eq!(Council::all_approvals_of(&2).len(), 0); + assert_eq!(Balances::total_balance(&2), 18); + assert_eq!(Balances::total_balance(&5), 52); }); } #[test] fn retracting_inactive_voter_with_bad_reporter_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1101,7 +2164,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1110,18 +2173,18 @@ mod tests { assert_noop!(Council::reap_inactive_voter(Origin::signed(2), 42, - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 - ), "bad reporter index"); + ), "invalid reporter index"); }); } #[test] fn retracting_inactive_voter_with_bad_target_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1130,7 +2193,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1138,25 +2201,25 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); assert_noop!(Council::reap_inactive_voter(Origin::signed(2), - (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2, 42, 2 - ), "bad target index"); + ), "invalid target index"); }); } #[test] fn attempting_to_retract_active_voter_should_slash_reporter() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 2)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 3)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false, false, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, false, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1171,34 +2234,34 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 1)); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 30, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20 + Council::get_offset(20, 1), 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30 + Council::get_offset(30, 1), 1)); assert_ok!(Council::end_block(System::block_number())); assert_eq!(Council::vote_index(), 2); assert_eq!(Council::inactivity_grace_period(), 1); assert_eq!(Council::voting_period(), 4); - assert_eq!(Council::voter_last_active(4), Some(0)); + assert_eq!(Council::voter_info(4), Some(VoterInfo { last_win: 1, last_active: 0, stake: 40, pot: 0 })); assert_ok!(Council::reap_inactive_voter(Origin::signed(4), - (Council::voters().iter().position(|&i| i == 4).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 4).unwrap() as u32).into(), 2, - (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 )); - assert_eq!(Council::voters(), vec![2, 3, 5]); - assert_eq!(Council::approvals_of(4).len(), 0); - assert_eq!(Balances::total_balance(&4), 37); + assert_eq!(voter_ids(), vec![2, 3, 0, 5]); + assert_eq!(Council::all_approvals_of(&4).len(), 0); + assert_eq!(Balances::total_balance(&4), 40); }); } #[test] fn attempting_to_retract_inactive_voter_by_nonvoter_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1207,7 +2270,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1216,7 +2279,7 @@ mod tests { assert_noop!(Council::reap_inactive_voter(Origin::signed(4), 0, - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 ), "reporter must be a voter"); }); @@ -1224,18 +2287,18 @@ mod tests { #[test] fn presenting_loser_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1257,18 +2320,18 @@ mod tests { #[test] fn presenting_loser_first_should_not_matter() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1289,21 +2352,24 @@ mod tests { #[test] fn present_outside_of_presentation_period_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_noop!(Council::present_winner(Origin::signed(5), 5, 1, 0), "cannot present outside of presentation period"); + assert_noop!( + Council::present_winner(Origin::signed(5), 5, 1, 0), + "cannot present outside of presentation period" + ); }); } #[test] fn present_with_invalid_vote_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1313,34 +2379,50 @@ mod tests { #[test] fn present_when_presenter_is_poor_should_not_work() { - with_externalities(&mut new_test_ext(false), || { - System::set_block_number(4); - assert!(!Council::presentation_active()); - - assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); - assert_ok!(Council::end_block(System::block_number())); - - System::set_block_number(6); - assert_eq!(Balances::free_balance(&1), 1); - assert_eq!(Balances::reserved_balance(&1), 9); - assert_noop!(Council::present_winner(Origin::signed(1), 1, 20, 0), "presenter must have sufficient slashable funds"); - }); + let test_present = |p| { + with_externalities(&mut ExtBuilder::default() + .voting_fee(5) + .voter_bond(2) + .bad_presentation_punishment(p) + .build(), + || { + System::set_block_number(4); + let _ = Balances::make_free_balance_be(&1, 15); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); // -3 + assert_eq!(Balances::free_balance(&1), 12); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); // -2 -5 + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert_eq!(Balances::free_balance(&1), 5); + assert_eq!(Balances::reserved_balance(&1), 5); + if p > 5 { + assert_noop!(Council::present_winner( + Origin::signed(1), 1, 10, 0), + "presenter must have sufficient slashable funds" + ); + } else { + assert_ok!(Council::present_winner(Origin::signed(1), 1, 10, 0)); + } + }); + }; + test_present(4); + test_present(6); } #[test] fn invalid_present_tally_should_slash() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); assert_eq!(Balances::total_balance(&4), 40); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1352,20 +2434,20 @@ mod tests { #[test] fn runners_up_should_be_kept() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); @@ -1373,7 +2455,7 @@ mod tests { assert!(Council::presentation_active()); assert_ok!(Council::present_winner(Origin::signed(4), 1, 60, 0)); // leaderboard length is the empty seats plus the carry count (i.e. 5 + 2), where those - // to be carried are the lowest and stored in lowest indexes + // to be carried are the lowest and stored in lowest indices assert_eq!(Council::leaderboard(), Some(vec![ (0, 0), (0, 0), @@ -1401,11 +2483,11 @@ mod tests { assert!(Council::is_a_candidate(&3)); assert!(Council::is_a_candidate(&4)); assert_eq!(Council::vote_index(), 1); - assert_eq!(Council::voter_last_active(2), Some(0)); - assert_eq!(Council::voter_last_active(3), Some(0)); - assert_eq!(Council::voter_last_active(4), Some(0)); - assert_eq!(Council::voter_last_active(5), Some(0)); - assert_eq!(Council::voter_last_active(6), Some(0)); + assert_eq!(Council::voter_info(2), Some(VoterInfo { last_win: 0, last_active: 0, stake: 20, pot: 0 })); + assert_eq!(Council::voter_info(3), Some(VoterInfo { last_win: 0, last_active: 0, stake: 30, pot: 0 })); + assert_eq!(Council::voter_info(4), Some(VoterInfo { last_win: 0, last_active: 0, stake: 40, pot: 0 })); + assert_eq!(Council::voter_info(5), Some(VoterInfo { last_win: 1, last_active: 0, stake: 50, pot: 0 })); + assert_eq!(Council::voter_info(6), Some(VoterInfo { last_win: 1, last_active: 0, stake: 60, pot: 0 })); assert_eq!(Council::candidate_reg_info(3), Some((0, 2))); assert_eq!(Council::candidate_reg_info(4), Some((0, 3))); }); @@ -1413,18 +2495,18 @@ mod tests { #[test] fn second_tally_should_use_runners_up() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1435,13 +2517,13 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![false, false, true, false], 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![false, false, true, false], 1, 0)); assert_ok!(Council::set_desired_seats(3)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 90, 1)); - assert_ok!(Council::present_winner(Origin::signed(4), 4, 40, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30 + Council::get_offset(30, 1) + 60, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 4, 40 + Council::get_offset(40, 1), 1)); assert_ok!(Council::end_block(System::block_number())); assert!(!Council::presentation_active()); @@ -1453,11 +2535,14 @@ mod tests { assert!(!Council::is_a_candidate(&5)); assert!(Council::is_a_candidate(&4)); assert_eq!(Council::vote_index(), 2); - assert_eq!(Council::voter_last_active(2), Some(0)); - assert_eq!(Council::voter_last_active(3), Some(0)); - assert_eq!(Council::voter_last_active(4), Some(0)); - assert_eq!(Council::voter_last_active(5), Some(0)); - assert_eq!(Council::voter_last_active(6), Some(1)); + assert_eq!(Council::voter_info(2), Some( VoterInfo { last_win: 0, last_active: 0, stake: 20, pot: 0})); + assert_eq!(Council::voter_info(3), Some( VoterInfo { last_win: 2, last_active: 0, stake: 30, pot: 0})); + assert_eq!(Council::voter_info(4), Some( VoterInfo { last_win: 0, last_active: 0, stake: 40, pot: 0})); + assert_eq!(Council::voter_info(5), Some( VoterInfo { last_win: 1, last_active: 0, stake: 50, pot: 0})); + assert_eq!( + Council::voter_info(6), + Some(VoterInfo { last_win: 2, last_active: 1, stake: 60, pot: 0}) + ); assert_eq!(Council::candidate_reg_info(4), Some((0, 3))); }); diff --git a/srml/indices/src/lib.rs b/srml/indices/src/lib.rs index 509e5c1133..38f7ee668d 100644 --- a/srml/indices/src/lib.rs +++ b/srml/indices/src/lib.rs @@ -45,7 +45,7 @@ pub trait ResolveHint { fn resolve_hint(who: &AccountId) -> Option; } -/// Simple encode-based resolve hint implemenntation. +/// Simple encode-based resolve hint implementation. pub struct SimpleResolveHint(PhantomData<(AccountId, AccountIndex)>); impl> ResolveHint for SimpleResolveHint -- GitLab From dacdac6addf81c2e57b4b86cb3b595eddb0c2b74 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Fri, 7 Jun 2019 15:27:55 +0200 Subject: [PATCH 093/140] Fix construct_runtime multiple log issue (#2816) * Fix comma issue * multiple log test --- srml/support/src/runtime.rs | 2 +- srml/support/test/tests/instance.rs | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/srml/support/src/runtime.rs b/srml/support/src/runtime.rs index 4bf574bae5..1ce95a3f3c 100644 --- a/srml/support/src/runtime.rs +++ b/srml/support/src/runtime.rs @@ -287,7 +287,7 @@ macro_rules! construct_runtime { $uncheckedextrinsic; ; $( - $name: $module::{ $( $modules $( ( $( $modules_args ),* ) )* ),* } + $name: $module::{ $( $modules $( ( $( $modules_args )* ) )* ),* } ),*; ); $crate::__impl_outer_validate_unsigned!( diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index 796934777d..df9f648c18 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -163,14 +163,17 @@ mod module1 { pub type Log = RawLog< T, I, + ::Hash, >; /// A logs in this module. #[cfg_attr(feature = "std", derive(serde::Serialize, Debug))] #[derive(parity_codec::Encode, parity_codec::Decode, PartialEq, Eq, Clone)] - pub enum RawLog { + pub enum RawLog { _Phantom(rstd::marker::PhantomData<(T, I)>), AmountChange(u32), + ChangesTrieRoot(Hash), + AuthoritiesChange(Vec<()>), } pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"12345678"; @@ -341,8 +344,8 @@ srml_support::construct_runtime!( UncheckedExtrinsic = UncheckedExtrinsic { System: system::{Module, Call, Event, Log(ChangesTrieRoot)}, - Module1_1: module1::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, - Module1_2: module1::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, + Module1_1: module1::::{Module, Call, Storage, Event, Config, Origin, Log(ChangesTrieRoot, AuthoritiesChange), Inherent}, + Module1_2: module1::::{Module, Call, Storage, Event, Config, Origin, Log(ChangesTrieRoot, AuthoritiesChange), Inherent}, Module2: module2::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, Module2_1: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, Module2_2: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, -- GitLab From c67dff53d0435c21fd45fd02e8fe7297cde7a7d9 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Fri, 7 Jun 2019 15:30:45 +0200 Subject: [PATCH 094/140] Move modules around in network (#2822) * Rename modules in protocol * Line widths --- core/network/src/lib.rs | 13 ++---- core/network/src/on_demand_layer.rs | 2 +- core/network/src/protocol.rs | 26 +++++++---- .../src/{ => protocol}/consensus_gossip.rs | 7 ++- core/network/src/{ => protocol}/message.rs | 0 core/network/src/{ => protocol}/on_demand.rs | 0 .../src/{ => protocol}/specialization.rs | 0 core/network/src/{ => protocol}/sync.rs | 46 +++++++++++++++---- .../network/src/{ => protocol/sync}/blocks.rs | 29 ++++++++---- .../src/{ => protocol}/sync/extra_requests.rs | 4 +- core/network/src/{ => protocol}/util.rs | 0 core/network/src/service.rs | 8 ++-- 12 files changed, 89 insertions(+), 46 deletions(-) rename core/network/src/{ => protocol}/consensus_gossip.rs (99%) rename core/network/src/{ => protocol}/message.rs (100%) rename core/network/src/{ => protocol}/on_demand.rs (100%) rename core/network/src/{ => protocol}/specialization.rs (100%) rename core/network/src/{ => protocol}/sync.rs (96%) rename core/network/src/{ => protocol/sync}/blocks.rs (89%) rename core/network/src/{ => protocol}/sync/extra_requests.rs (99%) rename core/network/src/{ => protocol}/util.rs (100%) diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index e2def15425..a65df59fd8 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -24,19 +24,12 @@ //! mod service; -mod sync; #[macro_use] mod protocol; mod chain; -mod blocks; -mod on_demand; mod on_demand_layer; -mod util; pub mod config; -pub mod consensus_gossip; pub mod error; -pub mod message; -pub mod specialization; #[cfg(any(test, feature = "test-helpers"))] pub mod test; @@ -46,8 +39,8 @@ pub use service::{ NetworkService, NetworkWorker, FetchFuture, TransactionPool, ManageNetwork, NetworkMsg, SyncProvider, ExHashT, ReportHandle, }; -pub use protocol::{ProtocolStatus, PeerInfo, Context}; -pub use sync::{Status as SyncStatus, SyncState}; +pub use protocol::{ProtocolStatus, PeerInfo, Context, consensus_gossip, message, specialization}; +pub use protocol::sync::{Status as SyncStatus, SyncState}; pub use network_libp2p::{ identity, multiaddr, ProtocolId, Multiaddr, @@ -57,7 +50,7 @@ pub use network_libp2p::{ }; pub use message::{generic as generic_message, RequestId, Status as StatusMessage}; pub use error::Error; -pub use on_demand::AlwaysBadChecker; +pub use protocol::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/on_demand_layer.rs b/core/network/src/on_demand_layer.rs index e58e045f2e..86b3d6b7f4 100644 --- a/core/network/src/on_demand_layer.rs +++ b/core/network/src/on_demand_layer.rs @@ -16,7 +16,7 @@ //! On-demand requests service. -use crate::on_demand::RequestData; +use crate::protocol::on_demand::RequestData; use std::sync::Arc; use futures::{prelude::*, sync::mpsc, sync::oneshot}; use parking_lot::Mutex; diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 651f064513..576d37a82f 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -24,16 +24,16 @@ use runtime_primitives::traits::{ CheckedSub, SaturatedConversion }; use consensus::import_queue::SharedFinalityProofRequestBuilder; -use crate::message::{ - self, BlockRequest as BlockRequestMessage, +use message::{ + BlockRequest as BlockRequestMessage, FinalityProofRequest as FinalityProofRequestMessage, Message, }; -use crate::message::{BlockAttributes, Direction, FromBlock, RequestId}; -use crate::message::generic::{Message as GenericMessage, ConsensusMessage}; -use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; -use crate::on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; -use crate::specialization::NetworkSpecialization; -use crate::sync::{ChainSync, Context as SyncContext, Status as SyncStatus, SyncState}; +use message::{BlockAttributes, Direction, FromBlock, RequestId}; +use message::generic::{Message as GenericMessage, ConsensusMessage}; +use consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; +use on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; +use specialization::NetworkSpecialization; +use sync::{ChainSync, Context as SyncContext, Status as SyncStatus, SyncState}; use crate::service::{TransactionPool, ExHashT}; use crate::config::Roles; use rustc_hex::ToHex; @@ -43,7 +43,15 @@ 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}; +use crate::error; +use util::LruHashSet; + +mod util; +pub mod consensus_gossip; +pub mod message; +pub mod on_demand; +pub mod specialization; +pub mod sync; const REQUEST_TIMEOUT_SEC: u64 = 40; /// Interval at which we perform time based maintenance diff --git a/core/network/src/consensus_gossip.rs b/core/network/src/protocol/consensus_gossip.rs similarity index 99% rename from core/network/src/consensus_gossip.rs rename to core/network/src/protocol/consensus_gossip.rs index 9d654b5bfa..5de6fb2602 100644 --- a/core/network/src/consensus_gossip.rs +++ b/core/network/src/protocol/consensus_gossip.rs @@ -208,7 +208,12 @@ pub trait Validator: Send + Sync { } /// Validate consensus message. - fn validate(&self, context: &mut dyn ValidatorContext, sender: &PeerId, data: &[u8]) -> ValidationResult; + fn validate( + &self, + context: &mut dyn ValidatorContext, + sender: &PeerId, + data: &[u8] + ) -> ValidationResult; /// Produce a closure for validating messages on a given topic. fn message_expired<'a>(&'a self) -> Box bool + 'a> { diff --git a/core/network/src/message.rs b/core/network/src/protocol/message.rs similarity index 100% rename from core/network/src/message.rs rename to core/network/src/protocol/message.rs diff --git a/core/network/src/on_demand.rs b/core/network/src/protocol/on_demand.rs similarity index 100% rename from core/network/src/on_demand.rs rename to core/network/src/protocol/on_demand.rs diff --git a/core/network/src/specialization.rs b/core/network/src/protocol/specialization.rs similarity index 100% rename from core/network/src/specialization.rs rename to core/network/src/protocol/specialization.rs diff --git a/core/network/src/sync.rs b/core/network/src/protocol/sync.rs similarity index 96% rename from core/network/src/sync.rs rename to core/network/src/protocol/sync.rs index f3f62cac01..4ec8f18e35 100644 --- a/core/network/src/sync.rs +++ b/core/network/src/protocol/sync.rs @@ -39,8 +39,8 @@ use network_libp2p::PeerId; use client::{BlockStatus, ClientInfo}; use consensus::{BlockOrigin, import_queue::{IncomingBlock, SharedFinalityProofRequestBuilder}}; use client::error::Error as ClientError; -use crate::blocks::BlockCollection; -use crate::sync::extra_requests::ExtraRequestsAggregator; +use blocks::BlockCollection; +use extra_requests::ExtraRequestsAggregator; use runtime_primitives::traits::{ Block as BlockT, Header as HeaderT, NumberFor, Zero, One, CheckedSub, SaturatedConversion @@ -50,6 +50,7 @@ use crate::message; use crate::config::Roles; use std::collections::HashSet; +mod blocks; mod extra_requests; // Maximum blocks to request in a single packet. @@ -303,13 +304,18 @@ impl ChainSync { common_number: Zero::zero(), best_hash: info.best_hash, best_number: info.best_number, - state: PeerSyncState::AncestorSearch(common_best, AncestorSearchState::ExponentialBackoff(One::one())), + state: PeerSyncState::AncestorSearch( + common_best, + AncestorSearchState::ExponentialBackoff(One::one()) + ), recently_announced: Default::default(), }); Self::request_ancestry(protocol, who, common_best) } }, - (Ok(BlockStatus::Queued), _) | (Ok(BlockStatus::InChainWithState), _) | (Ok(BlockStatus::InChainPruned), _) => { + (Ok(BlockStatus::Queued), _) | + (Ok(BlockStatus::InChainWithState), _) | + (Ok(BlockStatus::InChainPruned), _) => { debug!(target:"sync", "New peer with known best hash {} ({}).", info.best_hash, info.best_number); self.peers.insert(who.clone(), PeerSync { common_number: info.best_number, @@ -441,7 +447,8 @@ impl ChainSync { protocol.disconnect_peer(who); return None } - if let Some((next_state, next_block_num)) = Self::handle_ancestor_search_state(state, num, block_hash_match) { + 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 None @@ -450,7 +457,9 @@ impl ChainSync { vec![] } }, - PeerSyncState::Available | PeerSyncState::DownloadingJustification(..) | PeerSyncState::DownloadingFinalityProof(..) => Vec::new(), + PeerSyncState::Available | + PeerSyncState::DownloadingJustification(..) | + PeerSyncState::DownloadingFinalityProof(..) => Vec::new(), } } else { Vec::new() @@ -770,11 +779,19 @@ impl ChainSync { if protocol.client().block_status(&BlockId::Number(*header.number())) .unwrap_or(BlockStatus::Unknown) == BlockStatus::InChainPruned { - trace!(target: "sync", "Ignored unknown ancient block announced from {}: {} {:?}", who, hash, header); + trace!( + target: "sync", + "Ignored unknown ancient block announced from {}: {} {:?}", + who, hash, header + ); return false; } - trace!(target: "sync", "Considering new unknown stale block announced from {}: {} {:?}", who, hash, header); + trace!( + target: "sync", + "Considering new unknown stale block announced from {}: {} {:?}", + who, hash, header + ); let request = self.download_unknown_stale(&who, &hash); match request { Some(request) => if requires_additional_data { @@ -787,7 +804,11 @@ impl ChainSync { } } else { if ancient_parent { - trace!(target: "sync", "Ignored ancient stale block announced from {}: {} {:?}", who, hash, header); + trace!( + target: "sync", + "Ignored ancient stale block announced from {}: {} {:?}", + who, hash, header + ); return false; } @@ -934,7 +955,12 @@ impl ChainSync { peer.common_number, peer.best_number, ); - let range = self.blocks.needed_blocks(who.clone(), MAX_BLOCKS_TO_REQUEST, peer.best_number, peer.common_number); + let range = self.blocks.needed_blocks( + who.clone(), + MAX_BLOCKS_TO_REQUEST, + peer.best_number, + peer.common_number + ); match range { Some(range) => { trace!(target: "sync", "Requesting blocks from {}, ({} to {})", who, range.start, range.end); diff --git a/core/network/src/blocks.rs b/core/network/src/protocol/sync/blocks.rs similarity index 89% rename from core/network/src/blocks.rs rename to core/network/src/protocol/sync/blocks.rs index d693afba17..66730fcc3e 100644 --- a/core/network/src/blocks.rs +++ b/core/network/src/protocol/sync/blocks.rs @@ -100,7 +100,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>> { + 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 + >::one(); let count = (count as u32).into(); @@ -110,7 +111,8 @@ impl BlockCollection { loop { let next = downloading_iter.next(); break match &(prev, next) { - &(Some((start, &BlockRangeState::Downloading { ref len, downloading })), _) if downloading < MAX_PARALLEL_DOWNLOADS => + &(Some((start, &BlockRangeState::Downloading { ref len, downloading })), _) + if downloading < MAX_PARALLEL_DOWNLOADS => (*start .. *start + *len, downloading), &(Some((start, r)), Some((next_start, _))) if *start + r.len() < *next_start => (*start + r.len() .. cmp::min(*next_start, *start + r.len() + count), 0), // gap @@ -134,9 +136,13 @@ impl BlockCollection { } 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 }); + self.blocks.insert(range.start, BlockRangeState::Downloading { + len: range.end - range.start, + downloading: downloading + 1 + }); if range.end <= range.start { - panic!("Empty range {:?}, count={}, peer_best={}, common={}, blocks={:?}", range, count, peer_best, common, self.blocks); + panic!("Empty range {:?}, count={}, peer_best={}, common={}, blocks={:?}", + range, count, peer_best, common, self.blocks); } Some(range) } @@ -248,14 +254,17 @@ mod test { bc.insert(1, blocks[1..11].to_vec(), peer0.clone()); assert_eq!(bc.needed_blocks(peer0.clone(), 40, 150, 0), Some(11 .. 41)); - assert_eq!(bc.drain(1), blocks[1..11].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()); + assert_eq!(bc.drain(1), blocks[1..11].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()); bc.clear_peer_download(&peer0); bc.insert(11, blocks[11..41].to_vec(), peer0.clone()); let drained = bc.drain(12); - assert_eq!(drained[..30], blocks[11..41].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()[..]); - assert_eq!(drained[30..], blocks[41..81].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); + assert_eq!(drained[..30], blocks[11..41].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()[..]); + assert_eq!(drained[30..], blocks[41..81].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); bc.clear_peer_download(&peer2); assert_eq!(bc.needed_blocks(peer2.clone(), 40, 150, 80), Some(81 .. 121)); @@ -266,8 +275,10 @@ mod test { assert_eq!(bc.drain(80), vec![]); let drained = bc.drain(81); - assert_eq!(drained[..40], blocks[81..121].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer2.clone()) }).collect::>()[..]); - assert_eq!(drained[40..], blocks[121..150].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); + assert_eq!(drained[..40], blocks[81..121].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer2.clone()) }).collect::>()[..]); + assert_eq!(drained[40..], blocks[121..150].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); } #[test] diff --git a/core/network/src/sync/extra_requests.rs b/core/network/src/protocol/sync/extra_requests.rs similarity index 99% rename from core/network/src/sync/extra_requests.rs rename to core/network/src/protocol/sync/extra_requests.rs index ff8323166b..f41997a05c 100644 --- a/core/network/src/sync/extra_requests.rs +++ b/core/network/src/protocol/sync/extra_requests.rs @@ -23,8 +23,8 @@ 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}; +use crate::protocol::message; +use crate::protocol::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); diff --git a/core/network/src/util.rs b/core/network/src/protocol/util.rs similarity index 100% rename from core/network/src/util.rs rename to core/network/src/protocol/util.rs diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 88c13b4806..6a328e854d 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -31,14 +31,14 @@ 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::on_demand::RequestData; +use crate::protocol::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; +use crate::protocol::message::Message; +use crate::protocol::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 crate::protocol::specialization::NetworkSpecialization; /// Interval at which we send status updates on the SyncProvider status stream. const STATUS_INTERVAL: Duration = Duration::from_millis(5000); -- GitLab From 43164e24f23fe71d82906b4379e043bfdf9beba3 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Fri, 7 Jun 2019 16:06:15 +0200 Subject: [PATCH 095/140] More crate compiling for WASM-browser (#2825) * More crate compiling for WASM-browser * Update runtime Cargo.lock --- .gitlab-ci.yml | 4 +++ Cargo.lock | 4 ++- core/consensus/aura/Cargo.toml | 3 +- core/consensus/aura/src/lib.rs | 4 +-- core/consensus/babe/Cargo.toml | 3 +- core/consensus/babe/src/lib.rs | 4 +-- core/consensus/slots/Cargo.toml | 2 +- core/consensus/slots/src/lib.rs | 54 ------------------------------- core/consensus/slots/src/slots.rs | 2 +- core/test-runtime/wasm/Cargo.lock | 2 +- 10 files changed, 18 insertions(+), 64 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 99b354a60b..d3c9951df4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -137,10 +137,14 @@ check-web-wasm: - 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-client + - time cargo web build -p substrate-consensus-aura + - time cargo web build -p substrate-consensus-babe - 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 - time cargo web build -p substrate-network-libp2p - time cargo web build -p substrate-panic-handler - time cargo web build -p substrate-peerset diff --git a/Cargo.lock b/Cargo.lock index 7e92564208..738ccb6694 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4068,6 +4068,7 @@ dependencies = [ "substrate-telemetry 2.0.0", "substrate-test-client 2.0.0", "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4125,6 +4126,7 @@ dependencies = [ "substrate-telemetry 2.0.0", "substrate-test-client 2.0.0", "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4196,7 +4198,7 @@ dependencies = [ "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", "substrate-test-client 2.0.0", - "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index 446dcbff3a..9c46b942a4 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -22,7 +22,7 @@ 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" +tokio-timer = "0.2.11" parking_lot = "0.8.0" log = "0.4" @@ -32,4 +32,5 @@ 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" } +tokio = "0.1.7" env_logger = "0.6" diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index e3fffad33f..ad618c2188 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -56,7 +56,7 @@ use inherents::{InherentDataProviders, InherentData}; use authorities::AuthoritiesApi; use futures::{Future, IntoFuture, future}; -use tokio::timer::Timeout; +use tokio_timer::Timeout; use log::{error, warn, debug, info, trace}; use srml_aura::{ @@ -914,7 +914,7 @@ mod tests { .map(|_| ()) .map_err(|_| ()); - let drive_to_completion = ::tokio::timer::Interval::new_interval(TEST_ROUTING_INTERVAL) + 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(); diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 04cd42c680..020497a104 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -23,7 +23,7 @@ authorities = { package = "substrate-consensus-authorities", path = "../authorit slots = { package = "substrate-consensus-slots", path = "../slots" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } futures = "0.1.26" -tokio = "0.1.18" +tokio-timer = "0.2.11" parking_lot = "0.8.0" log = "0.4.6" schnorrkel = "0.1.1" @@ -36,4 +36,5 @@ 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" } +tokio = "0.1.18" env_logger = "0.6.1" diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index c66eb68137..f28c23de54 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -79,7 +79,7 @@ use client::{ }; use slots::{CheckedHeader, check_equivocation}; use futures::{Future, IntoFuture, future}; -use tokio::timer::Timeout; +use tokio_timer::Timeout; use log::{error, warn, debug, info, trace}; use slots::{SlotWorker, SlotData, SlotInfo, SlotCompatible, slot_now}; @@ -984,7 +984,7 @@ mod tests { .map(drop) .map_err(drop); - let drive_to_completion = ::tokio::timer::Interval::new_interval(TEST_ROUTING_INTERVAL) + 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(); diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index 7a3b487dc6..b82c2fc9d7 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -13,7 +13,7 @@ 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" +tokio-timer = "0.2.11" parking_lot = "0.8.0" log = "0.4" diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index aee398a9ce..18ec2451be 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -41,8 +41,6 @@ use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ApiRef, Block, ProvideRuntimeApi}; use std::fmt::Debug; use std::ops::Deref; -use std::sync::mpsc; -use std::thread; /// A worker that should be invoked at every new slot. pub trait SlotWorker { @@ -66,58 +64,6 @@ pub trait SlotCompatible { ) -> 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: W, - 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 = start_slot_worker::<_, _, _, T, _, SC>( - slot_duration.clone(), - select_chain, - worker, - sync_oracle, - inherent_data_providers, - ); - - result_sender - .send(Ok(())) - .expect("Receive is not dropped before receiving a result; qed"); - - let _ = runtime.block_on(slot_worker_future.select(on_exit).map(|_| ())); - }); - - result_recv - .recv() - .expect("Slots start thread result sender dropped") -} - /// Start a new slot worker. /// /// Every time a new slot is triggered, `worker.on_slot` is called and the future it returns is diff --git a/core/consensus/slots/src/slots.rs b/core/consensus/slots/src/slots.rs index 964eeaff29..a848a96762 100644 --- a/core/consensus/slots/src/slots.rs +++ b/core/consensus/slots/src/slots.rs @@ -26,7 +26,7 @@ use inherents::{InherentData, InherentDataProviders}; use log::warn; use std::marker::PhantomData; use std::time::{Duration, Instant}; -use tokio::timer::Delay; +use tokio_timer::Delay; /// Returns current duration since unix epoch. pub fn duration_now() -> Option { diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index be1e3ab84f..19c6b36ebc 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -2561,7 +2561,7 @@ dependencies = [ "substrate-consensus-common 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -- GitLab From 389d4f93f4cf52cf821403793555b33df11c092f Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 9 Jun 2019 11:38:41 +0200 Subject: [PATCH 096/140] polite-grandpa: Ensure only votes from a set's voters are propagated (#2720) * make authorities available to gossip * make local view optional until set * address grumbles * micro-optimize: encode without lock held --- core/finality-grandpa/src/aux_schema.rs | 143 +++++++----- .../src/communication/gossip.rs | 213 +++++++++++++----- .../finality-grandpa/src/communication/mod.rs | 29 ++- core/finality-grandpa/src/environment.rs | 51 +++-- core/finality-grandpa/src/lib.rs | 18 +- core/finality-grandpa/src/observer.rs | 16 +- 6 files changed, 325 insertions(+), 145 deletions(-) diff --git a/core/finality-grandpa/src/aux_schema.rs b/core/finality-grandpa/src/aux_schema.rs index 4dd6e75dd9..824c65b9e6 100644 --- a/core/finality-grandpa/src/aux_schema.rs +++ b/core/finality-grandpa/src/aux_schema.rs @@ -151,16 +151,22 @@ fn migrate_from_version0( None => (0, genesis_round()), }; + let set_id = new_set.current().0; + let base = last_round_state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); let set_state = VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: last_round_number, - state: last_round_state, - votes: Vec::new(), - base, - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: last_round_number, + state: last_round_state, + votes: Vec::new(), + base, + }, + set_id, + &new_set, + ), current_round: HasVoted::No, }; @@ -189,6 +195,19 @@ fn migrate_from_version1( backend, AUTHORITY_SET_KEY, )? { + let set_id = set.current().0; + + let completed_rounds = |number, state, base| CompletedRounds::new( + CompletedRound { + number, + state, + votes: Vec::new(), + base, + }, + set_id, + &set, + ); + let set_state = match load_decode::<_, V1VoterSetState>>( backend, SET_STATE_KEY, @@ -198,12 +217,7 @@ fn migrate_from_version1( .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); VoterSetState::Paused { - completed_rounds: CompletedRounds::new(CompletedRound { - number: last_round_number, - state: set_state, - votes: Vec::new(), - base, - }), + completed_rounds: completed_rounds(last_round_number, set_state, base), } }, Some(V1VoterSetState::Live(last_round_number, set_state)) => { @@ -211,12 +225,7 @@ fn migrate_from_version1( .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: last_round_number, - state: set_state, - votes: Vec::new(), - base, - }), + completed_rounds: completed_rounds(last_round_number, set_state, base), current_round: HasVoted::No, } }, @@ -226,12 +235,7 @@ fn migrate_from_version1( .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: 0, - state: set_state, - votes: Vec::new(), - base, - }), + completed_rounds: completed_rounds(0, set_state, base), current_round: HasVoted::No, } }, @@ -298,12 +302,16 @@ pub(crate) fn load_persistent( .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: 0, - votes: Vec::new(), - base, - state, - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: 0, + votes: Vec::new(), + base, + state, + }, + set.current().0, + &set, + ), current_round: HasVoted::No, } } @@ -325,18 +333,23 @@ pub(crate) fn load_persistent( info!(target: "afg", "Loading GRANDPA authority set \ from genesis on what appears to be first startup."); - let genesis_set = AuthoritySet::genesis(genesis_authorities()?); + let genesis_authorities = genesis_authorities()?; + let genesis_set = AuthoritySet::genesis(genesis_authorities.clone()); let state = make_genesis_round(); let base = state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); let genesis_state = VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: 0, - votes: Vec::new(), - state, - base, - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: 0, + votes: Vec::new(), + state, + base, + }, + 0, + &genesis_set, + ), current_round: HasVoted::No, }; backend.insert_aux( @@ -355,6 +368,10 @@ pub(crate) fn load_persistent( } /// Update the authority set on disk after a change. +/// +/// If there has just been a handoff, pass a `new_set` parameter that describes the +/// handoff. `set` in all cases should reflect the current authority set, with all +/// changes and handoffs applied. pub(crate) fn update_authority_set( set: &AuthoritySet>, new_set: Option<&NewAuthoritySet>>, @@ -385,12 +402,16 @@ pub(crate) fn update_authority_set( new_set.canon_number.clone(), )); let set_state = VoterSetState::::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: 0, - state: round_state, - votes: Vec::new(), - base: (new_set.canon_hash, new_set.canon_number), - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: 0, + state: round_state, + votes: Vec::new(), + base: (new_set.canon_hash, new_set.canon_number), + }, + new_set.set_id, + &set, + ), current_round: HasVoted::No, }; let encoded = set_state.encode(); @@ -500,7 +521,7 @@ mod test { assert_eq!( *authority_set.inner().read(), AuthoritySet { - current_authorities: authorities, + current_authorities: authorities.clone(), pending_standard_changes: ForkTree::new(), pending_forced_changes: Vec::new(), set_id, @@ -510,12 +531,16 @@ mod test { assert_eq!( &*set_state.read(), &VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: round_number, - state: round_state.clone(), - base: round_state.prevote_ghost.unwrap(), - votes: vec![], - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: round_number, + state: round_state.clone(), + base: round_state.prevote_ghost.unwrap(), + votes: vec![], + }, + set_id, + &*authority_set.inner().read(), + ), current_round: HasVoted::No, }, ); @@ -583,7 +608,7 @@ mod test { assert_eq!( *authority_set.inner().read(), AuthoritySet { - current_authorities: authorities, + current_authorities: authorities.clone(), pending_standard_changes: ForkTree::new(), pending_forced_changes: Vec::new(), set_id, @@ -593,12 +618,16 @@ mod test { assert_eq!( &*set_state.read(), &VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: round_number, - state: round_state.clone(), - base: round_state.prevote_ghost.unwrap(), - votes: vec![], - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: round_number, + state: round_state.clone(), + base: round_state.prevote_ghost.unwrap(), + votes: vec![], + }, + set_id, + &*authority_set.inner().read(), + ), current_round: HasVoted::No, }, ); diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index 460998e707..ca529125ec 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -71,6 +71,7 @@ use runtime_primitives::traits::{NumberFor, Block as BlockT, Zero}; use network::consensus_gossip::{self as network_gossip, MessageIntent, ValidatorContext}; use network::{config::Roles, PeerId}; use parity_codec::{Encode, Decode}; +use crate::ed25519::Public as AuthorityId; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG}; use log::{trace, debug, warn}; @@ -94,6 +95,8 @@ enum Consider { RejectPast, /// Message is from the future. Reject. RejectFuture, + /// Message cannot be evaluated. Reject. + RejectOutOfScope, } /// A view of protocol state. @@ -300,6 +303,10 @@ pub(super) enum Misbehavior { // A message received that's from the future relative to our view. // always misbehavior. FutureMessage, + // A message received that cannot be evaluated relative to our view. + // This happens before we have a view and have sent out neighbor packets. + // always misbehavior. + OutOfScopeMessage, } impl Misbehavior { @@ -319,6 +326,7 @@ impl Misbehavior { (benefit as i32).saturating_add(cost as i32) }, FutureMessage => cost::FUTURE_MESSAGE, + OutOfScopeMessage => cost::OUT_OF_SCOPE_MESSAGE, } } } @@ -407,7 +415,7 @@ impl Peers { } } -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub(super) enum Action { // repropagate under given topic, to the given peers, applying cost/benefit to originator. Keep(H, i32), @@ -418,9 +426,10 @@ pub(super) enum Action { } struct Inner { - local_view: View>, + local_view: Option>>, peers: Peers>, live_topics: KeepTopics, + authorities: Vec, config: crate::Config, next_rebroadcast: Instant, } @@ -430,58 +439,87 @@ type MaybeMessage = Option<(Vec, NeighborPacket> impl Inner { fn new(config: crate::Config) -> Self { Inner { - local_view: View::default(), + local_view: None, peers: Peers::default(), live_topics: KeepTopics::new(), next_rebroadcast: Instant::now() + REBROADCAST_AFTER, + authorities: Vec::new(), config, } } - /// Note a round in a set has started. - 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 None; - } + /// Note a round in the current set has started. + fn note_round(&mut self, round: Round) -> MaybeMessage { + { + let local_view = match self.local_view { + None => return None, + Some(ref mut v) => if v.round == round { + return None + } else { + v + }, + }; + + let set_id = local_view.set_id; - debug!(target: "afg", "Voter {} noting beginning of round {:?} to network.", - self.config.name(), (round, set_id)); + debug!(target: "afg", "Voter {} noting beginning of round {:?} to network.", + self.config.name(), (round,set_id)); - self.local_view.round = round; - self.local_view.set_id = set_id; + local_view.round = round; - self.live_topics.push(round, set_id); + self.live_topics.push(round, set_id); + } 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) -> MaybeMessage { - if self.local_view.set_id == set_id { - return None; - } + fn note_set(&mut self, set_id: SetId, authorities: Vec) -> MaybeMessage { + { + let local_view = match self.local_view { + ref mut x @ None => x.get_or_insert(View { + round: Round(0), + set_id, + last_commit: None, + }), + Some(ref mut v) => if v.set_id == set_id { + return None + } else { + v + }, + }; - self.local_view.update_set(set_id); - self.live_topics.push(Round(0), set_id); + local_view.update_set(set_id); + self.live_topics.push(Round(0), set_id); + self.authorities = authorities; + } self.multicast_neighbor_packet() } /// Note that we've imported a commit finalizing a given block. 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() - } else { - None + { + match self.local_view { + None => return None, + Some(ref mut v) => if v.last_commit.as_ref() < Some(&finalized) { + v.last_commit = Some(finalized); + } else { + return None + }, + }; } + + self.multicast_neighbor_packet() } fn consider_vote(&self, round: Round, set_id: SetId) -> Consider { - self.local_view.consider_vote(round, set_id) + self.local_view.as_ref().map(|v| v.consider_vote(round, set_id)) + .unwrap_or(Consider::RejectOutOfScope) } fn consider_global(&self, set_id: SetId, number: NumberFor) -> Consider { - self.local_view.consider_global(set_id, number) + self.local_view.as_ref().map(|v| v.consider_global(set_id, number)) + .unwrap_or(Consider::RejectOutOfScope) } fn cost_past_rejection(&self, _who: &PeerId, _round: Round, _set_id: SetId) -> i32 { @@ -494,11 +532,18 @@ impl Inner { { match self.consider_vote(full.round, full.set_id) { Consider::RejectFuture => return Action::Discard(Misbehavior::FutureMessage.cost()), + Consider::RejectOutOfScope => return Action::Discard(Misbehavior::OutOfScopeMessage.cost()), Consider::RejectPast => return Action::Discard(self.cost_past_rejection(who, full.round, full.set_id)), Consider::Accept => {}, } + // ensure authority is part of the set. + if !self.authorities.contains(&full.message.id) { + telemetry!(CONSENSUS_DEBUG; "afg.bad_msg_signature"; "signature" => ?full.message.id); + return Action::Discard(cost::UNKNOWN_VOTER); + } + if let Err(()) = super::check_message_sig::( &full.message.message, &full.message.id, @@ -527,7 +572,9 @@ impl Inner { Consider::RejectFuture => return Action::Discard(Misbehavior::FutureMessage.cost()), Consider::RejectPast => return Action::Discard(self.cost_past_rejection(who, full.round, full.set_id)), + Consider::RejectOutOfScope => return Action::Discard(Misbehavior::OutOfScopeMessage.cost()), Consider::Accept => {}, + } if full.message.precommits.len() != full.message.auth_data.len() || full.message.precommits.is_empty() { @@ -561,14 +608,16 @@ impl Inner { } 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()), - }; + self.local_view.as_ref().map(|local_view| { + let packet = NeighborPacket { + round: local_view.round, + set_id: local_view.set_id, + commit_finalized_height: local_view.last_commit.unwrap_or(Zero::zero()), + }; - let peers = self.peers.inner.keys().cloned().collect(); - Some((peers, packet)) + let peers = self.peers.inner.keys().cloned().collect(); + (peers, packet) + }) } } @@ -579,7 +628,7 @@ pub(super) struct GossipValidator { } impl GossipValidator { - /// Create a new gossip-validator. + /// Create a new gossip-validator. This initialized the current set to 0. pub(super) fn new(config: crate::Config) -> (GossipValidator, ReportStream) { let (tx, rx) = mpsc::unbounded(); let val = GossipValidator { @@ -590,21 +639,22 @@ impl GossipValidator { (val, ReportStream { reports: rx }) } - /// Note a round in a set has started. - pub(super) fn note_round(&self, round: Round, set_id: SetId, send_neighbor: F) + /// Note a round in the current set has started. + pub(super) fn note_round(&self, round: Round, send_neighbor: F) where F: FnOnce(Vec, NeighborPacket>) { - let maybe_msg = self.inner.write().note_round(round, set_id); + let maybe_msg = self.inner.write().note_round(round); 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, send_neighbor: F) + /// Note that a voter set with given ID has started. Updates the current set to given + /// value and initializes the round to 0. + pub(super) fn note_set(&self, set_id: SetId, authorities: Vec, send_neighbor: F) where F: FnOnce(Vec, NeighborPacket>) { - let maybe_msg = self.inner.write().note_set(set_id); + let maybe_msg = self.inner.write().note_set(set_id, authorities); if let Some((to, msg)) = maybe_msg { send_neighbor(to, msg); } @@ -658,19 +708,23 @@ impl GossipValidator { impl network_gossip::Validator for GossipValidator { fn new_peer(&self, context: &mut dyn ValidatorContext, who: &PeerId, _roles: Roles) { - let packet_data = { + let packet = { let mut inner = self.inner.write(); inner.peers.new_peer(who.clone()); - 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() + inner.local_view.as_ref().map(|v| { + NeighborPacket { + round: v.round, + set_id: v.set_id, + commit_finalized_height: v.last_commit.unwrap_or(Zero::zero()), + } + }) }; - context.send_message(who, packet_data); + + if let Some(packet) = packet { + let packet_data = GossipMessage::::from(packet).encode(); + context.send_message(who, packet_data); + } } fn peer_disconnected(&self, _context: &mut dyn ValidatorContext, who: &PeerId) { @@ -746,7 +800,12 @@ impl network_gossip::Validator for GossipValidator } // global message. - let our_best_commit = inner.local_view.last_commit; + let local_view = match inner.local_view { + Some(ref v) => v, + None => return false, // cannot evaluate until we have a local view. + }; + + let our_best_commit = local_view.last_commit; let peer_best_commit = peer.view.last_commit; match GossipMessage::::decode(&mut data) { @@ -774,8 +833,13 @@ impl network_gossip::Validator for GossipValidator Some((None, _)) => {}, }; + let local_view = match inner.local_view { + Some(ref v) => v, + None => return true, // no local view means we can't evaluate or hold any topic. + }; + // global messages -- only keep the best commit. - let best_commit = inner.local_view.last_commit; + let best_commit = local_view.last_commit; match GossipMessage::::decode(&mut data) { None => true, @@ -1004,8 +1068,10 @@ mod tests { let set_id = 1; + val.note_set(SetId(set_id), Vec::new(), |_, _| {}); + for round_num in 1u64..10 { - val.note_round(Round(round_num), SetId(set_id), |_, _| {}); + val.note_round(Round(round_num), |_, _| {}); } { @@ -1025,4 +1091,47 @@ mod tests { } } } + + #[test] + fn message_from_unknown_authority_discarded() { + assert!(cost::UNKNOWN_VOTER != cost::BAD_SIGNATURE); + + let (val, _) = GossipValidator::::new(config()); + let set_id = 1; + let auth = AuthorityId::from_raw([1u8; 32]); + let peer = PeerId::random(); + + val.note_set(SetId(set_id), vec![auth.clone()], |_, _| {}); + val.note_round(Round(0), |_, _| {}); + + let inner = val.inner.read(); + let unknown_voter = inner.validate_round_message(&peer, &VoteOrPrecommitMessage { + round: Round(0), + set_id: SetId(set_id), + message: SignedMessage:: { + message: grandpa::Message::Prevote(grandpa::Prevote { + target_hash: Default::default(), + target_number: 10, + }), + signature: Default::default(), + id: AuthorityId::from_raw([2u8; 32]), + } + }); + + let bad_sig = inner.validate_round_message(&peer, &VoteOrPrecommitMessage { + round: Round(0), + set_id: SetId(set_id), + message: SignedMessage:: { + message: grandpa::Message::Prevote(grandpa::Prevote { + target_hash: Default::default(), + target_number: 10, + }), + signature: Default::default(), + id: auth.clone(), + } + }); + + assert_eq!(unknown_voter, Action::Discard(cost::UNKNOWN_VOTER)); + assert_eq!(bad_sig, Action::Discard(cost::BAD_SIGNATURE)); + } } diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index 05033c2c41..58d9cd6421 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -64,12 +64,14 @@ mod cost { pub(super) const BAD_SIGNATURE: i32 = -100; pub(super) const MALFORMED_COMMIT: i32 = -1000; pub(super) const FUTURE_MESSAGE: i32 = -500; + pub(super) const UNKNOWN_VOTER: i32 = -150; 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; + pub(super) const OUT_OF_SCOPE_MESSAGE: i32 = -500; } // benefit scalars for reporting peers. @@ -233,7 +235,7 @@ impl> NetworkBridge { pub(crate) fn new( service: N, config: crate::Config, - set_state: Option<(u64, &crate::environment::VoterSetState)>, + set_state: Option<&crate::environment::VoterSetState>, on_exit: impl Future + Clone + Send + 'static, ) -> ( Self, @@ -244,15 +246,18 @@ impl> NetworkBridge { let validator = Arc::new(validator); service.register_validator(validator.clone()); - if let Some((set_id, set_state)) = set_state { + if let Some(set_state) = set_state { // register all previous votes with the gossip service so that they're // available to peers potentially stuck on a previous round. - for round in set_state.completed_rounds().iter() { + let completed = set_state.completed_rounds(); + let (set_id, voters) = completed.set_info(); + validator.note_set(SetId(set_id), voters.to_vec(), |_, _| {}); + for round in completed.iter() { let topic = round_topic::(round.number, set_id); // we need to note the round with the gossip validator otherwise // messages will be ignored. - validator.note_round(Round(round.number), SetId(set_id), |_, _| {}); + validator.note_round(Round(round.number), |_, _| {}); for signed in round.votes.iter() { let message = gossip::GossipMessage::VoteOrPrecommit( @@ -295,7 +300,7 @@ impl> NetworkBridge { (bridge, startup_work) } - /// Get the round messages for a round in a given set ID. These are signature-checked. + /// Get the round messages for a round in the current set ID. These are signature-checked. pub(crate) fn round_communication( &self, round: Round, @@ -307,9 +312,18 @@ impl> NetworkBridge { impl Stream,Error=Error>, impl Sink,SinkError=Error>, ) { + // is a no-op if currently in that set. + self.validator.note_set( + set_id, + voters.voters().iter().map(|(v, _)| v.clone()).collect(), + |to, neighbor| self.service.send_message( + to, + GossipMessage::::from(neighbor).encode() + ), + ); + self.validator.note_round( round, - set_id, |to, neighbor| self.service.send_message( to, GossipMessage::::from(neighbor).encode() @@ -410,6 +424,7 @@ impl> NetworkBridge { ) { self.validator.note_set( set_id, + voters.voters().iter().map(|(v, _)| v.clone()).collect(), |to, neighbor| self.service.send_message(to, GossipMessage::::from(neighbor).encode()), ); @@ -650,7 +665,7 @@ fn check_compact_commit( let f = voters.total_weight() - voters.threshold(); let full_threshold = voters.total_weight() + f; - // check total weight is not too high. + // check total weight is not out of range. let mut total_weight = 0; for (_, ref id) in &msg.auth_data { if let Some(weight) = voters.info(id).map(|info| info.weight()) { diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 4aab32be8a..690c1011a7 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -46,7 +46,7 @@ use crate::{ use consensus_common::SelectChain; -use crate::authorities::SharedAuthoritySet; +use crate::authorities::{AuthoritySet, SharedAuthoritySet}; use crate::consensus_changes::SharedConsensusChanges; use crate::justification::GrandpaJustification; use crate::until_imported::UntilVoteTargetImported; @@ -66,11 +66,13 @@ pub struct CompletedRound { pub votes: Vec>, } -// Data about last completed rounds. Stores NUM_LAST_COMPLETED_ROUNDS and always +// Data about last completed rounds within a single voter set. Stores NUM_LAST_COMPLETED_ROUNDS and always // contains data about at least one round (genesis). #[derive(Debug, Clone, PartialEq)] pub struct CompletedRounds { - inner: VecDeque>, + rounds: VecDeque>, + set_id: u64, + voters: Vec, } // NOTE: the current strategy for persisting completed rounds is very naive @@ -80,34 +82,51 @@ const NUM_LAST_COMPLETED_ROUNDS: usize = 2; impl Encode for CompletedRounds { fn encode(&self) -> Vec { - Vec::from_iter(&self.inner).encode() + let v = Vec::from_iter(&self.rounds); + (&v, &self.set_id, &self.voters).encode() } } impl Decode for CompletedRounds { fn decode(value: &mut I) -> Option { - Vec::>::decode(value) - .map(|completed_rounds| CompletedRounds { - inner: completed_rounds.into(), + <(Vec>, u64, Vec)>::decode(value) + .map(|(rounds, set_id, voters)| CompletedRounds { + rounds: rounds.into(), + set_id, + voters, }) } } impl CompletedRounds { /// Create a new completed rounds tracker with NUM_LAST_COMPLETED_ROUNDS capacity. - pub fn new(genesis: CompletedRound) -> CompletedRounds { - let mut inner = VecDeque::with_capacity(NUM_LAST_COMPLETED_ROUNDS); - inner.push_back(genesis); - CompletedRounds { inner } + pub(crate) fn new( + genesis: CompletedRound, + set_id: u64, + voters: &AuthoritySet>, + ) + -> CompletedRounds + { + let mut rounds = VecDeque::with_capacity(NUM_LAST_COMPLETED_ROUNDS); + rounds.push_back(genesis); + + let voters = voters.current().1.iter().map(|(a, _)| a.clone()).collect(); + CompletedRounds { rounds, set_id, voters } + } + + /// Get the set-id and voter set of the completed rounds. + pub fn set_info(&self) -> (u64, &[AuthorityId]) { + (self.set_id, &self.voters[..]) } + /// Iterate over all completed rounds. pub fn iter(&self) -> impl Iterator> { - self.inner.iter() + self.rounds.iter() } /// Returns the last (latest) completed round. pub fn last(&self) -> &CompletedRound { - self.inner.back() + self.rounds.back() .expect("inner is never empty; always contains at least genesis; qed") } @@ -118,11 +137,11 @@ impl CompletedRounds { return false; } - if self.inner.len() == NUM_LAST_COMPLETED_ROUNDS { - self.inner.pop_front(); + if self.rounds.len() == NUM_LAST_COMPLETED_ROUNDS { + self.rounds.pop_front(); } - self.inner.push_back(completed_round); + self.rounds.push_back(completed_round); true } diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 2a1da15499..7e3f19940b 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -501,7 +501,7 @@ pub fn run_grandpa_voter, N, RA, SC, X>( let (network, network_startup) = NetworkBridge::new( network, config.clone(), - Some((authority_set.set_id(), &set_state.read())), + Some(&set_state.read()), on_exit.clone(), ); @@ -640,12 +640,16 @@ pub fn run_grandpa_voter, N, RA, SC, X>( 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(), - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: 0, + state: genesis_state, + base: (new.canon_hash, new.canon_number), + votes: Vec::new(), + }, + new.set_id, + &*authority_set.inner().read(), + ), current_round: HasVoted::No, }; diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index f172e58ee9..9ed1cc8c62 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -225,12 +225,16 @@ pub fn run_grandpa_observer, N, RA, SC>( 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(), - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: 0, + state: genesis_state, + base: (new.canon_hash, new.canon_number), + votes: Vec::new(), + }, + new.set_id, + &*authority_set.inner().read(), + ), current_round: HasVoted::No, }; -- GitLab From 5088c0067e6c21f62c7412ab1d995497121cf595 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 10 Jun 2019 18:09:14 +0200 Subject: [PATCH 097/140] Make it build for Android (#2833) --- Cargo.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 738ccb6694..e5e0991212 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -659,10 +659,10 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.1.2" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2119,7 +2119,7 @@ dependencies = [ [[package]] name = "nix" -version = "0.13.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2264,7 +2264,7 @@ dependencies = [ name = "node-template" version = "2.0.0" dependencies = [ - "ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (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.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3916,7 +3916,7 @@ dependencies = [ name = "substrate" version = "2.0.0" dependencies = [ - "ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "node-cli 2.0.0", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3979,7 +3979,7 @@ dependencies = [ "substrate-service 2.0.0", "substrate-state-machine 2.0.0", "substrate-telemetry 2.0.0", - "sysinfo 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", + "sysinfo 0.8.5 (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.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4725,7 +4725,7 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5751,7 +5751,7 @@ dependencies = [ "checksum csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5cdef62f37e6ffe7d1f07a381bc0db32b7a3ff1cac0de56cb0d81e71f53d65" "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 ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c7dfd2d8b4c82121dfdff120f818e09fc4380b0b7e17a742081a89b94853e87f" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" "checksum curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4440b7acc6264fde2eee18bae135625129c88ff244f3ded035e3caa585a6bf0a" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" @@ -5891,7 +5891,7 @@ dependencies = [ "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" "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 nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46f0f3210768d796e8fa79ec70ee6af172dacbe7147f5e69be5240a47778302b" +"checksum nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce" "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" @@ -6022,7 +6022,7 @@ dependencies = [ "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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" -"checksum sysinfo 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65f0e28a49b7bf142cee89befd7077b40627d7cc70aa8a8acfe03afc26016c33" +"checksum sysinfo 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1cf62641ed7e88e20242b948d17b9fcc37e80b5599cf09cde190d6d4bb4bf289" "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.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dc4738f2e68ed2855de5ac9cdbe05c9216773ecde4739b2f095002ab03a13ef" -- GitLab From a56cb77ced07e6c8f73ac71c0e078dbaada19dc0 Mon Sep 17 00:00:00 2001 From: TriplEight Date: Tue, 11 Jun 2019 10:29:17 +0200 Subject: [PATCH 098/140] subkey build, cargo audit (#2752) * subkey build, cargo audit * some fixes * cleanup * review * not to be launched on PRs * not to be launched on PRs 2 * check-runtime should run on PRs only * changed only to except, easier to read * fix no jobs ran * only: rewrites when it's last * only: -branches wasn't needed * benching subkey build * benching subkey build 2 * subkey check * not for 1.0 * cleanup --- .gitlab-ci.yml | 72 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d3c9951df4..5b1291ac2d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,18 +7,18 @@ stages: + - pre-test - test - build - publish - kubernetes - flaming-fir -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" + CARGO_INCREMENTAL: 0 CI_SERVER_NAME: "GitLab CI" DOCKER_OS: "debian:stretch" ARCH: "x86_64" @@ -38,17 +38,27 @@ variables: environment: name: parity-build -.compiler_info: &compiler_info +.docker-env: &docker-env + image: parity/rust-builder:latest before_script: - rustup show - cargo --version - sccache -s + only: + - tags + - master + - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + - schedules + - web + - /^[0-9]+$/ # PRs + tags: + - linux-docker #### stage: test check-runtime: - stage: test + stage: pre-test image: parity/tools:latest <<: *kubernetes-build only: @@ -61,7 +71,7 @@ check-runtime: check-line-width: - stage: test + stage: pre-test image: parity/tools:latest <<: *kubernetes-build only: @@ -71,23 +81,34 @@ check-line-width: allow_failure: false -test-linux-stable: &test +cargo-audit: + stage: pre-test + <<: *docker-env + except: + - /^[0-9]+$/ + script: + - cargo audit + allow_failure: true + + +cargo-check-subkey: + stage: test + <<: *docker-env + except: + - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + script: + - cd ./subkey + - time cargo check --release # makes sense to save artifacts for building it + - sccache -s + + +test-linux-stable: stage: test - <<: *compiler_info + <<: *docker-env variables: - RUST_TOOLCHAIN: stable # Enable debug assertions since we are running optimized builds for testing # but still want to have debug assertions. RUSTFLAGS: -Cdebug-assertions=y - TARGET: native - tags: - - linux-docker - only: - - tags - - master - - schedules - - web - - /^[0-9]+$/ except: variables: - $DEPLOY_TAG @@ -126,11 +147,10 @@ test-linux-stable-int: &test check-web-wasm: stage: test - <<: *compiler_info + <<: *docker-env allow_failure: true - only: - - master - - /^[0-9]+$/ + except: + - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 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 @@ -155,8 +175,6 @@ check-web-wasm: - time cargo web build -p substrate-telemetry - time cargo web build -p substrate-trie - sccache -s - tags: - - linux-docker .build-only: &build-only only: @@ -169,13 +187,11 @@ check-web-wasm: build-linux-release: stage: build <<: *collect-artifacts + <<: *docker-env <<: *build-only - <<: *compiler_info except: variables: - $DEPLOY_TAG - tags: - - linux-docker script: - ./scripts/build.sh --locked - time cargo build --release --verbose @@ -197,7 +213,7 @@ build-linux-release: build-rust-doc-release: stage: build - <<: *compiler_info + <<: *docker-env allow_failure: true artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}-doc" @@ -206,8 +222,6 @@ build-rust-doc-release: paths: - ./crate-docs <<: *build-only - tags: - - linux-docker script: - ./scripts/build.sh --locked - rm -f ./crate-docs/index.html # use it as an indicator if the job succeeds -- GitLab From 45cb40b2adbb8f331aa1c7220f6005c12bf19d3c Mon Sep 17 00:00:00 2001 From: TriplEight Date: Tue, 11 Jun 2019 15:14:51 +0200 Subject: [PATCH 099/140] fix job (#2842) --- .gitlab-ci.yml | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5b1291ac2d..d792fc6ebf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -102,7 +102,7 @@ cargo-check-subkey: - sccache -s -test-linux-stable: +test-linux-stable: &test-linux stage: test <<: *docker-env variables: @@ -117,30 +117,17 @@ test-linux-stable: - time cargo test --all --release --verbose --locked - sccache -s -test-linux-stable-int: &test - stage: test - variables: - RUST_TOOLCHAIN: stable - # Enable debug assertions since we are running optimized builds for testing - # but still want to have debug assertions. - RUSTFLAGS: -Cdebug-assertions=y - TARGET: native - tags: - - linux-docker - only: - - tags - - master - - schedules - - web - - /^[0-9]+$/ +test-linux-stable-int: + <<: *test-linux except: + refs: + - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 variables: - $DEPLOY_TAG - before_script: - - sccache -s - - ./scripts/build.sh --locked script: - - time RUST_LOG=sync=trace,consensus=trace,client=trace,state-db=trace,db=trace,forks=trace,state_db=trace,storage_cache=trace cargo test -p node-cli --release --verbose --locked -- --ignored --test-threads=1 + - ./scripts/build.sh --locked + - time RUST_LOG=sync=trace,consensus=trace,client=trace,state-db=trace,db=trace,forks=trace,state_db=trace,storage_cache=trace + cargo test -p node-cli --release --verbose --locked -- --ignored --test-threads=1 - sccache -s allow_failure: true -- GitLab From db9b69c158f234c0a9df706ebee0bbe6645ddeac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lio=E6=9D=8E=E6=AC=A7?= Date: Tue, 11 Jun 2019 22:00:27 +0800 Subject: [PATCH 100/140] Passthru build.sh/script.sh command line arguments (#2837) --- ci/script.sh | 4 ++-- core/executor/wasm/build.sh | 2 +- core/test-runtime/wasm/build.sh | 2 +- node-template/runtime/wasm/build.sh | 2 +- node-template/scripts/build.sh | 2 +- node/runtime/wasm/build.sh | 2 +- scripts/build.sh | 2 +- scripts/update.sh | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ci/script.sh b/ci/script.sh index 0ab5f34fb2..b1b7dd3edf 100755 --- a/ci/script.sh +++ b/ci/script.sh @@ -20,12 +20,12 @@ case $TARGET in sudo apt-get -y update sudo apt-get install -y cmake pkg-config libssl-dev - cargo test --all --release --locked + cargo test --all --release --locked "$@" ;; "wasm") # Install prerequisites and build all wasm projects ./scripts/init.sh - ./scripts/build.sh + ./scripts/build.sh "$@" ;; esac diff --git a/core/executor/wasm/build.sh b/core/executor/wasm/build.sh index fe2faeec62..9414c8037b 100755 --- a/core/executor/wasm/build.sh +++ b/core/executor/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $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 test do wasm-gc target/wasm32-unknown-unknown/release/runtime_$i.wasm target/wasm32-unknown-unknown/release/runtime_$i.compact.wasm diff --git a/core/test-runtime/wasm/build.sh b/core/test-runtime/wasm/build.sh index 0529a974ff..059e475c71 100755 --- a/core/test-runtime/wasm/build.sh +++ b/core/test-runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $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 substrate_test_runtime do wasm-gc "target/wasm32-unknown-unknown/release/$i.wasm" "target/wasm32-unknown-unknown/release/$i.compact.wasm" diff --git a/node-template/runtime/wasm/build.sh b/node-template/runtime/wasm/build.sh index 566e5de35d..a549eeb50a 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_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $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/scripts/build.sh b/node-template/scripts/build.sh index 01d0fee354..980a8fa802 100755 --- a/node-template/scripts/build.sh +++ b/node-template/scripts/build.sh @@ -17,7 +17,7 @@ do echo "${bold}Building webassembly binary in $SRC...${normal}" cd "$PROJECT_ROOT/$SRC" - ./build.sh + ./build.sh "$@" cd - >> /dev/null done diff --git a/node/runtime/wasm/build.sh b/node/runtime/wasm/build.sh index 9a9f412bfc..4a81e47f9e 100755 --- a/node/runtime/wasm/build.sh +++ b/node/runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $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_runtime do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm diff --git a/scripts/build.sh b/scripts/build.sh index 8b3557159b..d79ebe5230 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -19,7 +19,7 @@ do echo "*** Building wasm binaries in $SRC" cd "$PROJECT_ROOT/$SRC" - ./build.sh $@ + ./build.sh "$@" cd - >> /dev/null done diff --git a/scripts/update.sh b/scripts/update.sh index cbf81b57cd..a264fab43d 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -20,7 +20,7 @@ do cd "$PROJECT_ROOT/$SRC" cargo update - ./build.sh + ./build.sh "$@" cd - >> /dev/null done -- GitLab From 2afbd267a648266b59713b68cffe94e44e68af45 Mon Sep 17 00:00:00 2001 From: ddorgan Date: Tue, 11 Jun 2019 16:26:13 +0100 Subject: [PATCH 101/140] Allow check-runtime to fail (#2845) * Allow check-runtime to fail * Do not allow the line-width to fail * Allow failure on line-check --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d792fc6ebf..82fb604112 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -68,6 +68,7 @@ check-runtime: GITHUB_API_PROJECT: "parity%2Finfrastructure%2Fgithub-api" script: - ./scripts/gitlab/check_runtime.sh + allow_failure: true check-line-width: @@ -78,7 +79,7 @@ check-line-width: - /^[0-9]+$/ script: - ./scripts/gitlab/check_line_width.sh - allow_failure: false + allow_failure: true cargo-audit: -- GitLab From b1c50952704c89079c8df41cea2be2ef0825a90d Mon Sep 17 00:00:00 2001 From: kaichao Date: Wed, 12 Jun 2019 03:34:10 +0800 Subject: [PATCH 102/140] Make use of StorageHasher and HasherKind (#2836) * Make use of StorageHasher and HasherKind. * Use Storagehasher hasher function for key2 of double map. * Refactor to reuse hasher from implementation. * Bump up since there is srml changes. * Update metadata version. --- node/runtime/src/lib.rs | 2 +- srml/metadata/src/lib.rs | 10 ++++++---- srml/support/procedural/src/storage/impls.rs | 4 +++- srml/support/procedural/src/storage/mod.rs | 9 ++++++++- srml/support/procedural/src/storage/transformation.rs | 10 +++++----- srml/support/src/double_map.rs | 2 +- srml/support/src/lib.rs | 8 ++++---- srml/support/src/metadata.rs | 10 +++++----- 8 files changed, 33 insertions(+), 22 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 427ee8d1fc..1c9c0ca4fd 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 92, - impl_version: 93, + impl_version: 94, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/metadata/src/lib.rs b/srml/metadata/src/lib.rs index 28a513cc07..b1ab57b506 100644 --- a/srml/metadata/src/lib.rs +++ b/srml/metadata/src/lib.rs @@ -280,7 +280,7 @@ pub enum StorageFunctionType { key1: DecodeDifferentStr, key2: DecodeDifferentStr, value: DecodeDifferentStr, - key2_hasher: DecodeDifferentStr, + key2_hasher: StorageHasher, }, } @@ -311,8 +311,10 @@ pub enum RuntimeMetadata { V2(RuntimeMetadataDeprecated), /// Version 3 for runtime metadata. No longer used. V3(RuntimeMetadataDeprecated), - /// Version 4 for runtime metadata. - V4(RuntimeMetadataV4), + /// Version 4 for runtime metadata. No longer used. + V4(RuntimeMetadataDeprecated), + /// Version 5 for runtime metadata. + V5(RuntimeMetadataV5), } /// Enum that should fail. @@ -335,7 +337,7 @@ impl Decode for RuntimeMetadataDeprecated { /// The metadata of a runtime. #[derive(Eq, Encode, PartialEq)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] -pub struct RuntimeMetadataV4 { +pub struct RuntimeMetadataV5 { pub modules: DecodeDifferentArray, } diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs index 0e9e30e2a4..ee2275de7c 100644 --- a/srml/support/procedural/src/storage/impls.rs +++ b/srml/support/procedural/src/storage/impls.rs @@ -636,8 +636,10 @@ impl<'a, I: Iterator> Impls<'a, I> { } fn key_for(k1: &#k1ty, k2: &#k2ty) -> Vec { + use #scrate::storage::hashed::generator::StorageHasher; + let mut key = #as_double_map::prefix_for(k1); - key.extend(&#scrate::Hashable::#k2_hasher(k2)); + #scrate::codec::Encode::using_encoded(k2, |e| key.extend(&#scrate::#k2_hasher::hash(e))); key } diff --git a/srml/support/procedural/src/storage/mod.rs b/srml/support/procedural/src/storage/mod.rs index ce81dd95c5..742c47d259 100644 --- a/srml/support/procedural/src/storage/mod.rs +++ b/srml/support/procedural/src/storage/mod.rs @@ -214,7 +214,13 @@ enum HasherKind { impl From<&SetHasher> for HasherKind { fn from(set_hasher: &SetHasher) -> Self { - match set_hasher.inner.content { + (&set_hasher.inner.content).into() + } +} + +impl From<&Hasher> for HasherKind { + fn from(hasher: &Hasher) -> Self { + match hasher { Hasher::Blake2_256(_) => HasherKind::Blake2_256, Hasher::Blake2_128(_) => HasherKind::Blake2_128, Hasher::Twox256(_) => HasherKind::Twox256, @@ -223,6 +229,7 @@ impl From<&SetHasher> for HasherKind { } } } + impl HasherKind { fn into_storage_hasher_struct(&self) -> TokenStream2 { match self { diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index 933faa6ff9..1da6ae2108 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -606,7 +606,7 @@ fn decl_storage_items( i.linked_map(hasher.into_storage_hasher_struct(), key_type) }, DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, key2_hasher, hasher } => { - i.double_map(hasher.into_storage_hasher_struct(), key1_type, key2_type, key2_hasher) + i.double_map(hasher.into_storage_hasher_struct(), key1_type, key2_type, key2_hasher.into_storage_hasher_struct()) }, }; impls.extend(implementation) @@ -758,14 +758,14 @@ fn store_functions_to_metadata ( 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()); + let k2_hasher = key2_hasher.into_metadata(); quote!{ #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), + key2_hasher: #scrate::metadata::#k2_hasher, } } }, @@ -870,7 +870,7 @@ enum DeclStorageTypeInfosKind<'a> { hasher: HasherKind, key1_type: &'a syn::Type, key2_type: &'a syn::Type, - key2_hasher: TokenStream2, + key2_hasher: HasherKind, } } @@ -900,7 +900,7 @@ fn get_type_infos(storage_type: &DeclStorageType) -> DeclStorageTypeInfos { 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 } }, + key2_hasher: (&map.key2_hasher).into(), }), }; diff --git a/srml/support/src/double_map.rs b/srml/support/src/double_map.rs index 80d974064d..d35570ae4f 100644 --- a/srml/support/src/double_map.rs +++ b/srml/support/src/double_map.rs @@ -64,7 +64,7 @@ pub trait StorageDoubleMapWithHasher { /// Get an entry from this map. /// - /// If there is entry stored under the given keys, returns `None`. + /// If there is no entry stored under the given keys, returns `None`. fn get(k1: &Q, k2: &R) -> Option where Self::Key1: Borrow, diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index 64256d876d..fec7249c23 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -467,7 +467,7 @@ mod tests { key1: DecodeDifferent::Encode("u32"), key2: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), - key2_hasher: DecodeDifferent::Encode("blake2_256"), + key2_hasher: StorageHasher::Blake2_256, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructDataDM(PhantomData::)) @@ -482,7 +482,7 @@ mod tests { key1: DecodeDifferent::Encode("T::BlockNumber"), key2: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), - key2_hasher: DecodeDifferent::Encode("twox_128"), + key2_hasher: StorageHasher::Twox128, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructGenericDataDM(PhantomData::)) @@ -497,7 +497,7 @@ mod tests { key1: DecodeDifferent::Encode("T::BlockNumber"), key2: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), - key2_hasher: DecodeDifferent::Encode("twox_256"), + key2_hasher: StorageHasher::Twox256, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) @@ -512,7 +512,7 @@ mod tests { key1: DecodeDifferent::Encode("u32"), key2: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("Vec"), - key2_hasher: DecodeDifferent::Encode("blake2_256"), + key2_hasher: StorageHasher::Blake2_256, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) diff --git a/srml/support/src/metadata.rs b/srml/support/src/metadata.rs index ed3e443afd..0e33d77272 100644 --- a/srml/support/src/metadata.rs +++ b/srml/support/src/metadata.rs @@ -16,7 +16,7 @@ pub use srml_metadata::{ DecodeDifferent, FnEncode, RuntimeMetadata, - ModuleMetadata, RuntimeMetadataV4, + ModuleMetadata, RuntimeMetadataV5, DefaultByteGetter, RuntimeMetadataPrefixed, StorageMetadata, StorageFunctionMetadata, StorageFunctionType, StorageFunctionModifier, @@ -40,8 +40,8 @@ macro_rules! impl_runtime_metadata { ) => { impl $runtime { pub fn metadata() -> $crate::metadata::RuntimeMetadataPrefixed { - $crate::metadata::RuntimeMetadata::V4 ( - $crate::metadata::RuntimeMetadataV4 { + $crate::metadata::RuntimeMetadata::V5 ( + $crate::metadata::RuntimeMetadataV5 { modules: $crate::__runtime_modules_to_metadata!($runtime;; $( $rest )*), } ).into() @@ -382,8 +382,8 @@ mod tests { event_module2::Module with Event Storage Call, ); - const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V4( - RuntimeMetadataV4 { + const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V5( + RuntimeMetadataV5 { modules: DecodeDifferent::Encode(&[ ModuleMetadata { name: DecodeDifferent::Encode("system"), -- GitLab From 6df8a813eb0f5db99efa777bc194b9cb06c5a7e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 11 Jun 2019 21:54:34 +0200 Subject: [PATCH 103/140] Make test-client generic over runtime (#2824) * Make test-client generic over runtime. * Make sure genesis storage is constructed correctly. * Use prelude in tests. * Add an example of how to use test-client with node/runtime. * Bump version. * Rename test-clients. --- Cargo.lock | 45 ++- Cargo.toml | 12 +- core/basic-authorship/Cargo.toml | 2 +- core/client/Cargo.toml | 2 +- core/client/db/Cargo.toml | 2 +- core/client/src/client.rs | 5 +- core/client/src/light/call_executor.rs | 9 +- core/client/src/light/fetcher.rs | 2 +- core/consensus/aura/Cargo.toml | 2 +- core/consensus/babe/Cargo.toml | 2 +- core/consensus/common/Cargo.toml | 2 +- core/consensus/slots/Cargo.toml | 2 +- core/finality-grandpa/Cargo.toml | 2 +- core/network/Cargo.toml | 6 +- core/network/src/test/block_import.rs | 9 +- core/offchain/Cargo.toml | 2 +- core/rpc/Cargo.toml | 4 +- core/rpc/src/chain/tests.rs | 8 +- core/rpc/src/state/tests.rs | 22 +- core/service/Cargo.toml | 2 +- core/service/src/components.rs | 2 +- core/service/src/lib.rs | 2 +- core/sr-api-macros/Cargo.toml | 2 +- core/sr-api-macros/tests/runtime_calls.rs | 6 +- core/test-client/Cargo.toml | 24 +- core/test-client/src/client_ext.rs | 42 ++- core/test-client/src/lib.rs | 342 +++++++----------- core/test-runtime/Cargo.toml | 2 +- core/test-runtime/client/Cargo.toml | 20 + .../client}/src/block_builder_ext.rs | 4 +- core/test-runtime/client/src/lib.rs | 208 +++++++++++ .../client}/src/trait_tests.rs | 17 +- core/test-runtime/src/system.rs | 2 +- core/transaction-pool/Cargo.toml | 2 +- node/executor/Cargo.toml | 1 + node/executor/src/lib.rs | 15 + 36 files changed, 494 insertions(+), 339 deletions(-) create mode 100644 core/test-runtime/client/Cargo.toml rename core/{test-client => test-runtime/client}/src/block_builder_ext.rs (93%) create mode 100644 core/test-runtime/client/src/lib.rs rename core/{test-client => test-runtime/client}/src/trait_tests.rs (96%) diff --git a/Cargo.lock b/Cargo.lock index e5e0991212..b79b9c0827 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2191,6 +2191,7 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", + "substrate-test-client 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)", @@ -3349,7 +3350,7 @@ dependencies = [ "substrate-consensus-common 2.0.0", "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "trybuild 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3935,7 +3936,7 @@ dependencies = [ "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", ] @@ -4010,7 +4011,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-trie 2.0.0", ] @@ -4035,7 +4036,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-state-db 2.0.0", "substrate-state-machine 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-trie 2.0.0", ] @@ -4066,7 +4067,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4124,7 +4125,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4155,7 +4156,7 @@ dependencies = [ "sr-version 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4197,7 +4198,7 @@ dependencies = [ "substrate-consensus-common 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4250,7 +4251,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4323,7 +4324,7 @@ dependencies = [ "substrate-network-libp2p 2.0.0", "substrate-peerset 2.0.0", "substrate-primitives 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4372,7 +4373,7 @@ dependencies = [ "substrate-consensus-common 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4460,13 +4461,11 @@ dependencies = [ "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-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4522,7 +4521,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-rpc-servers 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-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.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4599,6 +4598,7 @@ name = "substrate-test-client" version = "2.0.0" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.2 (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", @@ -4608,7 +4608,6 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", - "substrate-test-runtime 2.0.0", ] [[package]] @@ -4635,11 +4634,21 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-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-test-runtime-client" +version = "2.0.0" +dependencies = [ + "sr-primitives 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "substrate-test-runtime 2.0.0", +] + [[package]] name = "substrate-transaction-graph" version = "2.0.0" @@ -4670,7 +4679,7 @@ dependencies = [ "substrate-client 2.0.0", "substrate-keyring 2.0.0", "substrate-primitives 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-transaction-graph 2.0.0", ] diff --git a/Cargo.toml b/Cargo.toml index 5710d08aff..0f681dc766 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,15 +22,17 @@ members = [ "core/cli", "core/client", "core/client/db", - "core/consensus/common", "core/consensus/aura", "core/consensus/babe", + "core/consensus/common", "core/consensus/rhd", "core/consensus/slots", "core/executor", "core/finality-grandpa", "core/finality-grandpa/primitives", + "core/inherents", "core/keyring", + "core/keystore", "core/network", "core/panic-handler", "core/primitives", @@ -46,13 +48,13 @@ members = [ "core/sr-std", "core/sr-version", "core/state-machine", - "core/test-runtime", "core/telemetry", - "core/trie", - "core/keystore", + "core/test-client", + "core/test-runtime", + "core/test-runtime/client", "core/transaction-pool", "core/transaction-pool/graph", - "core/inherents", + "core/trie", "core/util/fork-tree", "srml/support", "srml/support/procedural", diff --git a/core/basic-authorship/Cargo.toml b/core/basic-authorship/Cargo.toml index 63408b4329..547fca9030 100644 --- a/core/basic-authorship/Cargo.toml +++ b/core/basic-authorship/Cargo.toml @@ -17,4 +17,4 @@ transaction_pool = { package = "substrate-transaction-pool", path = "../../core/ substrate-telemetry = { path = "../telemetry" } [dev-dependencies] -test-client = { package = "substrate-test-client", path = "../../core/test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index 0978b897ec..510ec50b8b 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -28,7 +28,7 @@ inherents = { package = "substrate-inherents", path = "../inherents", default-fe sr-api-macros = { path = "../sr-api-macros" } [dev-dependencies] -test-client = { package = "substrate-test-client", path = "../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } [features] diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 64051164b8..e40b1568f6 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -25,7 +25,7 @@ consensus_common = { package = "substrate-consensus-common", path = "../../conse [dev-dependencies] substrate-keyring = { path = "../../keyring" } -test-client = { package = "substrate-test-client", path = "../../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } env_logger = { version = "0.6" } [features] diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 59af1b6419..8336a90ca4 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -1709,8 +1709,9 @@ pub(crate) mod tests { use runtime_primitives::generic::DigestItem; use consensus::{BlockOrigin, SelectChain}; use test_client::{ - TestClient, AccountKeyring, client::backend::Backend as TestBackend, TestClientBuilder, - BlockBuilderExt, runtime::{self, Block, Transfer, RuntimeApi, TestAPI} + prelude::*, + client::backend::Backend as TestBackend, + runtime::{self, Block, Transfer, RuntimeApi, TestAPI}, }; /// Returns tuple, consisting of: diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index a6b381a8b1..a95b73a960 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -473,7 +473,7 @@ pub fn check_execution_proof( #[cfg(test)] mod tests { use consensus::BlockOrigin; - use test_client::{self, runtime::{Block, Header}, runtime::RuntimeApi, TestClient}; + use test_client::{self, runtime::Header, ClientExt, TestClient}; use executor::NativeExecutionDispatch; use crate::backend::{Backend, NewBlockState}; use crate::in_mem::Backend as InMemBackend; @@ -482,13 +482,6 @@ mod tests { #[test] fn execution_proof_is_generated_and_checked() { - type TestClient = test_client::client::Client< - test_client::Backend, - test_client::Executor, - Block, - RuntimeApi - >; - fn execute(remote_client: &TestClient, at: u64, method: &'static str) -> (Vec, Vec) { let remote_block_id = BlockId::Number(at); let remote_root = remote_client.state_at(&remote_block_id) diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index 985aa5bdaa..bacfb45a7e 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -491,7 +491,7 @@ pub mod tests { use executor::{self, NativeExecutionDispatch}; use crate::error::Error as ClientError; use test_client::{ - self, TestClient, blockchain::HeaderBackend, AccountKeyring, + self, ClientExt, blockchain::HeaderBackend, AccountKeyring, runtime::{self, Hash, Block, Header, Extrinsic} }; use consensus::BlockOrigin; diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index 9c46b942a4..c8711d0289 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -31,6 +31,6 @@ 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" } +test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } tokio = "0.1.7" env_logger = "0.6" diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 020497a104..1eaf05e4a0 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -35,6 +35,6 @@ 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" } +test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } tokio = "0.1.18" env_logger = "0.6.1" diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index 3d133461e7..2852f4aa0f 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -21,7 +21,7 @@ parity-codec = { version = "3.3", features = ["derive"] } parking_lot = "0.8.0" [dev-dependencies] -test_client = { package = "substrate-test-client", path = "../../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } [features] default = [] diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index b82c2fc9d7..5c187024c9 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -18,4 +18,4 @@ parking_lot = "0.8.0" log = "0.4" [dev-dependencies] -test_client = { package = "substrate-test-client", path = "../../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } diff --git a/core/finality-grandpa/Cargo.toml b/core/finality-grandpa/Cargo.toml index b00c646286..bbd6297d35 100644 --- a/core/finality-grandpa/Cargo.toml +++ b/core/finality-grandpa/Cargo.toml @@ -29,7 +29,7 @@ grandpa = { package = "finality-grandpa", version = "0.7.2", features = ["derive 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"} +test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client"} env_logger = "0.6" [features] diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 8fbf7daa9c..1b3a473288 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -30,16 +30,16 @@ peerset = { package = "substrate-peerset", path = "../../core/peerset" } tokio-timer = "0.2.11" tokio = { version = "0.1.11", optional = true } keyring = { package = "substrate-keyring", path = "../../core/keyring", optional = true } -test_client = { package = "substrate-test-client", path = "../../core/test-client", optional = true } +test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/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" } +test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common", features = ["test-helpers"] } tokio = "0.1.11" [features] default = [] -test-helpers = ["keyring", "test_client", "consensus/test-helpers", "tokio"] +test-helpers = ["keyring", "test-client", "consensus/test-helpers", "tokio"] diff --git a/core/network/src/test/block_import.rs b/core/network/src/test/block_import.rs index 4cf639484f..f10338a62d 100644 --- a/core/network/src/test/block_import.rs +++ b/core/network/src/test/block_import.rs @@ -17,7 +17,7 @@ //! Testing block import logic. use consensus::import_queue::{import_single_block, BasicQueue, BlockImportError, BlockImportResult}; -use test_client::{self, TestClient}; +use test_client::{self, prelude::*}; use test_client::runtime::{Block, Hash}; use runtime_primitives::generic::BlockId; use super::*; @@ -26,12 +26,7 @@ struct TestLink {} impl Link for TestLink {} -fn prepare_good_block() -> (client::Client< - test_client::Backend, - test_client::Executor, - Block, - test_client::runtime::RuntimeApi, - >, Hash, u64, PeerId, IncomingBlock) { +fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock) { let client = test_client::new(); let block = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::File, block).unwrap(); diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 0672ebcc0c..a7b94bdc56 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -21,7 +21,7 @@ transaction_pool = { package = "substrate-transaction-pool", path = "../../core/ [dev-dependencies] env_logger = "0.6" -test_client = { package = "substrate-test-client", path = "../../core/test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } [features] default = [] diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index c621f71a43..6ef9af2a0a 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -29,7 +29,5 @@ tokio = "0.1.7" assert_matches = "1.1" futures = "0.1.17" sr-io = { path = "../sr-io" } -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" } +test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } rustc-hex = "2.0" diff --git a/core/rpc/src/chain/tests.rs b/core/rpc/src/chain/tests.rs index 02507442d5..eed9ae836b 100644 --- a/core/rpc/src/chain/tests.rs +++ b/core/rpc/src/chain/tests.rs @@ -16,9 +16,11 @@ use super::*; use assert_matches::assert_matches; -use test_client::{self, TestClient}; -use test_client::runtime::{H256, Block, Header}; -use consensus::BlockOrigin; +use test_client::{ + prelude::*, + consensus::BlockOrigin, + runtime::{H256, Block, Header}, +}; #[test] fn should_return_header() { diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index b40ac06c60..498b58b40b 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -18,10 +18,13 @@ use super::*; use self::error::Error; 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, LocalExecutor, TestClientBuilder}; +use test_client::{ + prelude::*, + consensus::BlockOrigin, + runtime, +}; use substrate_executor::NativeExecutionDispatch; #[test] @@ -50,7 +53,9 @@ fn should_return_storage() { #[test] fn should_return_child_storage() { let core = tokio::runtime::Runtime::new().unwrap(); - let client = Arc::new(test_client::new()); + let client = Arc::new(test_client::TestClientBuilder::new() + .add_child_storage("test", "key", vec![42_u8]) + .build()); 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()); @@ -125,7 +130,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 = blake2_256(&test_runtime::system::balance_of_key(AccountKeyring::Alice.into())); + let alice_balance_key = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Alice.into())); api.subscribe_storage(Default::default(), subscriber, Some(vec![ StorageKey(alice_balance_key.to_vec()), @@ -156,13 +161,6 @@ fn should_send_initial_storage_changes_and_notifications() { #[test] fn should_query_storage() { - type TestClient = test_client::client::Client< - test_client::Backend, - test_client::Executor, - runtime::Block, - runtime::RuntimeApi - >; - fn run_tests(client: Arc) { let core = tokio::runtime::Runtime::new().unwrap(); let api = State::new(client.clone(), Subscriptions::new(core.executor())); @@ -184,7 +182,7 @@ fn should_query_storage() { let block2_hash = add_block(1); let genesis_hash = client.genesis_hash(); - let alice_balance_key = blake2_256(&test_runtime::system::balance_of_key(AccountKeyring::Alice.into())); + let alice_balance_key = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Alice.into())); let mut expected = vec![ StorageChangeSet { diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 0a0cd91553..471594aad8 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -32,7 +32,7 @@ tel = { package = "substrate-telemetry", path = "../../core/telemetry" } offchain = { package = "substrate-offchain", path = "../../core/offchain" } [dev-dependencies] -substrate-test-client = { path = "../test-client" } +substrate-test-runtime-client = { path = "../test-runtime/client" } node-executor = { path = "../../node/executor" } node-primitives = { path = "../../node/primitives" } node-runtime = { path = "../../node/runtime" } diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 30cb1cb764..0f5afb7772 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -634,7 +634,7 @@ impl Components for LightComponents { mod tests { use super::*; use consensus_common::BlockOrigin; - use substrate_test_client::{TestClient, AccountKeyring, runtime::Transfer, TestClientBuilder}; + use substrate_test_runtime_client::{prelude::*, runtime::Transfer}; #[test] fn should_remove_transactions_from_the_pool() { diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index b33608392d..92ddcd0b58 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -757,7 +757,7 @@ mod tests { use super::*; use consensus_common::SelectChain; use runtime_primitives::traits::BlindCheckable; - use substrate_test_client::{AccountKeyring, runtime::{Extrinsic, Transfer}, TestClientBuilder}; + use substrate_test_runtime_client::{prelude::*, runtime::{Extrinsic, Transfer}}; #[test] fn should_not_propagate_transactions_that_are_marked_as_such() { diff --git a/core/sr-api-macros/Cargo.toml b/core/sr-api-macros/Cargo.toml index a87b53b732..9f2145d958 100644 --- a/core/sr-api-macros/Cargo.toml +++ b/core/sr-api-macros/Cargo.toml @@ -16,7 +16,7 @@ proc-macro-crate = "0.1.3" [dev-dependencies] client = { package = "substrate-client", path = "../client" } -test_client = { package = "substrate-test-client", path = "../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } sr-version = { path = "../sr-version" } diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index 0671c4f41d..6fa155437b 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -15,8 +15,8 @@ // along with Substrate. If not, see . use test_client::{ - AccountKeyring, runtime::{TestAPI, DecodeFails, Transfer, Header}, - NativeExecutor, LocalExecutor, TestClientBuilder + prelude::*, + runtime::{TestAPI, DecodeFails, Transfer, Header}, }; use runtime_primitives::{ generic::BlockId, @@ -190,4 +190,4 @@ fn record_proof_works() { "Core_execute_block", &block.encode(), ).expect("Executes block while using the proof backend"); -} \ No newline at end of file +} diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index 8de313f9cb..b459e02fbc 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -7,25 +7,13 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../client" } client-db = { package = "substrate-client-db", path = "../client/db", features = ["test-helpers"] } -futures = { version = "0.1.17" } -parity-codec = "3.5.1" -executor = { package = "substrate-executor", path = "../executor" } consensus = { package = "substrate-consensus-common", path = "../consensus/common" } -keyring = { package = "substrate-keyring", path = "../../core/keyring" } +executor = { package = "substrate-executor", path = "../executor" } +futures = { version = "0.1.27" } +hash-db = "0.12" +keyring = { package = "substrate-keyring", path = "../keyring" } +parity-codec = "3.5.1" primitives = { package = "substrate-primitives", path = "../primitives" } -state_machine = { package = "substrate-state-machine", path = "../state-machine" } -runtime = { package = "substrate-test-runtime", path = "../test-runtime", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } +state_machine = { package = "substrate-state-machine", path = "../state-machine" } -[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/client_ext.rs b/core/test-client/src/client_ext.rs index d285bb726b..7d05b1f570 100644 --- a/core/test-client/src/client_ext.rs +++ b/core/test-client/src/client_ext.rs @@ -21,52 +21,55 @@ use consensus::{ ImportBlock, BlockImport, BlockOrigin, Error as ConsensusError, ForkChoiceStrategy, }; +use hash_db::Hasher; use runtime_primitives::Justification; +use runtime_primitives::traits::{Block as BlockT}; use runtime_primitives::generic::BlockId; use primitives::Blake2Hasher; -use runtime; use parity_codec::alloc::collections::hash_map::HashMap; /// Extension trait for a test client. -pub trait TestClient: Sized { +pub trait ClientExt: Sized { /// Import block to the chain. No finality. - fn import(&self, origin: BlockOrigin, block: runtime::Block) + fn import(&self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError>; /// Import block with justification, finalizes block. fn import_justified( &self, origin: BlockOrigin, - block: runtime::Block, + block: Block, justification: Justification ) -> Result<(), ConsensusError>; /// Finalize a block. fn finalize_block( &self, - id: BlockId, + id: BlockId, justification: Option, ) -> client::error::Result<()>; /// Returns hash of the genesis block. - fn genesis_hash(&self) -> runtime::Hash; + fn genesis_hash(&self) -> ::Hash; } -impl TestClient for Client +impl ClientExt for Client where - B: client::backend::Backend, - E: client::CallExecutor, - Self: BlockImport, + B: client::backend::Backend, + E: client::CallExecutor, + Self: BlockImport, + Block: BlockT::Out>, { - fn import(&self, origin: BlockOrigin, block: runtime::Block) + fn import(&self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError> { + let (header, extrinsics) = block.deconstruct(); let import = ImportBlock { origin, - header: block.header, + header, justification: None, post_digests: vec![], - body: Some(block.extrinsics), + body: Some(extrinsics), finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, @@ -78,15 +81,16 @@ impl TestClient for Client fn import_justified( &self, origin: BlockOrigin, - block: runtime::Block, + block: Block, justification: Justification, ) -> Result<(), ConsensusError> { + let (header, extrinsics) = block.deconstruct(); let import = ImportBlock { origin, - header: block.header, + header, justification: Some(justification), post_digests: vec![], - body: Some(block.extrinsics), + body: Some(extrinsics), finalized: true, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, @@ -97,13 +101,13 @@ impl TestClient for Client fn finalize_block( &self, - id: BlockId, + id: BlockId, justification: Option, ) -> client::error::Result<()> { self.finalize_block(id, justification, true) } - fn genesis_hash(&self) -> runtime::Hash { - self.block_hash(0).unwrap().unwrap() + fn genesis_hash(&self) -> ::Hash { + self.block_hash(0.into()).unwrap().unwrap() } } diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index f39ad86b64..40fbd10d9e 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2019 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify @@ -19,61 +19,30 @@ #![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::{ExecutionStrategies, blockchain, backend, self}; -pub use executor::{NativeExecutor, self}; -pub use runtime; +pub use client_db::{Backend, self}; +pub use client_ext::ClientExt; pub use consensus; +pub use executor::{NativeExecutor, self}; pub use keyring::{sr25519::Keyring as AuthorityKeyring, AccountKeyring}; +pub use primitives::Blake2Hasher; +pub use runtime_primitives::{StorageOverlay, ChildrenStorageOverlay}; +pub use state_machine::ExecutionStrategy; -use std::{sync::Arc, collections::HashMap}; +use std::sync::Arc; +use std::collections::HashMap; use futures::future::FutureResult; -use primitives::Blake2Hasher; +use hash_db::Hasher; 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 + Block as BlockT, 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; - use executor::native_executor_instance; - // FIXME #1576 change the macro and pass in the `BlakeHasher` that dispatch needs from here instead - native_executor_instance!( - pub LocalExecutor, - runtime::api::dispatch, - runtime::native_version, - include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm") - ); -} - -/// 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, ->; - /// Test client light database backend. -pub type LightBackend = client::light::backend::Backend< - client_db::light::LightStorage, +pub type LightBackend = client::light::backend::Backend< + client_db::light::LightStorage, LightFetcher, Blake2Hasher, >; @@ -81,101 +50,85 @@ pub type LightBackend = client::light::backend::Backend< /// Test client light fetcher. pub struct LightFetcher; -/// Test client light executor. -#[cfg(feature = "include-wasm-blob")] -pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor< - runtime::Block, - LightBackend, - client::light::call_executor::RemoteCallExecutor< - client::light::blockchain::Blockchain< - client_db::light::LightStorage, - LightFetcher - >, - LightFetcher - >, - client::LocalCallExecutor< - client::light::backend::Backend< - client_db::light::LightStorage, - LightFetcher, - Blake2Hasher - >, - executor::NativeExecutor - > ->; +/// A genesis storage initialisation trait. +pub trait GenesisInit: Default { + /// Construct genesis storage. + fn genesis_storage(&self) -> (StorageOverlay, ChildrenStorageOverlay); +} + +impl GenesisInit for () { + fn genesis_storage(&self) -> (StorageOverlay, ChildrenStorageOverlay) { + Default::default() + } +} /// A builder for creating a test client instance. -pub struct TestClientBuilder { +pub struct TestClientBuilder { execution_strategies: ExecutionStrategies, - genesis_extension: HashMap, Vec>, - support_changes_trie: bool, - backend: Arc, - _phantom: std::marker::PhantomData, + genesis_init: G, + child_storage_extension: HashMap, Vec<(Vec, Vec)>>, + backend: Arc, + _executor: std::marker::PhantomData, } -#[cfg(feature = "include-wasm-blob")] -impl TestClientBuilder where - B: backend::LocalBackend, +impl Default for TestClientBuilder< + Executor, + Backend, +> where + Block: BlockT::Out>, { - /// Create a new instance of the test client builder using the given backend. - pub fn new_with_backend(backend: Arc) -> Self { - TestClientBuilder { - execution_strategies: ExecutionStrategies::default(), - genesis_extension: HashMap::default(), - support_changes_trie: false, - backend, - _phantom: Default::default(), - } - } -} - -#[cfg(feature = "include-wasm-blob")] -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, - backend: Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)), - _phantom: Default::default(), - } + fn default() -> Self { + Self::with_default_backend() } } -#[cfg(not(feature = "include-wasm-blob"))] -impl TestClientBuilder where - B: backend::LocalBackend, +impl TestClientBuilder< + Executor, + Backend, + G, +> where + Block: BlockT::Out>, { - /// Create a new instance of the test client builder using the given backend. - pub fn new_with_backend(backend: Arc) -> Self { - TestClientBuilder { - execution_strategies: ExecutionStrategies::default(), - genesis_extension: HashMap::default(), - support_changes_trie: false, - backend, - _phantom: Default::default(), - } + /// Create new `TestClientBuilder` with default backend. + pub fn with_default_backend() -> Self { + let backend = Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)); + Self::with_backend(backend) } } -#[cfg(not(feature = "include-wasm-blob"))] -impl TestClientBuilder { +impl TestClientBuilder< + Executor, + Backend, + G, +> { /// Create a new instance of the test client builder. - pub fn new() -> Self { + pub fn with_backend(backend: Arc) -> Self { TestClientBuilder { + backend, execution_strategies: ExecutionStrategies::default(), - genesis_extension: HashMap::default(), - support_changes_trie: false, - backend: Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)), - _phantom: Default::default(), + child_storage_extension: Default::default(), + genesis_init: Default::default(), + _executor: Default::default(), } } -} -impl TestClientBuilder where - B: backend::LocalBackend, - E: executor::NativeExecutionDispatch -{ + /// Alter the genesis storage parameters. + pub fn genesis_init_mut(&mut self) -> &mut G { + &mut self.genesis_init + } + + /// Extend child storage + pub fn add_child_storage( + mut self, + key: impl AsRef<[u8]>, + child_key: impl AsRef<[u8]>, + value: impl AsRef<[u8]>, + ) -> Self { + let entry = self.child_storage_extension.entry(key.as_ref().to_vec()).or_insert_with(Vec::new); + entry.push((child_key.as_ref().to_vec(), value.as_ref().to_vec())); + self + } + /// Set the execution strategy that should be used by all contexts. pub fn set_execution_strategy( mut self, @@ -191,112 +144,79 @@ impl TestClientBuilder where 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. - pub fn build(self) -> client::Client< - B, - client::LocalCallExecutor>, - runtime::Block, - runtime::RuntimeApi, - > { - self.build_with_longest_chain().0 - } - - /// Build the test client and longest chain as select chain. - pub fn build_with_longest_chain(self) -> ( + /// Build the test client with the given native executor. + pub fn build_with_executor( + self, + executor: Executor, + ) -> ( client::Client< - B, - client::LocalCallExecutor>, - runtime::Block, - runtime::RuntimeApi, + Backend, + Executor, + Block, + RuntimeApi, >, - client::LongestChain, - ) { - let executor = NativeExecutor::::new(None); - let executor = LocalCallExecutor::new(self.backend.clone(), executor); + client::LongestChain, + ) where + Executor: client::CallExecutor, + Backend: client::backend::Backend, + Block: BlockT::Out>, + { + + let storage = { + let mut storage = self.genesis_init.genesis_storage(); + + // Add some child storage keys. + for (key, value) in self.child_storage_extension { + storage.1.insert( + well_known_keys::CHILD_STORAGE_KEY_PREFIX.iter().cloned().chain(key).collect(), + value.into_iter().collect(), + ); + } + + storage + }; let client = client::Client::new( self.backend.clone(), executor, - genesis_storage(self.support_changes_trie, self.genesis_extension), - self.execution_strategies, + storage, + self.execution_strategies ).expect("Creates new client"); - #[allow(deprecated)] let longest_chain = client::LongestChain::new(self.backend); (client, longest_chain) } } -/// Creates new client instance used for tests. -#[cfg(feature = "include-wasm-blob")] -pub fn new() -> client::Client { - TestClientBuilder::new().build() -} - -/// 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)); - let backend = Arc::new(LightBackend::new(blockchain.clone())); - let executor = NativeExecutor::new(None); - let fetcher = Arc::new(LightFetcher); - let remote_call_executor = client::light::call_executor::RemoteCallExecutor::new(blockchain.clone(), fetcher); - let local_call_executor = client::LocalCallExecutor::new(backend.clone(), executor); - let call_executor = LightExecutor::new(backend.clone(), remote_call_executor, local_call_executor); - client::Client::new(backend, call_executor, genesis_storage(false, Default::default()), Default::default()).unwrap() -} - -fn genesis_config(support_changes_trie: bool) -> GenesisConfig { - GenesisConfig::new(support_changes_trie, vec![ - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Bob.into(), - AuthorityKeyring::Charlie.into(), - ], vec![ - AccountKeyring::Alice.into(), - AccountKeyring::Bob.into(), - AccountKeyring::Charlie.into(), - ], - 1000 - ) -} +impl TestClientBuilder< + client::LocalCallExecutor>, + Backend, + G, +> { + /// Build the test client with the given native executor. + pub fn build_with_native_executor( + self, + executor: I, + ) -> ( + client::Client< + Backend, + client::LocalCallExecutor>, + Block, + RuntimeApi + >, + client::LongestChain, + ) where + I: Into>>, + E: executor::NativeExecutionDispatch, + Backend: client::backend::Backend, + Block: BlockT::Out>, + { + let executor = executor.into().unwrap_or_else(|| executor::NativeExecutor::new(None)); + let executor = LocalCallExecutor::new(self.backend.clone(), executor); -fn genesis_storage( - support_changes_trie: bool, - extension: HashMap, Vec> -) -> (StorageOverlay, ChildrenStorageOverlay) { - let mut storage = genesis_config(support_changes_trie).genesis_map(); - 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)); - - 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) + self.build_with_executor(executor) + } } impl client::light::fetcher::Fetcher for LightFetcher { diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index 4244dcc58b..b0815c513b 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -29,7 +29,7 @@ consensus_authorities = { package = "substrate-consensus-authorities", path = ". [dev-dependencies] substrate-executor = { path = "../executor" } -substrate-test-client = { path = "../test-client" } +substrate-test-runtime-client = { path = "./client" } [features] default = [ diff --git a/core/test-runtime/client/Cargo.toml b/core/test-runtime/client/Cargo.toml new file mode 100644 index 0000000000..9ddeb7ba25 --- /dev/null +++ b/core/test-runtime/client/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "substrate-test-runtime-client" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +generic-test-client = { package = "substrate-test-client", path = "../../test-client" } +primitives = { package = "substrate-primitives", path = "../../primitives" } +runtime = { package = "substrate-test-runtime", path = "../../test-runtime", default-features = false } +runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } + +[features] +default = [ + "std", + "runtime/include-wasm-blob", +] +std = [ + "runtime/std", +] diff --git a/core/test-client/src/block_builder_ext.rs b/core/test-runtime/client/src/block_builder_ext.rs similarity index 93% rename from core/test-client/src/block_builder_ext.rs rename to core/test-runtime/client/src/block_builder_ext.rs index 15861ce3d0..ae95ecd7ab 100644 --- a/core/test-client/src/block_builder_ext.rs +++ b/core/test-runtime/client/src/block_builder_ext.rs @@ -16,10 +16,10 @@ //! Block Builder extensions for tests. -use client; use runtime; use runtime_primitives::traits::ProvideRuntimeApi; -use client::block_builder::api::BlockBuilder; +use generic_test_client::client; +use generic_test_client::client::block_builder::api::BlockBuilder; /// Extension trait for test block builder. pub trait BlockBuilderExt { diff --git a/core/test-runtime/client/src/lib.rs b/core/test-runtime/client/src/lib.rs new file mode 100644 index 0000000000..ee1ad24214 --- /dev/null +++ b/core/test-runtime/client/src/lib.rs @@ -0,0 +1,208 @@ +// 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 . + +//! Client testing utilities. + +#![warn(missing_docs)] + +pub mod trait_tests; + +mod block_builder_ext; + +pub use block_builder_ext::BlockBuilderExt; +pub use generic_test_client::*; +pub use runtime; + +use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT}; + +/// A prelude to import in tests. +pub mod prelude { + // Trait extensions + pub use super::{BlockBuilderExt, DefaultTestClientBuilderExt, TestClientBuilderExt, ClientExt}; + // Client structs + pub use super::{ + TestClient, TestClientBuilder, Backend, LightBackend, + Executor, LightExecutor, LocalExecutor, NativeExecutor, + }; + // Keyring + pub use super::{AccountKeyring, AuthorityKeyring}; +} + +mod local_executor { + #![allow(missing_docs)] + use runtime; + use crate::executor::native_executor_instance; + // FIXME #1576 change the macro and pass in the `BlakeHasher` that dispatch needs from here instead + native_executor_instance!( + pub LocalExecutor, + runtime::api::dispatch, + runtime::native_version, + include_bytes!("../../wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm") + ); +} + +/// Native executor used for tests. +pub use local_executor::LocalExecutor; + +/// Test client database backend. +pub type Backend = generic_test_client::Backend; + +/// Test client executor. +pub type Executor = client::LocalCallExecutor< + Backend, + NativeExecutor, +>; + +/// Test client light database backend. +pub type LightBackend = generic_test_client::LightBackend; + +/// Test client light executor. +pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor< + runtime::Block, + LightBackend, + client::light::call_executor::RemoteCallExecutor< + client::light::blockchain::Blockchain< + client_db::light::LightStorage, + LightFetcher + >, + LightFetcher + >, + client::LocalCallExecutor< + client::light::backend::Backend< + client_db::light::LightStorage, + LightFetcher, + Blake2Hasher + >, + NativeExecutor + > +>; + +/// Parameters of test-client builder with test-runtime. +#[derive(Default)] +pub struct GenesisParameters { + support_changes_trie: bool, +} + +impl generic_test_client::GenesisInit for GenesisParameters { + fn genesis_storage(&self) -> (StorageOverlay, ChildrenStorageOverlay) { + let mut storage = genesis_config(self.support_changes_trie).genesis_map(); + + 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, Default::default()) + } +} + +/// A `TestClient` with `test-runtime` builder. +pub type TestClientBuilder = generic_test_client::TestClientBuilder; + +/// Test client type with `LocalExecutor` and generic Backend. +pub type Client = client::Client< + B, + client::LocalCallExecutor>, + runtime::Block, + runtime::RuntimeApi, +>; + +/// A test client with default backend. +pub type TestClient = Client; + +/// A `TestClientBuilder` with default backend and executor. +pub trait DefaultTestClientBuilderExt: Sized { + /// Create new `TestClientBuilder` + fn new() -> Self; +} + +impl DefaultTestClientBuilderExt for TestClientBuilder< + Executor, + Backend, +> { + fn new() -> Self { + Self::with_default_backend() + } +} + +/// A `test-runtime` extensions to `TestClientBuilder`. +pub trait TestClientBuilderExt: Sized { + /// Enable or disable support for changes trie in genesis. + fn set_support_changes_trie(self, support_changes_trie: bool) -> Self; + + /// Build the test client. + fn build(self) -> Client { + self.build_with_longest_chain().0 + } + + /// Build the test client and longest chain selector. + fn build_with_longest_chain(self) -> (Client, client::LongestChain); +} + +impl TestClientBuilderExt for TestClientBuilder< + client::LocalCallExecutor>, + B +> where + B: client::backend::Backend, +{ + fn set_support_changes_trie(mut self, support_changes_trie: bool) -> Self { + self.genesis_init_mut().support_changes_trie = support_changes_trie; + self + } + + fn build_with_longest_chain(self) -> (Client, client::LongestChain) { + self.build_with_native_executor(None) + } +} + +fn genesis_config(support_changes_trie: bool) -> GenesisConfig { + GenesisConfig::new(support_changes_trie, vec![ + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Bob.into(), + AuthorityKeyring::Charlie.into(), + ], vec![ + AccountKeyring::Alice.into(), + AccountKeyring::Bob.into(), + AccountKeyring::Charlie.into(), + ], + 1000 + ) +} + +/// Creates new client instance used for tests. +pub fn new() -> Client { + TestClientBuilder::new().build() +} + +/// Creates new light client instance used for tests. +pub fn new_light() -> client::Client { + use std::sync::Arc; + + let storage = client_db::light::LightStorage::new_test(); + let blockchain = Arc::new(client::light::blockchain::Blockchain::new(storage)); + let backend = Arc::new(LightBackend::new(blockchain.clone())); + let executor = NativeExecutor::new(None); + let fetcher = Arc::new(LightFetcher); + let remote_call_executor = client::light::call_executor::RemoteCallExecutor::new(blockchain.clone(), fetcher); + let local_call_executor = client::LocalCallExecutor::new(backend.clone(), executor); + let call_executor = LightExecutor::new(backend.clone(), remote_call_executor, local_call_executor); + + TestClientBuilder::with_backend(backend) + .build_with_executor(call_executor) + .0 +} diff --git a/core/test-client/src/trait_tests.rs b/core/test-runtime/client/src/trait_tests.rs similarity index 96% rename from core/test-client/src/trait_tests.rs rename to core/test-runtime/client/src/trait_tests.rs index f39d85a1ca..3d013e3e74 100644 --- a/core/test-client/src/trait_tests.rs +++ b/core/test-runtime/client/src/trait_tests.rs @@ -20,15 +20,16 @@ #![allow(missing_docs)] use std::sync::Arc; -use consensus::BlockOrigin; -use primitives::Blake2Hasher; -use crate::{TestClient, AccountKeyring}; -use runtime_primitives::traits::Block as BlockT; + use crate::backend; +use crate::block_builder_ext::BlockBuilderExt; use crate::blockchain::{Backend as BlockChainBackendT, HeaderBackend}; -use crate::{BlockBuilderExt, TestClientBuilder}; +use crate::{AccountKeyring, ClientExt, TestClientBuilder, TestClientBuilderExt}; +use generic_test_client::consensus::BlockOrigin; +use primitives::Blake2Hasher; use runtime::{self, Transfer}; use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::Block as BlockT; /// helper to test the `leaves` implementation for various backends pub fn test_leaves_for_backend(backend: Arc) where @@ -40,7 +41,7 @@ pub fn test_leaves_for_backend(backend: Arc) where // B2 -> C3 // A1 -> D2 - let client = TestClientBuilder::new_with_backend(backend.clone()).build(); + let client = TestClientBuilder::with_backend(backend.clone()).build(); let blockchain = backend.blockchain(); let genesis_hash = client.info().chain.genesis_hash; @@ -156,7 +157,7 @@ pub fn test_children_for_backend(backend: Arc) where // B2 -> C3 // A1 -> D2 - let client = TestClientBuilder::new_with_backend(backend.clone()).build(); + let client = TestClientBuilder::with_backend(backend.clone()).build(); let blockchain = backend.blockchain(); // G -> A1 @@ -246,7 +247,7 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let client = TestClientBuilder::new_with_backend(backend.clone()).build(); + let client = TestClientBuilder::with_backend(backend.clone()).build(); let blockchain = backend.blockchain(); // G -> A1 diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 491ca0db36..57a5cb9ea2 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -311,7 +311,7 @@ mod tests { use runtime_io::{with_externalities, twox_128, blake2_256, TestExternalities}; use parity_codec::{Joiner, KeyedVec}; - use substrate_test_client::{AuthorityKeyring, AccountKeyring}; + use substrate_test_runtime_client::{AuthorityKeyring, AccountKeyring}; use crate::{Header, Transfer}; use primitives::{Blake2Hasher, map}; use primitives::storage::well_known_keys; diff --git a/core/transaction-pool/Cargo.toml b/core/transaction-pool/Cargo.toml index ed2cd27833..2bcad4d4d6 100644 --- a/core/transaction-pool/Cargo.toml +++ b/core/transaction-pool/Cargo.toml @@ -17,4 +17,4 @@ txpool = { package = "substrate-transaction-graph", path = "./graph" } [dev-dependencies] keyring = { package = "substrate-keyring", path = "../../core/keyring" } -test_client = { package = "substrate-test-client", path = "../../core/test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index 89b448ec90..ee126d19ea 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -17,6 +17,7 @@ node-primitives = { path = "../primitives" } node-runtime = { path = "../runtime" } [dev-dependencies] +test-client = { package = "substrate-test-client", path = "../../core/test-client" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } runtime_support = { package = "srml-support", path = "../../srml/support" } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 05dc424d49..aabee6805e 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -895,6 +895,21 @@ mod tests { assert!(t.storage_changes_root(GENESIS_HASH.into()).unwrap().is_some()); } + #[test] + fn should_import_block_with_test_client() { + use test_client::{ClientExt, TestClientBuilder, consensus::BlockOrigin}; + + let client = TestClientBuilder::default() + .build_with_native_executor::(executor()) + .0; + + let block1 = changes_trie_block(); + let block_data = block1.0; + let block = Block::decode(&mut &block_data[..]).unwrap(); + + client.import(BlockOrigin::Own, block).unwrap(); + } + #[cfg(feature = "benchmarks")] mod benches { use super::*; -- GitLab From e9bbcff05394553ffc7a97c1fa4af9262061eec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 11 Jun 2019 22:42:28 +0200 Subject: [PATCH 104/140] Remove compilation warnings. (#2835) * Remove compilation warnings. * Allow unused only not in tests. * Remove unnecessary mut. * Make CI happy. * Revert "Make CI happy." This reverts commit abb865fe4b9fe9af1ae3ec801da9d4305ea35765. --- Cargo.lock | 272 +++++++++--------- core/client/src/runtime_api.rs | 1 - core/consensus/aura/src/lib.rs | 2 +- core/network/src/test/mod.rs | 7 + .../procedural/src/storage/transformation.rs | 2 +- 5 files changed, 145 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b79b9c0827..ef24acc3d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -22,7 +22,7 @@ version = "0.3.3" 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)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -103,7 +103,7 @@ version = "0.1.1" 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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -157,7 +157,7 @@ name = "base64" version = "0.9.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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -166,7 +166,7 @@ name = "base64" version = "0.10.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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -174,7 +174,7 @@ name = "bigint" version = "4.4.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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -183,7 +183,7 @@ name = "bindgen" 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)", + "bitflags 1.1.0 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", "clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -195,13 +195,13 @@ dependencies = [ "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (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)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bitflags" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -245,7 +245,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -305,7 +305,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "byteorder" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -313,7 +313,7 @@ name = "bytes" 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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -386,7 +386,7 @@ 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)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -407,7 +407,7 @@ name = "cloudabi" version = "0.0.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)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -476,7 +476,7 @@ dependencies = [ "serde_derive 1.0.92 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -484,7 +484,7 @@ name = "criterion-plot" 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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -500,7 +500,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.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -510,7 +510,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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -645,7 +645,7 @@ 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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -677,10 +677,10 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.2.0" +version = "1.2.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)", + "byteorder 1.3.2 (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_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -700,7 +700,7 @@ dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -729,7 +729,7 @@ name = "dns-parser" 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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -739,7 +739,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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.1 (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)", @@ -766,7 +766,7 @@ 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.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -817,7 +817,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -853,7 +853,7 @@ name = "fixed-hash" 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)", + "byteorder 1.3.2 (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.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -920,7 +920,7 @@ name = "fuchsia-zircon" version = "0.3.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)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -940,7 +940,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1004,7 +1004,7 @@ dependencies = [ "bstr 0.1.4 (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)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1012,7 +1012,7 @@ name = "h2" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (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.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1042,7 +1042,7 @@ name = "hashbrown" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1179,7 +1179,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.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (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)", @@ -1345,7 +1345,7 @@ dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1383,7 +1383,7 @@ dependencies = [ "jsonrpc-core 12.0.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.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.21 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1414,7 +1414,7 @@ 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.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1454,9 +1454,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.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (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.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1519,7 +1519,7 @@ dependencies = [ "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 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)", + "smallvec 0.6.10 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1551,7 +1551,7 @@ dependencies = [ "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (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)", @@ -1567,7 +1567,7 @@ version = "0.9.0" 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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1606,7 +1606,7 @@ dependencies = [ "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.2 (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)", + "smallvec 0.6.10 (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)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1625,7 +1625,7 @@ dependencies = [ "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (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)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1653,7 +1653,7 @@ dependencies = [ "protobuf 2.6.2 (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)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (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)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1674,7 +1674,7 @@ dependencies = [ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multiaddr 0.5.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)", + "smallvec 0.6.10 (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)", @@ -1704,7 +1704,7 @@ version = "0.7.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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.9.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1977,7 +1977,7 @@ name = "merlin" version = "1.1.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)", + "byteorder 1.3.2 (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_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2076,7 +2076,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (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)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2122,7 +2122,7 @@ name = "nix" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2147,7 +2147,7 @@ dependencies = [ "srml-finality-tracker 2.0.0", "srml-indices 2.0.0", "srml-timestamp 2.0.0", - "structopt 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.2.16 (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", @@ -2354,7 +2354,7 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2392,7 +2392,7 @@ name = "openssl" version = "0.10.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (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)", @@ -2464,7 +2464,7 @@ dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2474,7 +2474,7 @@ 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)", + "byteorder 1.3.2 (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.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2507,7 +2507,7 @@ name = "parity-wasm" version = "0.31.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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2554,7 +2554,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.58 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2566,7 +2566,7 @@ dependencies = [ "libc 0.2.58 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2578,7 +2578,7 @@ dependencies = [ "libc 0.2.58 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2593,7 +2593,7 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.54 (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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2614,7 +2614,7 @@ dependencies = [ "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2622,7 +2622,7 @@ name = "pbkdf2" version = "0.3.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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2696,7 +2696,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2722,7 +2722,7 @@ name = "pwasm-utils" version = "0.6.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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2879,7 +2879,7 @@ name = "rand_xoshiro" version = "0.1.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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2901,7 +2901,7 @@ 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.58 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2932,19 +2932,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "regex" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "regex-syntax 0.6.7 (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)", + "utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.6" +version = "0.6.7" 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)", @@ -3084,7 +3084,7 @@ 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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.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)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3166,7 +3166,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3281,12 +3281,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "smallvec" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3295,13 +3295,13 @@ 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)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "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.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (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)", ] @@ -3319,7 +3319,7 @@ dependencies = [ "log 0.4.6 (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)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (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)", ] @@ -3351,8 +3351,8 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", "substrate-test-runtime-client 2.0.0", - "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", - "trybuild 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3369,7 +3369,7 @@ dependencies = [ "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)", + "tiny-keccak 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3741,7 +3741,7 @@ dependencies = [ "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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3752,7 +3752,7 @@ dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3761,7 +3761,7 @@ version = "2.0.0" dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3774,7 +3774,7 @@ dependencies = [ "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)", + "trybuild 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3860,22 +3860,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "structopt" -version = "0.2.17" +version = "0.2.16" 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.17 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt-derive 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "structopt-derive" -version = "0.2.17" +version = "0.2.16" 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.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3891,7 +3891,7 @@ dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3967,11 +3967,11 @@ 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)", "names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (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.17 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 2.0.0", "substrate-keyring 2.0.0", "substrate-network 2.0.0", @@ -4207,7 +4207,7 @@ name = "substrate-executor" 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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (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)", @@ -4222,7 +4222,7 @@ dependencies = [ "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)", + "tiny-keccak 1.4.3 (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.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4304,7 +4304,7 @@ dependencies = [ name = "substrate-network" version = "2.0.0" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (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", @@ -4334,7 +4334,7 @@ dependencies = [ name = "substrate-network-libp2p" version = "2.0.0" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (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)", @@ -4348,7 +4348,7 @@ dependencies = [ "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)", + "smallvec 0.6.10 (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.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4414,7 +4414,7 @@ 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)", + "byteorder 1.3.2 (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)", @@ -4427,7 +4427,7 @@ dependencies = [ "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.4 (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.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4713,7 +4713,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.34" +version = "0.15.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4728,7 +4728,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4831,7 +4831,7 @@ dependencies = [ [[package]] name = "tiny-keccak" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4865,14 +4865,14 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.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-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-sync 0.1.6 (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.14 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4960,12 +4960,12 @@ 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.19 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (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.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)", + "tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4983,7 +4983,7 @@ dependencies = [ [[package]] name = "tokio-sync" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5013,7 +5013,7 @@ dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (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.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5157,7 +5157,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "trybuild" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5174,7 +5174,7 @@ version = "0.2.0" 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)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5206,7 +5206,7 @@ name = "uint" version = "0.7.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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5241,7 +5241,7 @@ name = "unicode-normalization" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5285,7 +5285,7 @@ dependencies = [ [[package]] name = "utf8-ranges" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -5303,7 +5303,7 @@ name = "vergen" version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.2.7" +version = "2.2.8" 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)", @@ -5377,7 +5377,7 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5407,7 +5407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5427,7 +5427,7 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5500,8 +5500,8 @@ version = "0.22.4" 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)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (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.27 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5585,7 +5585,7 @@ name = "ws" version = "0.8.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)", + "byteorder 1.3.2 (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)", @@ -5612,7 +5612,7 @@ 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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5670,7 +5670,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5680,7 +5680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5707,7 +5707,7 @@ dependencies = [ "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.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 bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" "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" @@ -5722,7 +5722,7 @@ dependencies = [ "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 byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" "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" @@ -5762,7 +5762,7 @@ dependencies = [ "checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" "checksum ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c7dfd2d8b4c82121dfdff120f818e09fc4380b0b7e17a742081a89b94853e87f" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -"checksum curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4440b7acc6264fde2eee18bae135625129c88ff244f3ded035e3caa585a6bf0a" +"checksum curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5d4b820e8711c211745880150f5fac78ab07d6e3851d8ce9f5a02cedc199174c" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" "checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" @@ -5906,7 +5906,7 @@ dependencies = [ "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" "checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" "checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" -"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" +"checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273" "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" @@ -5971,8 +5971,8 @@ dependencies = [ "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.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 regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0b2f0808e7d7e4fb1cb07feb6ff2f4bc827938f24f8c2e6a3beb7370af544bdd" +"checksum regex-syntax 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d76410686f9e3a17f06128962e0ecc5755870bb890c34820c7af7f1db2e1d48" "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" @@ -6011,7 +6011,7 @@ dependencies = [ "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 smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" "checksum soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" @@ -6022,14 +6022,14 @@ dependencies = [ "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0bbfb8937e38e34c3444ff00afb28b0811d9554f15c5ad64d12b0308d1d1995" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" -"checksum structopt 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c767a8971f53d7324583085deee2e230903be09e52fb27df9af94c5cb2b43c31" -"checksum structopt-derive 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c57a30c87454ced2186f62f940e981746e8cbbe026d52090c8c4352b636f8235" +"checksum structopt 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fa19a5a708e22bb5be31c1b6108a2a902f909c4b9ba85cba44c06632386bc0ff" +"checksum structopt-derive 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "c6d59d0ae8ef8de16e49e3ca7afa16024a3e0dfd974a75ef93fdc5464e34523f" "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.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 syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)" = "641e117d55514d6d918490e47102f7e08d096fdde360247e4a10f7a91a8478d3" "checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum sysinfo 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1cf62641ed7e88e20242b948d17b9fcc37e80b5599cf09cde190d6d4bb4bf289" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" @@ -6041,7 +6041,7 @@ dependencies = [ "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.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 tiny-keccak 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "dbbdebb0b801c7fa4260b6b9ac5a15980276d7d7bcc2dc2959a7c4dc8b426a1a" "checksum tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4574b75faccaacddb9b284faecdf0b544b80b6b294f3d062d325c5726a209c20" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" "checksum tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "ec2ffcf4bcfc641413fa0f1427bf8f91dfc78f56a6559cbf50e04837ae442a87" @@ -6054,7 +6054,7 @@ dependencies = [ "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-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" -"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" +"checksum tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2162248ff317e2bc713b261f242b69dbb838b85248ed20bb21df56d60ea4cae7" "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.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" @@ -6069,7 +6069,7 @@ dependencies = [ "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum trie-standardmap 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ebaa4b340046196efad8872b2dffe585b5ea330230dc44ee14e399f77da29f51" "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 trybuild 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d1506db833ec4a139b8e3d2e88125d8999270cc944046ca1fb138f6bbfbc2e43" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" @@ -6086,7 +6086,7 @@ dependencies = [ "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" -"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" +"checksum utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9d50aa7650df78abf942826607c62468ce18d9019673d4a2ebe1865dbb96ffde" "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 vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6aba5e34f93dc7051dfad05b98a18e9156f27e7b431fe1d2398cb6061c0a1dba" @@ -6094,7 +6094,7 @@ dependencies = [ "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "74e463a508e390cc7447e70f640fbf44ad52e1bd095314ace1fdf99516d32add" "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 walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c7904a7e2bb3cdf0cf5e783f44204a85a37a93151738fa349f06680f59a98b45" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" "checksum wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" "checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index e456c166dc..4f2f841461 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -46,7 +46,6 @@ use sr_api_macros::decl_runtime_apis; use primitives::OpaqueMetadata; #[cfg(feature = "std")] use std::{panic::UnwindSafe, cell::RefCell, rc::Rc}; -use rstd::vec::Vec; #[cfg(feature = "std")] use primitives::Hasher as HasherT; diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index ad618c2188..fa878ef104 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -40,7 +40,7 @@ use consensus_common::import_queue::{ use client::{ block_builder::api::BlockBuilder as BlockBuilderApi, blockchain::ProvideCache, - runtime_api::{ApiExt, Core as CoreApi}, + runtime_api::ApiExt, error::Result as CResult, backend::AuxStore, }; diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 886a09fa2a..b27214d07b 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -282,6 +282,10 @@ pub struct Peer> { peer_id: PeerId, client: PeersClient, net_proto_channel: ProtocolChannel, + /// This field is used only in test code, but maintaining different + /// instantiation paths or field names is too much hassle, hence + /// we allow it to be unused. + #[cfg_attr(not(test), allow(unused))] protocol_status: Arc>>, import_queue: Box>, pub data: D, @@ -471,6 +475,7 @@ impl> Peer { self.net_proto_channel.send_from_client(ProtocolMsg::BlockImported(info.chain.best_hash, header)); } + #[cfg(test)] fn on_block_imported( &self, hash: ::Hash, @@ -492,6 +497,7 @@ impl> Peer { } /// Get protocol status. + #[cfg(test)] fn protocol_status(&self) -> ProtocolStatus { self.protocol_status.read().clone() } @@ -608,6 +614,7 @@ impl> Peer { } /// Announce a block to peers. + #[cfg(test)] fn announce_block(&self, block: Hash) { self.net_proto_channel.send_from_client(ProtocolMsg::AnnounceBlock(block)); } diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index 1da6ae2108..2827259420 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -217,7 +217,7 @@ fn decl_store_extra_genesis( let type_infos = get_type_infos(storage_type); - let mut opt_build; + let opt_build; // need build line if let Some(ref config) = config.inner { let ident = if let Some(ident) = config.expr.content.as_ref() { -- GitLab From 33266312a71818fac54c58d4b10fef8426f72db9 Mon Sep 17 00:00:00 2001 From: lsaether Date: Wed, 12 Jun 2019 09:03:23 +0200 Subject: [PATCH 105/140] Add weight annotations to Timestamp, Sudo, Democracy, Treasury, et al. (#2694) * Add some initial weighting notes * Add Democracy and Sudo * Add flags, fix formatting * Add comments on finality-tracker * Add a few mode modules. * Update srml/democracy/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update srml/democracy/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update srml/system/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update srml/system/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update srml/system/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update srml/system/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update srml/treasury/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update and merge changes * Update srml/system/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Remove unneeded comment * Remove comment line * Fix comment * Fix formatting overall * Apply suggestions from code review Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Apply suggestions from code review Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Clean up and polish * Update srml/indices/src/lib.rs * Update srml/staking/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Final nits. --- srml/balances/src/lib.rs | 24 +++++++++++ srml/council/src/motions.rs | 8 ++++ srml/council/src/seats.rs | 30 ++++++++++++++ srml/democracy/src/lib.rs | 40 +++++++++++++++++++ srml/indices/src/lib.rs | 15 +++++++ srml/session/src/lib.rs | 14 ++++++- srml/staking/src/lib.rs | 80 +++++++++++++++++++++++++++++++++++-- srml/staking/src/tests.rs | 11 +---- srml/sudo/src/lib.rs | 12 ++++++ srml/system/src/lib.rs | 2 +- srml/treasury/src/lib.rs | 18 +++++++++ 11 files changed, 239 insertions(+), 15 deletions(-) diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index e205fa0aaa..c8f5c33d06 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -346,6 +346,21 @@ decl_module! { /// of the transfer, the account will be reaped. /// /// The dispatch origin for this call must be `Signed` by the transactor. + /// + /// # + /// - Dependent on arguments but not critical, given proper implementations for + /// input config types. See related functions below. + /// - It contains a limited number of reads and writes internally and no complex computation. + /// + /// Related functions: + /// + /// - `ensure_can_withdraw` is always called internally but has a bounded complexity. + /// - Transferring balances to accounts that did not exist before will cause + /// `T::OnNewAccount::on_new_account` to be called. + /// - Removing enough funds from an account will trigger + /// `T::DustRemoval::on_unbalanced` and `T::OnFreeBalanceZero::on_free_balance_zero`. + /// + /// # pub fn transfer( origin, dest: ::Source, @@ -364,6 +379,11 @@ decl_module! { /// and reset the account nonce (`system::AccountNonce`). /// /// The dispatch origin for this call is `root`. + /// + /// # + /// - Independent of the arguments. + /// - Contains a limited number of reads and writes. + /// # fn set_balance( who: ::Source, #[compact] free: T::Balance, @@ -700,6 +720,10 @@ where >::get(who) } + // # + // Despite iterating over a list of locks, they are limited by the number of + // lock IDs, which means the number of runtime modules that intend to use and create locks. + // # fn ensure_can_withdraw( who: &T::AccountId, _amount: T::Balance, diff --git a/srml/council/src/motions.rs b/srml/council/src/motions.rs index df357ac8c8..8f31ee582f 100644 --- a/srml/council/src/motions.rs +++ b/srml/council/src/motions.rs @@ -120,6 +120,10 @@ decl_module! { Self::deposit_event(RawEvent::MemberExecuted(proposal_hash, ok)); } + /// # + /// - Bounded storage reads and writes. + /// - Argument `threshold` has bearing on weight. + /// # fn propose(origin, #[compact] threshold: MemberCount, proposal: Box<::Proposal>) { let who = ensure_signed(origin)?; @@ -145,6 +149,10 @@ decl_module! { } } + /// # + /// - Bounded storage read and writes. + /// - Will be slightly heavier if the proposal is approved / disapproved after the vote. + /// # fn vote(origin, proposal: T::Hash, #[compact] index: ProposalIndex, approve: bool) { let who = ensure_signed(origin)?; diff --git a/srml/council/src/seats.rs b/srml/council/src/seats.rs index 3e80584900..84b6f388f2 100644 --- a/srml/council/src/seats.rs +++ b/srml/council/src/seats.rs @@ -171,6 +171,12 @@ decl_module! { /// /// Note that any trailing `false` votes in `votes` is ignored; In approval voting, not voting for a candidate /// and voting false, are equal. + /// + /// # + /// - O(1). + /// - Two extra DB entries, one DB change. + /// - Argument `votes` is limited in length to number of candidates. + /// # fn set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, hint: SetIndex) -> Result { let who = ensure_signed(origin)?; Self::do_set_approvals(who, votes, index, hint) @@ -178,6 +184,10 @@ decl_module! { /// Set candidate approvals from a proxy. Approval slots stay valid as long as candidates in those slots /// are registered. + /// + /// # + /// - Same as `set_approvals` with one additional storage read. + /// # fn proxy_set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, hint: SetIndex) -> Result { let who = >::proxy(ensure_signed(origin)?).ok_or("not a proxy")?; Self::do_set_approvals(who, votes, index, hint) @@ -190,6 +200,11 @@ decl_module! { /// Both indices must be provided as explained in [`voter_at`] function. /// /// May be called by anyone. Returns the voter deposit to `signed`. + /// + /// # + /// - O(1). + /// - Two fewer DB entries, one DB change. + /// # fn reap_inactive_voter( origin, #[compact] reporter_index: u32, @@ -258,6 +273,11 @@ decl_module! { /// The index must be provided as explained in [`voter_at`] function. /// /// Also removes the lock on the balance of the voter. See [`do_set_approvals()`]. + /// + /// # + /// - O(1). + /// - Two fewer DB entries, one DB change. + /// # fn retract_voter(origin, #[compact] index: u32) { let who = ensure_signed(origin)?; @@ -280,6 +300,11 @@ decl_module! { /// it will NOT have any usable funds to pass candidacy bond and must first retract. /// Note that setting approvals will lock the entire balance of the voter until /// retraction or being reported. + /// + /// # + /// - Independent of input. + /// - Three DB changes. + /// # fn submit_candidacy(origin, #[compact] slot: u32) { let who = ensure_signed(origin)?; @@ -310,6 +335,11 @@ decl_module! { /// Claim that `signed` is one of the top Self::carry_count() + current_vote().1 candidates. /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()` /// `signed` should have at least + /// + /// # + /// - O(voters) compute. + /// - One DB change. + /// # fn present_winner( origin, candidate: ::Source, diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 2ccff71869..b6d032d791 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -321,6 +321,11 @@ decl_module! { fn deposit_event() = default; /// Propose a sensitive action to be taken. + /// + /// # + /// - O(1). + /// - Two DB changes, one DB entry. + /// # fn propose(origin, proposal: Box, #[compact] value: BalanceOf @@ -343,6 +348,11 @@ decl_module! { } /// Propose a sensitive action to be taken. + /// + /// # + /// - O(1). + /// - One DB entry. + /// # fn second(origin, #[compact] proposal: PropIndex) { let who = ensure_signed(origin)?; let mut deposit = Self::deposit_of(proposal) @@ -355,6 +365,11 @@ decl_module! { /// Vote in a referendum. If `vote.is_aye()`, the vote is to enact the proposal; /// otherwise it is a vote to keep the status quo. + /// + /// # + /// - O(1). + /// - One DB change, one DB entry. + /// # fn vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote @@ -365,6 +380,11 @@ decl_module! { /// Vote in a referendum on behalf of a stash. If `vote.is_aye()`, the vote is to enact /// the proposal; otherwise it is a vote to keep the status quo. + /// + /// # + /// - O(1). + /// - One DB change, one DB entry. + /// # fn proxy_vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote @@ -492,6 +512,10 @@ decl_module! { } /// Specify a proxy. Called by the stash. + /// + /// # + /// - One extra DB entry. + /// # fn set_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; ensure!(!>::exists(&proxy), "already a proxy"); @@ -499,12 +523,20 @@ decl_module! { } /// Clear the proxy. Called by the proxy. + /// + /// # + /// - One DB clear. + /// # fn resign_proxy(origin) { let who = ensure_signed(origin)?; >::remove(who); } /// Clear the proxy. Called by the stash. + /// + /// # + /// - One DB clear. + /// # fn remove_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; ensure!(&Self::proxy(&proxy).ok_or("not a proxy")? == &who, "wrong proxy"); @@ -512,6 +544,10 @@ decl_module! { } /// Delegate vote. + /// + /// # + /// - One extra DB entry. + /// # pub fn delegate(origin, to: T::AccountId, conviction: Conviction) { let who = ensure_signed(origin)?; >::insert(who.clone(), (to.clone(), conviction)); @@ -527,6 +563,10 @@ decl_module! { } /// Undelegate vote. + /// + /// # + /// - O(1). + /// # fn undelegate(origin) { let who = ensure_signed(origin)?; ensure!(>::exists(&who), "not delegated"); diff --git a/srml/indices/src/lib.rs b/srml/indices/src/lib.rs index 38f7ee668d..45487e3b51 100644 --- a/srml/indices/src/lib.rs +++ b/srml/indices/src/lib.rs @@ -156,6 +156,21 @@ impl Module { } impl OnNewAccount for Module { + // Implementation of the config type managing the creation of new accounts. + // See Balances module for a concrete example. + // + // # + // - Independent of the arguments. + // - Given the correct value of `Self::next_enum_set`, it always has a limited + // number of reads and writes and no complex computation. + // + // As for storage, calling this function with _non-dead-indices_ will linearly grow the length of + // of `Self::enum_set`. Appropriate economic incentives should exist to make callers of this + // function provide a `who` argument that reclaims a dead account. + // + // At the time of this writing, only the Balances module calls this function upon creation + // of new accounts. + // # fn on_new_account(who: &T::AccountId) { let enum_set_size = Self::enum_set_size(); let next_set_index = Self::next_enum_set(); diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index d13795e4bb..5c36f6fadc 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -161,8 +161,16 @@ decl_module! { pub struct Module for enum Call where origin: T::Origin { fn deposit_event() = default; - /// Sets the session key of a validator (function caller) to `key`. + /// Sets the session key of the function caller to `key`. + /// Allows an account to set its session key prior to becoming a validator. /// This doesn't take effect until the next session. + /// + /// The dispatch origin of this function must be signed. + /// + /// # + /// - O(1). + /// - One extra DB entry. + /// # fn set_key(origin, key: T::SessionKey) { let who = ensure_signed(origin)?; // set new value for next session @@ -170,11 +178,15 @@ decl_module! { } /// Set a new session length. Won't kick in until the next session change (at current length). + /// + /// Dispatch origin of this call must be _root_. fn set_length(#[compact] new: T::BlockNumber) { >::put(new); } /// Forces a new session. + /// + /// Dispatch origin of this call must be _root_. fn force_new_session(apply_rewards: bool) -> Result { Self::apply_force_new_session(apply_rewards) } diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 3f6905f654..e76b73a749 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -155,7 +155,7 @@ //! //! 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 +//! 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 @@ -226,7 +226,7 @@ //! //! 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 +//! 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. //! //! ## GenesisConfig @@ -569,6 +569,19 @@ decl_module! { /// account that controls it. /// /// The dispatch origin for this call must be _Signed_ by the stash account. + /// + /// # + /// - Independent of the arguments. Moderate complexity. + /// - O(1). + /// - Three extra DB entries. + /// + /// NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned unless + /// the `origin` falls below _existential deposit_ and gets removed as dust. + /// + /// NOTE: At the moment, there are no financial restrictions to bond + /// (which creates a bunch of storage items for an account). In essence, nothing prevents many accounts from + /// spamming `Staking` storage by bonding 1 UNIT. See test case: `bond_with_no_staked_value`. + /// # fn bond(origin, controller: ::Source, #[compact] value: BalanceOf, payee: RewardDestination) { let stash = ensure_signed(origin)?; @@ -583,7 +596,7 @@ decl_module! { } // You're auto-bonded forever, here. We might improve this by only bonding when - // you actually validate/nominate. + // you actually validate/nominate and remove once you unbond __everything__. >::insert(&stash, controller.clone()); >::insert(&stash, payee); @@ -598,6 +611,12 @@ decl_module! { /// Use this if there are additional funds in your stash account that you wish to bond. /// /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. + /// + /// # + /// - Independent of the arguments. Insignificant complexity. + /// - O(1). + /// - One DB entry. + /// # fn bond_extra(origin, #[compact] max_additional: BalanceOf) { let stash = ensure_signed(origin)?; @@ -628,6 +647,15 @@ decl_module! { /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. /// /// See also [`Call::withdraw_unbonded`]. + /// + /// # + /// - Independent of the arguments. Limited but potentially exploitable complexity. + /// - Contains a limited number of reads. + /// - Each call (requires the remainder of the bonded balance to be above `minimum_balance`) + /// will cause a new entry to be inserted into a vector (`Ledger.unlocking`) kept in storage. + /// The only way to clean the aforementioned storage item is also user-controlled via `withdraw_unbonded`. + /// - One DB entry. + /// fn unbond(origin, #[compact] value: BalanceOf) { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -661,6 +689,14 @@ decl_module! { /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. /// /// See also [`Call::unbond`]. + /// + /// # + /// - Could be dependent on the `origin` argument and how much `unlocking` chunks exist. It implies + /// `consolidate_unlocked` which loops over `Ledger.unlocking`, which is indirectly + /// user-controlled. See [`unbond`] for more detail. + /// - Contains a limited number of reads, yet the size of which could be large based on `ledger`. + /// - Writes are limited to the `origin` account key. + /// # fn withdraw_unbonded(origin) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -673,6 +709,12 @@ decl_module! { /// Effects will be felt at the beginning of the next era. /// /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. + /// + /// # + /// - Independent of the arguments. Insignificant complexity. + /// - Contains a limited number of reads. + /// - Writes are limited to the `origin` account key. + /// # fn validate(origin, prefs: ValidatorPrefs>) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -687,6 +729,12 @@ decl_module! { /// Effects will be felt at the beginning of the next era. /// /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. + /// + /// # + /// - The transaction's complexity is proportional to the size of `targets`, + /// which is capped at `MAX_NOMINATIONS`. + /// - Both the reads and writes follow a similar pattern. + /// # fn nominate(origin, targets: Vec<::Source>) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -706,6 +754,12 @@ decl_module! { /// Effects will be felt at the beginning of the next era. /// /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. + /// + /// # + /// - Independent of the arguments. Insignificant complexity. + /// - Contains one read. + /// - Writes are limited to the `origin` account key. + /// # fn chill(origin) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -719,6 +773,12 @@ decl_module! { /// Effects will be felt at the beginning of the next era. /// /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. + /// + /// # + /// - Independent of the arguments. Insignificant complexity. + /// - Contains a limited number of reads. + /// - Writes are limited to the `origin` account key. + /// # fn set_payee(origin, payee: RewardDestination) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or("not a controller")?; @@ -731,6 +791,12 @@ decl_module! { /// Effects will be felt at the beginning of the next era. /// /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. + /// + /// # + /// - Independent of the arguments. Insignificant complexity. + /// - Contains a limited number of reads. + /// - Writes are limited to the `origin` account key. + /// # fn set_controller(origin, controller: ::Source) { let stash = ensure_signed(origin)?; let old_controller = Self::bonded(&stash).ok_or("not a stash")?; @@ -744,6 +810,8 @@ decl_module! { } } + // ----- Root calls. + /// Set the number of sessions in an era. fn set_sessions_per_era(#[compact] new: T::BlockNumber) { >::put(new); @@ -761,6 +829,12 @@ decl_module! { /// Force there to be a new era. This also forces a new session immediately after. /// `apply_rewards` should be true for validators to get the session reward. + /// + /// # + /// - Independent of the arguments. + /// - Triggers the Phragmen election. Expensive but not user-controlled. + /// - Depends on state: `O(|edges| * |validators|)`. + /// # fn force_new_era(apply_rewards: bool) -> Result { Self::apply_force_new_era(apply_rewards) } diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index eba6ce77a5..357a1c1427 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -1669,20 +1669,15 @@ fn bond_with_no_staked_value() { System::set_block_number(1); Session::check_rotate_session(System::block_number()); - // Not elected even though we want 3. assert_eq_uvec!(Session::validators(), vec![30, 20, 10]); // min of 10, 20 and 30 (30 got a payout into staking so it raised it from 1 to 11). assert_eq!(Staking::slot_stake(), 11); - // let's make the stingy one elected. + // make the stingy one elected. assert_ok!(Staking::bond(Origin::signed(3), 4, 500, RewardDestination::Controller)); assert_ok!(Staking::nominate(Origin::signed(4), vec![1])); - // no rewards paid to 2 and 4 yet - assert_eq!(Balances::free_balance(&2), initial_balance_2); - assert_eq!(Balances::free_balance(&4), initial_balance_4); - System::set_block_number(2); Session::check_rotate_session(System::block_number()); @@ -1692,10 +1687,6 @@ fn bond_with_no_staked_value() { // New slot stake. assert_eq!(Staking::slot_stake(), 501); - // no rewards paid to 2 and 4 yet - assert_eq!(Balances::free_balance(&2), initial_balance_2); - assert_eq!(Balances::free_balance(&4), initial_balance_4); - System::set_block_number(3); Session::check_rotate_session(System::block_number()); diff --git a/srml/sudo/src/lib.rs b/srml/sudo/src/lib.rs index 1caeac73b8..a421bdae68 100644 --- a/srml/sudo/src/lib.rs +++ b/srml/sudo/src/lib.rs @@ -110,6 +110,12 @@ decl_module! { /// Authenticates the sudo key and dispatches a function call with `Root` origin. /// /// The dispatch origin for this call must be _Signed_. + /// + /// # + /// - O(1). + /// - Limited storage reads. + /// - No DB writes. + /// # fn sudo(origin, proposal: Box) { // This is a public call, so we ensure that the origin is some signed account. let sender = ensure_signed(origin)?; @@ -129,6 +135,12 @@ decl_module! { /// Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo key. /// /// The dispatch origin for this call must be _Signed_. + /// + /// # + /// - O(1). + /// - Limited storage reads. + /// - One DB change. + /// # fn set_key(origin, new: ::Source) { // This is a public call, so we ensure that the origin is some signed account. let sender = ensure_signed(origin)?; diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index b08321f860..276b389dc1 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -475,7 +475,7 @@ impl Module { /// 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. + /// This will update storage entries that correspond 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(); diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index cd9e781f66..fb3b68a6e9 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -110,6 +110,12 @@ decl_module! { /// Put forward a suggestion for spending. A deposit proportional to the value /// is reserved and slashed if the proposal is rejected. It is returned once the /// proposal is awarded. + /// + /// # + /// - O(1). + /// - Limited storage reads. + /// - One DB change, one extra DB entry. + /// # fn propose_spend( origin, #[compact] value: BalanceOf, @@ -149,6 +155,12 @@ decl_module! { } /// Reject a proposed spend. The original deposit will be slashed. + /// + /// # + /// - O(1). + /// - Limited storage reads. + /// - One DB clear. + /// # fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) { T::RejectOrigin::ensure_origin(origin)?; let proposal = >::take(proposal_id).ok_or("No proposal at that index")?; @@ -160,6 +172,12 @@ decl_module! { /// Approve a proposal. At a later time, the proposal will be allocated to the beneficiary /// and the original deposit will be returned. + /// + /// # + /// - O(1). + /// - Limited storage reads. + /// - One DB change. + /// # fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) { T::ApproveOrigin::ensure_origin(origin)?; -- GitLab From 03e786669d0556ba44c889e1ee141dbb0dfaa9e2 Mon Sep 17 00:00:00 2001 From: Alexander Koz Date: Wed, 12 Jun 2019 11:48:27 +0300 Subject: [PATCH 106/140] srml-assets: AssetID should be generic parameter (#2838) * improved srml-assets: AssetId is generic type-parameter now. * rem already imported Codec; use primitives::One instead into-convertion. --- srml/assets/src/lib.rs | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index 3f7c1b3efc..e0a99b7d16 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -123,6 +123,7 @@ use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage, ensure}; use primitives::traits::{Member, SimpleArithmetic, Zero, StaticLookup}; use system::ensure_signed; +use primitives::traits::One; /// The module configuration trait. pub trait Trait: system::Trait { @@ -131,9 +132,10 @@ pub trait Trait: system::Trait { /// The units in which we record balances. type Balance: Member + Parameter + SimpleArithmetic + Default + Copy; -} -type AssetId = u32; + /// The arithmetic type of asset identifier. + type AssetId: Parameter + SimpleArithmetic + Default + Copy; +} decl_module! { pub struct Module for enum Call where origin: T::Origin { @@ -145,7 +147,7 @@ decl_module! { let origin = ensure_signed(origin)?; let id = Self::next_asset_id(); - >::mutate(|id| *id += 1); + >::mutate(|id| *id += One::one()); >::insert((id, origin.clone()), total); >::insert(id, total); @@ -155,7 +157,7 @@ decl_module! { /// Move some assets from one holder to another. fn transfer(origin, - #[compact] id: AssetId, + #[compact] id: T::AssetId, target: ::Source, #[compact] amount: T::Balance ) { @@ -172,7 +174,7 @@ decl_module! { } /// Destroy any assets of `id` owned by `origin`. - fn destroy(origin, #[compact] id: AssetId) { + fn destroy(origin, #[compact] id: T::AssetId) { let origin = ensure_signed(origin)?; let balance = >::take((id, origin.clone())); ensure!(!balance.is_zero(), "origin balance should be non-zero"); @@ -184,7 +186,10 @@ decl_module! { } decl_event!( - pub enum Event where ::AccountId, ::Balance { + pub enum Event + where ::AccountId, + ::Balance, + ::AssetId { /// Some assets were issued. Issued(AssetId, AccountId, Balance), /// Some assets were transferred. @@ -197,11 +202,11 @@ decl_event!( decl_storage! { trait Store for Module as Assets { /// The number of units of assets held by any given account. - Balances: map (AssetId, T::AccountId) => T::Balance; + Balances: map (T::AssetId, T::AccountId) => T::Balance; /// The next asset identifier up for grabs. - NextAssetId get(next_asset_id): AssetId; + NextAssetId get(next_asset_id): T::AssetId; /// The total unit supply of an asset. - TotalSupply: map AssetId => T::Balance; + TotalSupply: map T::AssetId => T::Balance; } } @@ -210,12 +215,12 @@ impl Module { // Public immutables /// Get the asset `id` balance of `who`. - pub fn balance(id: AssetId, who: T::AccountId) -> T::Balance { + pub fn balance(id: T::AssetId, who: T::AccountId) -> T::Balance { >::get((id, who)) } /// Get the total supply of an asset `id`. - pub fn total_supply(id: AssetId) -> T::Balance { + pub fn total_supply(id: T::AssetId) -> T::Balance { >::get(id) } } @@ -260,6 +265,7 @@ mod tests { impl Trait for Test { type Event = (); type Balance = u64; + type AssetId = u32; } type Assets = Module; -- GitLab From 56b0273fd48b4e742e9da7317bc8e132a740b684 Mon Sep 17 00:00:00 2001 From: Kian Peymani Date: Wed, 12 Jun 2019 14:38:30 +0200 Subject: [PATCH 107/140] Per-transaction weight for srml (#2799) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * debug checkpoint. * new * Worked. * Worked and weight propagated to executive. * Works with some tests. * Cleanup debug prints. * More cleanup. * Undo more logs. * Undo a few more. * Fix build. * Allow len to be used in weight calculation. * Remove noop function from dispath. * Cleanup. * Unify traits. * Update docs and nits. * line width * Update core/sr-primitives/src/weights.rs Co-Authored-By: Bastian Köcher * Update core/sr-primitives/src/weights.rs Co-Authored-By: Bastian Köcher * Update core/sr-primitives/src/weights.rs Co-Authored-By: Bastian Köcher * Update core/sr-primitives/src/weights.rs Co-Authored-By: Amar Singh * Update srml/example/src/lib.rs Co-Authored-By: Bastian Köcher * Final cleanup. * Fix build. --- core/consensus/rhd/src/lib.rs | 3 + core/primitives/src/storage.rs | 3 - .../src/generic/checked_extrinsic.rs | 13 +- core/sr-primitives/src/lib.rs | 1 + core/sr-primitives/src/testing.rs | 7 + core/sr-primitives/src/weights.rs | 76 +++++++++++ core/state-machine/src/lib.rs | 1 - node/runtime/src/lib.rs | 2 +- srml/democracy/src/lib.rs | 2 +- srml/example/Cargo.toml | 2 +- srml/example/src/lib.rs | 21 ++- srml/executive/src/lib.rs | 67 ++++++--- srml/staking/src/lib.rs | 1 + srml/support/src/dispatch.rs | 127 +++++++++++++++--- srml/system/src/lib.rs | 16 +-- 15 files changed, 288 insertions(+), 54 deletions(-) create mode 100644 core/sr-primitives/src/weights.rs diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index ca4b9120eb..4a3e03759b 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -32,6 +32,9 @@ #![cfg(feature="rhd")] // FIXME #1020 doesn't compile +// NOTE: this is the legacy constant used for transaction size. No longer used except +// for the rhd code which is not updated. Placed here for compatibility. +const MAX_TRANSACTIONS_SIZE: u32 = 4 * 1024 * 1024; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; diff --git a/core/primitives/src/storage.rs b/core/primitives/src/storage.rs index 4746d230d0..bf3c19573d 100644 --- a/core/primitives/src/storage.rs +++ b/core/primitives/src/storage.rs @@ -73,9 +73,6 @@ pub mod well_known_keys { /// Current extrinsic index (u32) is stored under this key. pub const EXTRINSIC_INDEX: &'static [u8] = b":extrinsic_index"; - /// Sum of all lengths of executed extrinsics (u32). - pub const ALL_EXTRINSICS_LEN: &'static [u8] = b":all_extrinsics_len"; - /// Changes trie configuration is stored under this key. pub const CHANGES_TRIE_CONFIG: &'static [u8] = b":changes_trie"; diff --git a/core/sr-primitives/src/generic/checked_extrinsic.rs b/core/sr-primitives/src/generic/checked_extrinsic.rs index c0548c26e5..ee43b3af2e 100644 --- a/core/sr-primitives/src/generic/checked_extrinsic.rs +++ b/core/sr-primitives/src/generic/checked_extrinsic.rs @@ -18,6 +18,7 @@ //! stage. use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay}; +use crate::weights::{Weighable, Weight}; /// Definition of something that the external world might want to say; its /// existence implies that it has been checked and is good, particularly with @@ -32,8 +33,7 @@ pub struct CheckedExtrinsic { pub function: Call, } -impl traits::Applyable - for CheckedExtrinsic +impl traits::Applyable for CheckedExtrinsic where AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, @@ -55,3 +55,12 @@ where (self.function, self.signed.map(|x| x.0)) } } + +impl Weighable for CheckedExtrinsic +where + Call: Weighable, +{ + fn weight(&self, len: usize) -> Weight { + self.function.weight(len) + } +} diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 55e03e47f3..56525991ae 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -38,6 +38,7 @@ use codec::{Encode, Decode}; #[cfg(feature = "std")] pub mod testing; +pub mod weights; pub mod traits; use traits::{SaturatedConversion, UniqueSaturatedInto}; diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index 18c65d011e..f9061d99dc 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -20,6 +20,7 @@ use serde::{Serialize, Serializer, Deserialize, de::Error as DeError, Deserializ use std::{fmt::Debug, ops::Deref, fmt}; use crate::codec::{Codec, Encode, Decode}; use crate::traits::{self, Checkable, Applyable, BlakeTwo256, Convert}; +use crate::weights::{Weighable, Weight}; use crate::generic::DigestItem as GenDigestItem; pub use substrate_primitives::H256; use substrate_primitives::U256; @@ -239,3 +240,9 @@ impl Applyable for TestXt where (self.2, self.0) } } +impl Weighable for TestXt { + fn weight(&self, len: usize) -> Weight { + // for testing: weight == size. + len as Weight + } +} diff --git a/core/sr-primitives/src/weights.rs b/core/sr-primitives/src/weights.rs new file mode 100644 index 0000000000..3443992c73 --- /dev/null +++ b/core/sr-primitives/src/weights.rs @@ -0,0 +1,76 @@ +// 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 transaction weighting. +//! +//! Each dispatch function within `decl_module!` can now have an optional +//! `#[weight = $x]` attribute. $x can be any object that implements the +//! `Weighable` trait. By default, All transactions are annotated by +//! `#[weight = TransactionWeight::default()]`. +//! +//! Note that the decl_module macro _cannot_ enforce this and will simply fail +//! if an invalid struct is passed in. + +/// The final type that each `#[weight = $x:expr]`'s +/// expression must evaluate to. +pub type Weight = u32; + +/// A `Call` enum (aka transaction) that can be weighted using the custom weight attribute of +/// its dispatchable functions. Is implemented by default in the `decl_module!`. +/// +/// Both the outer Call enum and the per-module individual ones will implement this. +/// The outer enum simply calls the inner ones based on call type. +pub trait Weighable { + /// Return the weight of this call. + /// The `len` argument is the encoded length of the transaction/call. + fn weight(&self, len: usize) -> Weight; +} + +/// Default type used as the weight representative in a `#[weight = x]` attribute. +/// +/// A user may pass in any other type that implements [`Weighable`]. If not, the `Default` +/// implementation of [`TransactionWeight`] is used. +pub enum TransactionWeight { + /// Basic weight (base, byte). + /// The values contained are the base weight and byte weight respectively. + Basic(Weight, Weight), + /// Maximum fee. This implies that this transaction _might_ get included but + /// no more transaction can be added. This can be done by setting the + /// implementation to _maximum block weight_. + Max, + /// Free. The transaction does not increase the total weight + /// (i.e. is not included in weight calculation). + Free, +} + +impl Weighable for TransactionWeight { + fn weight(&self, len: usize) -> Weight { + match self { + TransactionWeight::Basic(base, byte) => base + byte * len as Weight, + TransactionWeight::Max => 3 * 1024 * 1024, + TransactionWeight::Free => 0, + } + } +} + +impl Default for TransactionWeight { + fn default() -> Self { + // This implies that the weight is currently equal to tx-size, nothing more + // for all substrate transactions that do NOT explicitly annotate weight. + // TODO #2431 needs to be updated with proper max values. + TransactionWeight::Basic(0, 1) + } +} diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index 93d70423d5..2c98cc8a30 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -1062,7 +1062,6 @@ mod tests { ).execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( ExecutionManager::Both(|we, _ne| { consensus_failed = true; - println!("HELLO!"); we }), true, diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 1c9c0ca4fd..25dbc6f205 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,7 +58,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 92, + spec_version: 93, impl_version: 94, apis: RUNTIME_API_VERSIONS, }; diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index b6d032d791..6af6798b13 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . //! Democratic system: Handles administration of general stakeholder voting. - +#![recursion_limit="128"] #![cfg_attr(not(feature = "std"), no_std)] use rstd::prelude::*; diff --git a/srml/example/Cargo.toml b/srml/example/Cargo.toml index 7601a799f8..44a6a85e47 100644 --- a/srml/example/Cargo.toml +++ b/srml/example/Cargo.toml @@ -10,11 +10,11 @@ parity-codec = { version = "3.3", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } balances = { package = "srml-balances", path = "../balances", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } [dev-dependencies] sr-io = { path = "../../core/sr-io" } substrate-primitives = { path = "../../core/primitives" } -sr-primitives = { path = "../../core/sr-primitives" } [features] default = ["std"] diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index 33c023ee8a..be441a3e57 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -16,7 +16,7 @@ //! # Example Module //! -//! +//! //! The Example: A simple example of a runtime module demonstrating //! concepts, APIs and structures common to most runtime modules. //! @@ -64,7 +64,7 @@ //! //! \## Overview //! -//! +//! //! // Short description of module purpose. //! // Links to Traits that should be implemented. //! // What this module is for. @@ -205,7 +205,7 @@ //! //! \```rust //! use ; -//! +//! //! pub trait Trait: ::Trait { } //! \``` //! @@ -251,6 +251,7 @@ use srml_support::{StorageValue, dispatch::Result, decl_module, decl_storage, decl_event}; use system::ensure_signed; +use sr_primitives::weights::TransactionWeight; /// Our module's configuration trait. All our types and consts go in here. If the /// module is dependent on specific other modules, then their configuration traits @@ -388,6 +389,20 @@ decl_module! { // no progress. // // If you don't respect these rules, it is likely that your chain will be attackable. + // + // Each transaction can optionally indicate a weight. The weight is passed in as a + // custom attribute and the value can be anything that implements the `Weighable` + // trait. Most often using substrate's default `TransactionWeight` is enough for you. + // + // A basic weight is a tuple of `(base_weight, byte_weight)`. Upon including each transaction + // in a block, the final weight is calculated as `base_weight + byte_weight * tx_size`. + // If this value, added to the weight of all included transactions, exceeds `MAX_TRANSACTION_WEIGHT`, + // the transaction is not included. If no weight attribute is provided, the `::default()` + // implementation of `TransactionWeight` is used. + // + // The example below showcases a transaction which is relatively costly, but less dependent on + // the input, hence `byte_weight` is configured smaller. + #[weight = TransactionWeight::Basic(100_000, 10)] fn accumulate_dummy(origin, increase_by: T::Balance) -> Result { // This is a public call, so we ensure that the origin is some signed account. let _sender = ensure_signed(origin)?; diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index d1c22fcb6a..3707716183 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -82,14 +82,15 @@ use primitives::traits::{ OnInitialize, Digest, NumberFor, Block as BlockT, OffchainWorker, ValidateUnsigned, DigestItem, }; +use primitives::weights::Weighable; +use primitives::{ApplyOutcome, ApplyError}; +use primitives::transaction_validity::{TransactionValidity, TransactionPriority, TransactionLongevity}; use srml_support::{Dispatchable, traits::MakePayment}; use parity_codec::{Codec, Encode}; use system::extrinsics_root; -use primitives::{ApplyOutcome, ApplyError}; -use primitives::transaction_validity::{TransactionValidity, TransactionPriority, TransactionLongevity}; mod internal { - pub const MAX_TRANSACTIONS_SIZE: u32 = 4 * 1024 * 1024; + pub const MAX_TRANSACTIONS_WEIGHT: u32 = 4 * 1024 * 1024; pub enum ApplyError { BadSignature(&'static str), @@ -125,9 +126,11 @@ impl< > ExecuteBlock for Executive where Block::Extrinsic: Checkable + Codec, - >::Checked: Applyable, + >::Checked: + Applyable + Weighable, <>::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) { @@ -145,9 +148,11 @@ impl< > Executive where Block::Extrinsic: Checkable + Codec, - >::Checked: Applyable, + >::Checked: + Applyable + Weighable, <>::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. @@ -157,7 +162,12 @@ where Self::initialize_block_impl(header.number(), header.parent_hash(), header.extrinsics_root(), &digests); } - fn initialize_block_impl(block_number: &System::BlockNumber, parent_hash: &System::Hash, extrinsics_root: &System::Hash, digest: &System::Digest) { + fn initialize_block_impl( + block_number: &System::BlockNumber, + parent_hash: &System::Hash, + extrinsics_root: &System::Hash, + digest: &System::Digest + ) { >::initialize(block_number, parent_hash, extrinsics_root, digest); >::on_initialize(*block_number); } @@ -168,7 +178,8 @@ where // 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(), + n > System::BlockNumber::zero() + && >::block_hash(n - System::BlockNumber::one()) == *header.parent_hash(), "Parent hash should be valid." ); @@ -195,6 +206,7 @@ where /// 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 @@ -244,12 +256,17 @@ where } /// 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 { + fn apply_extrinsic_with_len( + uxt: Block::Extrinsic, + encoded_len: usize, + to_note: Option> + ) -> result::Result { // 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. - if >::all_extrinsics_len() + encoded_len as u32 > internal::MAX_TRANSACTIONS_SIZE { + // Check the weight of the block if that extrinsic is applied. + let weight = xt.weight(encoded_len); + if >::all_extrinsics_weight() + weight > internal::MAX_TRANSACTIONS_WEIGHT { return Err(internal::ApplyError::FullBlock); } @@ -259,7 +276,6 @@ where if index != &expected_index { return Err( if index < &expected_index { internal::ApplyError::Stale } else { internal::ApplyError::Future } ) } - // pay any fees Payment::make_payment(sender, encoded_len).map_err(|_| internal::ApplyError::CantPay)?; @@ -534,27 +550,27 @@ mod tests { } #[test] - fn block_size_limit_enforced() { + fn block_weight_limit_enforced() { let run_test = |should_fail: bool| { let mut t = new_test_ext(); let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(33, 69)); let xt2 = primitives::testing::TestXt(Some(1), 1, Call::transfer(33, 69)); let encoded = xt2.encode(); - let len = if should_fail { (internal::MAX_TRANSACTIONS_SIZE - 1) as usize } else { encoded.len() }; + let len = if should_fail { (internal::MAX_TRANSACTIONS_WEIGHT - 1) as usize } else { encoded.len() }; with_externalities(&mut t, || { Executive::initialize_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default())); - assert_eq!(>::all_extrinsics_len(), 0); + assert_eq!(>::all_extrinsics_weight(), 0); Executive::apply_extrinsic(xt).unwrap(); let res = Executive::apply_extrinsic_with_len(xt2, len, Some(encoded)); if should_fail { assert!(res.is_err()); - assert_eq!(>::all_extrinsics_len(), 28); + assert_eq!(>::all_extrinsics_weight(), 28); assert_eq!(>::extrinsic_index(), Some(1)); } else { assert!(res.is_ok()); - assert_eq!(>::all_extrinsics_len(), 56); + assert_eq!(>::all_extrinsics_weight(), 56); assert_eq!(>::extrinsic_index(), Some(2)); } }); @@ -564,6 +580,21 @@ mod tests { run_test(true); } + #[test] + fn default_block_weight() { + let xt = primitives::testing::TestXt(None, 0, Call::set_balance(33, 69, 69)); + let mut t = new_test_ext(); + with_externalities(&mut t, || { + Executive::apply_extrinsic(xt.clone()).unwrap(); + Executive::apply_extrinsic(xt.clone()).unwrap(); + Executive::apply_extrinsic(xt.clone()).unwrap(); + assert_eq!( + >::all_extrinsics_weight(), + 3 * (0 /*base*/ + 22 /*len*/ * 1 /*byte*/) + ); + }); + } + #[test] fn validate_unsigned() { let xt = primitives::testing::TestXt(None, 0, Call::set_balance(33, 69, 69)); diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index e76b73a749..0754985a6f 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -239,6 +239,7 @@ //! - [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. +#![recursion_limit="128"] #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(all(feature = "bench", test), feature(test))] diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index f2db609dc3..452e94227c 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -23,6 +23,7 @@ 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}; +pub use sr_primitives::weights::{TransactionWeight, Weighable, Weight}; /// A type that cannot be instantiated. pub enum Never {} @@ -200,8 +201,7 @@ impl Parameter for T where T: Codec + Clone + Eq {} /// [`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 - // form) + // Entry point #1. ( $(#[$attr:meta])* pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?> @@ -221,6 +221,7 @@ macro_rules! decl_module { $($t)* ); }; + // Entry point #2. ( $(#[$attr:meta])* pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?> @@ -241,6 +242,7 @@ macro_rules! decl_module { ); }; + // Normalization expansions. Fills the defaults. (@normalize $(#[$attr:meta])* pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?> @@ -402,9 +404,13 @@ macro_rules! decl_module { $($rest)* ); }; + // This puts the function statement into the [], decreasing `$rest` and moving toward finishing the parse. (@normalize $(#[$attr:meta])* - pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?> + pub struct $mod_type:ident< + $trait_instance:ident: + $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)? + > for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident { $( $deposit_event:tt )* } { $( $on_initialize:tt )* } @@ -412,6 +418,7 @@ macro_rules! decl_module { { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* + #[weight = $weight:expr] $fn_vis:vis fn $fn_name:ident( $origin:ident $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)* ) $( -> $result:ty )* { $( $impl:tt )* } @@ -419,7 +426,9 @@ macro_rules! decl_module { ) => { $crate::decl_module!(@normalize $(#[$attr])* - pub struct $mod_type<$trait_instance: $trait_name$(, $instance: $instantiable $(= $module_default_instance)?)?> + pub struct $mod_type< + $trait_instance: $trait_name$(, $instance: $instantiable $(= $module_default_instance)?)? + > for enum $call_type where origin: $origin_type, system = $system { $( $deposit_event )* } { $( $on_initialize )* } @@ -428,6 +437,7 @@ macro_rules! decl_module { [ $($t)* $(#[doc = $doc_attr])* + #[weight = $weight] $fn_vis fn $fn_name( $origin $( , $(#[$codec_attr])* $param_name : $param )* ) $( -> $result )* { $( $impl )* } @@ -436,6 +446,45 @@ macro_rules! decl_module { $($rest)* ); }; + // Add #[weight] if none is defined. + (@normalize + $(#[$attr:meta])* + pub struct $mod_type:ident< + $trait_instance:ident: + $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)? + > + for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident + { $( $deposit_event:tt )* } + { $( $on_initialize:tt )* } + { $( $on_finalize:tt )* } + { $( $offchain:tt )* } + [ $($t:tt)* ] + $(#[doc = $doc_attr:tt])* + $fn_vis:vis fn $fn_name:ident( + $from:ident $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)* + ) $( -> $result:ty )* { $( $impl:tt )* } + $($rest:tt)* + ) => { + $crate::decl_module!(@normalize + $(#[$attr])* + pub struct $mod_type< + $trait_instance: $trait_name$(, $instance: $instantiable $(= $module_default_instance)?)? + > + for enum $call_type where origin: $origin_type, system = $system + { $( $deposit_event )* } + { $( $on_initialize )* } + { $( $on_finalize )* } + { $( $offchain )* } + [ $($t)* ] + $(#[doc = $doc_attr])* + #[weight = $crate::dispatch::TransactionWeight::default()] + $fn_vis fn $fn_name( + $from $(, $(#[$codec_attr])* $param_name : $param )* + ) $( -> $result )* { $( $impl )* } + $($rest)* + ); + }; + // Ignore any ident which is not `origin` with type `T::Origin`. (@normalize $(#[$attr:meta])* pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?> @@ -446,6 +495,7 @@ macro_rules! decl_module { { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* + $(#[weight = $weight:expr])? $fn_vis:vis fn $fn_name:ident( $origin:ident : T::Origin $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)* ) $( -> $result:ty )* { $( $impl:tt )* } @@ -457,6 +507,7 @@ macro_rules! decl_module { not use the `T::Origin` type.)" ) }; + // Ignore any ident which is `origin` but has a type, regardless of the type token itself. (@normalize $(#[$attr:meta])* pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?> @@ -467,6 +518,7 @@ macro_rules! decl_module { { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* + $(#[weight = $weight:expr])? $fn_vis:vis fn $fn_name:ident( origin : $origin:ty $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)* ) $( -> $result:ty )* { $( $impl:tt )* } @@ -478,6 +530,7 @@ macro_rules! decl_module { not use the `T::Origin` type.)" ) }; + // Add root if no origin is defined. (@normalize $(#[$attr:meta])* pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?> @@ -488,6 +541,7 @@ macro_rules! decl_module { { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* + $(#[weight = $weight:expr])? $fn_vis:vis fn $fn_name:ident( $( $(#[$codec_attr:ident])* $param_name:ident : $param:ty),* ) $( -> $result:ty )* { $( $impl:tt )* } @@ -501,17 +555,18 @@ macro_rules! decl_module { { $( $on_initialize )* } { $( $on_finalize )* } { $( $offchain )* } - [ - $($t)* - $(#[doc = $doc_attr])* - $fn_vis fn $fn_name( - root $( , $(#[$codec_attr])* $param_name : $param )* - ) $( -> $result )* { $( $impl )* } - { $($instance: $instantiable)? } - ] + [ $($t)* ] + + $(#[doc = $doc_attr])* + $(#[weight = $weight])? + $fn_vis fn $fn_name( + root $( , $(#[$codec_attr])* $param_name : $param )* + ) $( -> $result )* { $( $impl )* } + $($rest)* ); }; + // Last normalize step. Triggers `@imp` expansion which is the real expansion. (@normalize $(#[$attr:meta])* pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?> @@ -686,6 +741,7 @@ macro_rules! decl_module { {} }; + // Expansion for root dispatch functions with no specified result type. (@impl_function $module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>; $origin_ty:ty; @@ -700,6 +756,7 @@ macro_rules! decl_module { } }; + // Expansion for root dispatch functions with explicit return types. (@impl_function $module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>; $origin_ty:ty; @@ -715,6 +772,7 @@ macro_rules! decl_module { } }; + // Expansion for _origin_ dispatch functions with no return type. (@impl_function $module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>; $origin_ty:ty; @@ -733,6 +791,7 @@ macro_rules! decl_module { } }; + // Expansion for _origin_ dispatch functions with explicit return type. (@impl_function $module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>; $origin_ty:ty; @@ -868,6 +927,7 @@ macro_rules! decl_module { for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident { $( $(#[doc = $doc_attr:tt])* + #[weight = $weight:expr] $fn_vis:vis fn $fn_name:ident( $from:ident $( , $(#[$codec_attr:ident])* $param_name:ident : $param:ty)* ) $( -> $result:ty )* { $( $impl:tt )* } @@ -908,7 +968,6 @@ macro_rules! decl_module { $mod_type<$trait_instance: $trait_name $(, $instance: $instantiable)?>; $( $offchain )* } - $crate::decl_module! { @impl_deposit_event $mod_type<$trait_instance: $trait_name $(, $instance: $instantiable)?>; @@ -951,6 +1010,18 @@ macro_rules! decl_module { )* } + // Implement weight calculation function for Call + impl<$trait_instance: $trait_name $(, $instance: $instantiable)?> $crate::dispatch::Weighable + for $call_type<$trait_instance $(, $instance)?> + { + fn weight(&self, _len: usize) -> $crate::dispatch::Weight { + match self { + $( $call_type::$fn_name(..) => $crate::dispatch::Weighable::weight(&$weight, _len), )* + $call_type::__PhantomItem(_, _) => { unreachable!("__PhantomItem should never be used.") }, + } + } + } + // manual implementation of clone/eq/partialeq because using derive erroneously requires // clone/eq/partialeq from T. impl<$trait_instance: $trait_name $(, $instance: $instantiable)?> $crate::dispatch::Clone @@ -1072,14 +1143,19 @@ macro_rules! impl_outer_dispatch { $camelcase ( $crate::dispatch::CallableCallFor<$camelcase> ) ,)* } + impl $crate::dispatch::Weighable for $call_type { + fn weight(&self, len: usize) -> $crate::dispatch::Weight { + match self { + $( $call_type::$camelcase(call) => call.weight(len), )* + } + } + } impl $crate::dispatch::Dispatchable for $call_type { type Origin = $origin; type Trait = $call_type; fn dispatch(self, origin: $origin) -> $crate::dispatch::Result { match self { - $( - $call_type::$camelcase(call) => call.dispatch(origin), - )* + $( $call_type::$camelcase(call) => call.dispatch(origin), )* } } } @@ -1271,6 +1347,7 @@ mod tests { fn aux_0(_origin) -> Result { unreachable!() } fn aux_1(_origin, #[compact] _data: u32) -> Result { unreachable!() } fn aux_2(_origin, _data: i32, _data2: String) -> Result { unreachable!() } + #[weight = TransactionWeight::Basic(10, 100)] fn aux_3() -> Result { unreachable!() } fn aux_4(_data: i32) -> Result { unreachable!() } fn aux_5(_origin, _data: i32, #[compact] _data2: u32) -> Result { unreachable!() } @@ -1278,6 +1355,9 @@ mod tests { fn on_initialize(n: T::BlockNumber) { if n.into() == 42 { panic!("on_initialize") } } fn on_finalize(n: T::BlockNumber) { if n.into() == 42 { panic!("on_finalize") } } fn offchain_worker() {} + + #[weight = TransactionWeight::Max] + fn weighted() { unreachable!() } } } @@ -1342,6 +1422,11 @@ mod tests { ]), documentation: DecodeDifferent::Encode(&[]), }, + FunctionMetadata { + name: DecodeDifferent::Encode("weighted"), + arguments: DecodeDifferent::Encode(&[]), + documentation: DecodeDifferent::Encode(&[]), + }, ]; struct TraitImpl {} @@ -1396,4 +1481,14 @@ mod tests { fn on_finalize_should_work() { as OnFinalize>::on_finalize(42); } + + #[test] + fn weight_should_attach_to_call_enum() { + // max weight. not dependent on input. + assert_eq!(Call::::weighted().weight(100), 3 * 1024 * 1024); + // default weight. + assert_eq!(Call::::aux_0().weight(5), 5 /*tx-len*/); + // custom basic + assert_eq!(Call::::aux_3().weight(5), 10 + 100 * 5 ); + } } diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index 276b389dc1..61db997cfc 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -315,8 +315,8 @@ decl_storage! { pub AccountNonce get(account_nonce): map T::AccountId => T::Index; /// Total extrinsics count for the current block. ExtrinsicCount: Option; - /// Total length in bytes for all extrinsics put together, for the current block. - AllExtrinsicsLen: Option; + /// Total weight for all extrinsics put together, for the current block. + AllExtrinsicsWeight: 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 an extrinsic's index to its data). @@ -530,9 +530,9 @@ impl Module { >::get().unwrap_or_default() } - /// Gets a total length of all executed extrinsics. - pub fn all_extrinsics_len() -> u32 { - >::get().unwrap_or_default() + /// Gets a total weight of all executed extrinsics. + pub fn all_extrinsics_weight() -> u32 { + >::get().unwrap_or_default() } /// Start the execution of a particular block. @@ -563,7 +563,7 @@ impl Module { /// Remove temporary "environment" entries in storage. pub fn finalize() -> T::Header { >::kill(); - >::kill(); + >::kill(); let number = >::take(); let parent_hash = >::take(); @@ -714,10 +714,10 @@ impl Module { }.into()); let next_extrinsic_index = Self::extrinsic_index().unwrap_or_default() + 1u32; - let total_length = encoded_len.saturating_add(Self::all_extrinsics_len()); + let total_length = encoded_len.saturating_add(Self::all_extrinsics_weight()); storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &next_extrinsic_index); - >::put(&total_length); + >::put(&total_length); } /// To be called immediately after `note_applied_extrinsic` of the last extrinsic of the block -- GitLab From 698e5af4a56b229773082e0a256acecaf7727c3e Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 12 Jun 2019 14:56:31 +0200 Subject: [PATCH 108/140] Refactoring: Remove ExtraVerification in the import queue (#2844) * Remove ExtraVerification in the import queue * Fix Babe * Fix node-template --- core/consensus/aura/src/lib.rs | 39 ++++++-------------------------- core/consensus/babe/src/lib.rs | 33 ++++----------------------- core/consensus/common/src/lib.rs | 14 ------------ node-template/src/service.rs | 8 +++---- node/cli/src/service.rs | 8 +++---- 5 files changed, 18 insertions(+), 84 deletions(-) diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index fa878ef104..32d49614c4 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -68,7 +68,7 @@ use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS use slots::{CheckedHeader, SlotData, SlotWorker, SlotInfo, SlotCompatible, slot_now, check_equivocation}; pub use aura_primitives::*; -pub use consensus_common::{SyncOracle, ExtraVerification}; +pub use consensus_common::SyncOracle; pub use digest::CompatibleDigestItem; mod digest; @@ -446,14 +446,13 @@ fn check_header( } /// A verifier for Aura blocks. -pub struct AuraVerifier { +pub struct AuraVerifier { client: Arc, - extra: E, phantom: PhantomData

, inherent_data_providers: inherents::InherentDataProviders, } -impl AuraVerifier +impl AuraVerifier where P: Send + Sync + 'static { fn check_inherents( @@ -505,24 +504,11 @@ impl AuraVerifier } } -/// 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(()) - } -} - #[forbid(deprecated)] -impl Verifier for AuraVerifier where +impl Verifier for AuraVerifier where C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore, C::Api: BlockBuilderApi, DigestItemFor: CompatibleDigestItem

+ DigestItem>, - E: ExtraVerification, P: Pair + Send + Sync + 'static, P::Public: Send + Sync + Hash + Eq + Clone + Decode + Encode + Debug + AsRef + 'static, P::Signature: Encode + Decode, @@ -543,11 +529,6 @@ impl Verifier for AuraVerifier where 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 @@ -588,8 +569,6 @@ impl Verifier for AuraVerifier where trace!(target: "aura", "Checked {:?}; importing.", pre_header); telemetry!(CONSENSUS_TRACE; "aura.checked_and_importing"; "pre_header" => ?pre_header); - extra_verification.into_future().wait()?; - let new_authorities = pre_header.digest() .log(DigestItem::as_authorities_change) .map(|digest| digest.to_vec()); @@ -618,7 +597,7 @@ impl Verifier for AuraVerifier where } } -impl Authorities for AuraVerifier where +impl Authorities for AuraVerifier where B: Block, C: ProvideRuntimeApi + ProvideCache, C::Api: AuthoritiesApi, @@ -697,21 +676,19 @@ fn register_aura_inherent_data_provider( } /// Start an import queue for the Aura consensus algorithm. -pub fn import_queue( +pub fn import_queue( 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 + AuxStore, C::Api: BlockBuilderApi + AuthoritiesApi, DigestItemFor: CompatibleDigestItem

+ DigestItem>, - E: 'static + ExtraVerification, P: Pair + Send + Sync + 'static, P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode + AsRef, P::Signature: Encode + Decode, @@ -722,7 +699,6 @@ pub fn import_queue( let verifier = Arc::new( AuraVerifier { client: client.clone(), - extra, inherent_data_providers, phantom: PhantomData, } @@ -794,7 +770,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. @@ -821,7 +797,6 @@ mod tests { assert_eq!(slot_duration.get(), SLOT_DURATION); Arc::new(AuraVerifier { client, - extra: NothingExtra, inherent_data_providers, phantom: Default::default(), }) diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index f28c23de54..d1585947ce 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -31,7 +31,6 @@ use digest::CompatibleDigestItem; pub use digest::{BabePreDigest, BABE_VRF_PREFIX}; 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, @@ -522,14 +521,13 @@ fn check_header( } /// A verifier for Babe blocks. -pub struct BabeVerifier { +pub struct BabeVerifier { client: Arc, - extra: E, inherent_data_providers: inherents::InherentDataProviders, threshold: u64, } -impl BabeVerifier { +impl BabeVerifier { fn check_inherents( &self, block: B, @@ -554,23 +552,10 @@ impl BabeVerifier { } } -/// 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 +impl Verifier for BabeVerifier where C: ProvideRuntimeApi + Send + Sync + AuxStore, C::Api: BlockBuilderApi, DigestItemFor: CompatibleDigestItem + DigestItem, - E: ExtraVerification, Self: Authorities, { fn verify( @@ -601,11 +586,6 @@ impl Verifier for BabeVerifier where 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 @@ -645,8 +625,6 @@ impl Verifier for BabeVerifier where "babe.checked_and_importing"; "pre_header" => ?pre_header); - extra_verification.into_future().wait()?; - let new_authorities = pre_header.digest() .log(DigestItem::as_authorities_change) .map(|digest| digest.to_vec()); @@ -676,7 +654,7 @@ impl Verifier for BabeVerifier where } } -impl Authorities for BabeVerifier where +impl Authorities for BabeVerifier where B: Block, C: ProvideRuntimeApi + ProvideCache, C::Api: AuthoritiesApi, @@ -851,7 +829,7 @@ mod tests { impl TestNetFactory for BabeTestNet { type Specialization = DummySpecialization; - type Verifier = BabeVerifier; + type Verifier = BabeVerifier; type PeerData = (); /// Create new test network with peers and given config. @@ -880,7 +858,6 @@ mod tests { assert_eq!(config.get(), SLOT_DURATION); Arc::new(BabeVerifier { client, - extra: NothingExtra, inherent_data_providers, threshold: config.threshold(), }) diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index 140aa57901..6d43b6624a 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -126,20 +126,6 @@ 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/node-template/src/service.rs b/node-template/src/service.rs index 25e7db8dec..1de7bb4767 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -13,7 +13,7 @@ use substrate_service::{ error::{Error as ServiceError}, }; use basic_authorship::ProposerFactory; -use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; +use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration}; use futures::prelude::*; use substrate_client::{self as client, LongestChain}; use primitives::{ed25519::Pair, Pair as PairT}; @@ -99,14 +99,13 @@ construct_service_factory! { Self::Block, > { |config: &mut FactoryFullConfiguration , client: Arc>, _select_chain: Self::SelectChain| { - import_queue::<_, _, _, Pair>( + import_queue::<_, _, Pair>( SlotDuration::get_or_compute(&*client)?, client.clone(), None, None, None, client, - NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) } @@ -115,14 +114,13 @@ construct_service_factory! { Self::Block, > { |config: &mut FactoryFullConfiguration, client: Arc>| { - import_queue::<_, _, _, Pair>( + import_queue::<_, _, Pair>( SlotDuration::get_or_compute(&*client)?, client.clone(), None, None, None, client, - NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) } diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 1458392b0f..4fe74e4f9a 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -22,7 +22,7 @@ use std::sync::Arc; use std::time::Duration; use client::{self, LongestChain}; -use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; +use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use node_executor; use primitives::{Pair as PairT, ed25519}; @@ -167,14 +167,13 @@ construct_service_factory! { config.custom.grandpa_import_setup = Some((block_import.clone(), link_half)); - import_queue::<_, _, _, ed25519::Pair>( + import_queue::<_, _, ed25519::Pair>( slot_duration, block_import, Some(justification_import), None, None, client, - NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) }}, @@ -192,14 +191,13 @@ construct_service_factory! { let finality_proof_import = block_import.clone(); let finality_proof_request_builder = finality_proof_import.create_finality_proof_request_builder(); - import_queue::<_, _, _, ed25519::Pair>( + import_queue::<_, _, ed25519::Pair>( SlotDuration::get_or_compute(&*client)?, block_import, None, Some(finality_proof_import), Some(finality_proof_request_builder), client, - NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) }}, -- GitLab From bdb87ddab9062cf2d1269e90736cab633d28fe52 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 12 Jun 2019 21:32:52 +0200 Subject: [PATCH 109/140] Move the telemetry information to service (#2846) * Move the telemetry information to service * Proper exit --- Cargo.lock | 2 +- core/cli/Cargo.toml | 1 - core/cli/src/informant.rs | 52 ++------------------------------- core/service/Cargo.toml | 1 + core/service/src/lib.rs | 60 ++++++++++++++++++++++++++++++++++++++- 5 files changed, 63 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ef24acc3d5..a9d7945194 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3980,7 +3980,6 @@ dependencies = [ "substrate-service 2.0.0", "substrate-state-machine 2.0.0", "substrate-telemetry 2.0.0", - "sysinfo 0.8.5 (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.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4523,6 +4522,7 @@ dependencies = [ "substrate-telemetry 2.0.0", "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", + "sysinfo 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/core/cli/Cargo.toml b/core/cli/Cargo.toml index 54cde50d1a..6ca50ba5f8 100644 --- a/core/cli/Cargo.toml +++ b/core/cli/Cargo.toml @@ -21,7 +21,6 @@ futures = "0.1.17" fdlimit = "0.1" exit-future = "0.1" serde_json = "1.0" -sysinfo = "0.8.0" panic-handler = { package = "substrate-panic-handler", path = "../../core/panic-handler" } client = { package = "substrate-client", path = "../../core/client" } network = { package = "substrate-network", path = "../../core/network" } diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index 607ab9ae85..a6aca5edb0 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -22,10 +22,8 @@ use std::time; use futures::{Future, Stream}; use service::{Service, Components}; use tokio::runtime::TaskExecutor; -use sysinfo::{get_current_pid, ProcessExt, System, SystemExt}; use network::{SyncState, SyncProvider}; use client::{backend::Backend, BlockchainEvents}; -use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; use log::{info, warn}; use runtime_primitives::generic::BlockId; @@ -44,19 +42,14 @@ pub fn build(service: &Service) -> impl Future where C: Components { let network = service.network(); let client = service.client(); - let txpool = service.transaction_pool(); let mut last_number = None; let mut last_update = time::Instant::now(); - let mut sys = System::new(); - let self_pid = get_current_pid(); - let display_notifications = network.status().for_each(move |sync_status| { let info = client.info(); 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); last_update = time::Instant::now(); let (status, target) = match (sync_status.sync.state, sync_status.sync.best_seen_block) { @@ -65,7 +58,6 @@ where C: Components { (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed()), format!(", target=#{}", n)), }; last_number = Some(best_number); - let txpool_status = txpool.status(); 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(); @@ -83,39 +75,6 @@ where C: Components { TransferRateFormat(bandwidth_upload), ); - #[allow(deprecated)] - 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 = network.network_state(); - - telemetry!( - SUBSTRATE_INFO; - "system.interval"; - "network_state" => network_state, - "status" => format!("{}{}", status, target), - "peers" => num_peers, - "height" => best_number, - "best" => ?best_hash, - "txcount" => txpool_status.ready, - "cpu" => cpu_usage, - "memory" => memory, - "finalized_height" => finalized_number, - "finalized_hash" => ?info.chain.finalized_hash, - "bandwidth_download" => bandwidth_download, - "bandwidth_upload" => bandwidth_upload, - "used_state_cache_size" => used_state_cache_size, - ); - Ok(()) }); @@ -155,15 +114,8 @@ where C: Components { Ok(()) }); - let txpool = service.transaction_pool(); - let display_txpool_import = txpool.import_notification_stream().for_each(move |_| { - let status = txpool.status(); - telemetry!(SUBSTRATE_INFO; "txpool.import"; "ready" => status.ready, "future" => status.future); - Ok(()) - }); - - display_notifications.join3(display_block_import, display_txpool_import) - .map(|((), (), ())| ()) + display_notifications.join(display_block_import) + .map(|((), ())| ()) } fn speed(best_number: u64, last_number: Option, last_update: time::Instant) -> String { diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 471594aad8..21501286d4 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -15,6 +15,7 @@ tokio = "0.1.7" exit-future = "0.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +sysinfo = "0.8.0" target_info = "0.1" keystore = { package = "substrate-keystore", path = "../../core/keystore" } sr-io = { path = "../../core/sr-io" } diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 92ddcd0b58..d1e0067a62 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -31,7 +31,7 @@ use std::collections::HashMap; use futures::sync::mpsc; use parking_lot::Mutex; -use client::BlockchainEvents; +use client::{BlockchainEvents, backend::Backend}; use exit_future::Signal; use futures::prelude::*; use keystore::Store as Keystore; @@ -41,6 +41,8 @@ use primitives::Pair; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{Header, SaturatedConversion}; use substrate_executor::NativeExecutor; +use network::SyncProvider; +use sysinfo::{get_current_pid, ProcessExt, System, SystemExt}; use tel::{telemetry, SUBSTRATE_INFO}; pub use self::error::Error; @@ -305,11 +307,17 @@ impl Service { { // extrinsic notifications let network = Arc::downgrade(&network); + let transaction_pool_ = transaction_pool.clone(); let events = transaction_pool.import_notification_stream() .for_each(move |_| { if let Some(network) = network.upgrade() { network.trigger_repropagate(); } + let status = transaction_pool_.status(); + telemetry!(SUBSTRATE_INFO; "txpool.import"; + "ready" => status.ready, + "future" => status.future + ); Ok(()) }) .select(exit.clone()) @@ -318,6 +326,56 @@ impl Service { task_executor.spawn(events); } + // Periodically notify the telemetry. + let transaction_pool_ = transaction_pool.clone(); + let client_ = client.clone(); + let network_ = network.clone(); + let mut sys = System::new(); + let self_pid = get_current_pid(); + task_executor.spawn(network.status().for_each(move |sync_status| { + let info = client_.info(); + let best_number = info.chain.best_number.saturated_into::(); + let best_hash = info.chain.best_hash; + let num_peers = sync_status.num_peers; + let txpool_status = transaction_pool_.status(); + 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(); + + #[allow(deprecated)] + 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 = network_.network_state(); + + telemetry!( + SUBSTRATE_INFO; + "system.interval"; + "network_state" => network_state, + "peers" => num_peers, + "height" => best_number, + "best" => ?best_hash, + "txcount" => txpool_status.ready, + "cpu" => cpu_usage, + "memory" => memory, + "finalized_height" => finalized_number, + "finalized_hash" => ?info.chain.finalized_hash, + "bandwidth_download" => bandwidth_download, + "bandwidth_upload" => bandwidth_upload, + "used_state_cache_size" => used_state_cache_size, + ); + + Ok(()) + }).select(exit.clone()).then(|_| Ok(()))); // RPC let system_info = rpc::apis::system::SystemInfo { -- GitLab From b01bdda431f414b10c5945254a447798ebf9d2a4 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 13 Jun 2019 11:06:30 +0200 Subject: [PATCH 110/140] Subkey supports 24-word phrases (#2827) * Revamp crypto API and make seeds work better in subkey * Final tweaks * Update tests * line spacing * Avoid escapes in hex constants * Fix build * Another fix * More fixes * Minor nits --- core/consensus/babe/src/lib.rs | 6 +- core/consensus/slots/src/aux_schema.rs | 2 +- core/executor/src/wasm_executor.rs | 4 +- core/keystore/src/lib.rs | 4 +- core/primitives/src/crypto.rs | 68 +++++++++---- core/primitives/src/ed25519.rs | 109 +++++++++++---------- core/primitives/src/sr25519.rs | 63 ++++++------ node/cli/src/factory_impl.rs | 4 +- subkey/src/cli.yml | 6 ++ subkey/src/main.rs | 127 +++++++------------------ subkey/src/vanity.rs | 22 ++--- 11 files changed, 204 insertions(+), 211 deletions(-) diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index d1585947ce..3e98817e1d 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -976,7 +976,7 @@ mod tests { #[test] fn wrong_consensus_engine_id_rejected() { drop(env_logger::try_init()); - let sig = sr25519::Pair::generate().sign(b""); + let sig = sr25519::Pair::generate().0.sign(b""); let bad_seal: Item = DigestItem::Seal([0; 4], sig); assert!(bad_seal.as_babe_pre_digest().is_none()); assert!(bad_seal.as_babe_seal().is_none()) @@ -992,7 +992,7 @@ mod tests { #[test] fn sig_is_not_pre_digest() { drop(env_logger::try_init()); - let sig = sr25519::Pair::generate().sign(b""); + let sig = sr25519::Pair::generate().0.sign(b""); let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig); assert!(bad_seal.as_babe_pre_digest().is_none()); assert!(bad_seal.as_babe_seal().is_some()) @@ -1002,7 +1002,7 @@ mod tests { fn can_author_block() { drop(env_logger::try_init()); let randomness = &[]; - let pair = sr25519::Pair::generate(); + let (pair, _) = sr25519::Pair::generate(); let mut i = 0; loop { match claim_slot(randomness, i, &[], 0, &[pair.public()], &pair, u64::MAX / 10) { diff --git a/core/consensus/slots/src/aux_schema.rs b/core/consensus/slots/src/aux_schema.rs index ed96bf2e22..1af8b2da53 100644 --- a/core/consensus/slots/src/aux_schema.rs +++ b/core/consensus/slots/src/aux_schema.rs @@ -176,7 +176,7 @@ mod test { #[test] fn check_equivocation_works() { let client = test_client::new(); - let pair = sr25519::Pair::generate(); + let (pair, _seed) = sr25519::Pair::generate(); let public = pair.public(); let header1 = create_header(1); // @ slot 2 diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 920639c0a2..08bda16f4f 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -1379,7 +1379,7 @@ mod tests { fn ed25519_verify_should_work() { let mut ext = TestExternalities::::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let key = ed25519::Pair::from_seed(blake2_256(b"test")); + let key = ed25519::Pair::from_seed(&blake2_256(b"test")); let sig = key.sign(b"all ok!"); let mut calldata = vec![]; calldata.extend_from_slice(key.public().as_ref()); @@ -1405,7 +1405,7 @@ mod tests { fn sr25519_verify_should_work() { let mut ext = TestExternalities::::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let key = sr25519::Pair::from_seed(blake2_256(b"test")); + let key = sr25519::Pair::from_seed(&blake2_256(b"test")); let sig = key.sign(b"all ok!"); let mut calldata = vec![]; calldata.extend_from_slice(key.public().as_ref()); diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index 67cf2c8d32..c36c6504c0 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -71,7 +71,7 @@ impl Store { /// Generate a new key, placing it into the store. pub fn generate(&self, password: &str) -> Result { - let (pair, phrase) = Pair::generate_with_phrase(Some(password)); + let (pair, phrase, _) = Pair::generate_with_phrase(Some(password)); let mut file = File::create(self.key_file_path(&pair.public()))?; ::serde_json::to_writer(&file, &phrase)?; file.flush()?; @@ -95,7 +95,7 @@ impl Store { let file = File::open(path)?; let phrase: String = ::serde_json::from_reader(&file)?; - let pair = Pair::from_phrase(&phrase, Some(password)) + let (pair, _) = Pair::from_phrase(&phrase, Some(password)) .ok().ok_or(Error::InvalidPhrase)?; if &pair.public() != public { return Err(Error::InvalidPassword); diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index 9cd71bb9b2..9ddc9a93f7 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -18,6 +18,8 @@ //! Cryptographic utilities. // end::description[] +#[cfg(feature = "std")] +use rand::{RngCore, rngs::OsRng}; #[cfg(feature = "std")] use parity_codec::{Encode, Decode}; #[cfg(feature = "std")] @@ -294,7 +296,7 @@ pub trait Pair: Sized + 'static { /// The type used to (minimally) encode the data required to securely create /// a new key pair. - type Seed; + type Seed: Default + AsRef<[u8]> + AsMut<[u8]> + Clone; /// The type used to represent a signature. Can be created from a key pair and a message /// and verified with the message and a public key. @@ -307,7 +309,12 @@ pub trait Pair: Sized + 'static { /// /// This is only for ephemeral keys really, since you won't have access to the secret key /// for storage. If you want a persistent key pair, use `generate_with_phrase` instead. - fn generate() -> Self; + fn generate() -> (Self, Self::Seed) { + let mut csprng: OsRng = OsRng::new().expect("OS random generator works; qed"); + let mut seed = Self::Seed::default(); + csprng.fill_bytes(seed.as_mut()); + (Self::from_seed(&seed), seed) + } /// Generate new secure (random) key pair and provide the recovery phrase. /// @@ -315,10 +322,10 @@ pub trait Pair: Sized + 'static { /// /// This is generally slower than `generate()`, so prefer that unless you need to persist /// the key from the current session. - fn generate_with_phrase(password: Option<&str>) -> (Self, String); + fn generate_with_phrase(password: Option<&str>) -> (Self, String, Self::Seed); /// Returns the KeyPair from the English BIP39 seed `phrase`, or `None` if it's invalid. - fn from_phrase(phrase: &str, password: Option<&str>) -> Result; + fn from_phrase(phrase: &str, password: Option<&str>) -> Result<(Self, Self::Seed), SecretStringError>; /// Derive a child key from a series of given junctions. fn derive>(&self, path: Iter) -> Result; @@ -327,7 +334,7 @@ pub trait Pair: Sized + 'static { /// /// @WARNING: THIS WILL ONLY BE SECURE IF THE `seed` IS SECURE. If it can be guessed /// by an attacker then they can also derive your key. - fn from_seed(seed: Self::Seed) -> Self; + fn from_seed(seed: &Self::Seed) -> Self; /// Make a new key pair from secret seed material. The slice must be the correct size or /// it will return `None`. @@ -424,27 +431,54 @@ mod tests { impl Pair for TestPair { type Public = (); - type Seed = (); + type Seed = [u8; 0]; type Signature = (); type DeriveError = (); - fn generate() -> Self { TestPair::Generated } - fn generate_with_phrase(_password: Option<&str>) -> (Self, String) { (TestPair::GeneratedWithPhrase, "".into()) } - fn from_phrase(phrase: &str, password: Option<&str>) -> Result { - Ok(TestPair::GeneratedFromPhrase{ phrase: phrase.to_owned(), password: password.map(Into::into) }) + fn generate() -> (Self, ::Seed) { (TestPair::Generated, []) } + fn generate_with_phrase(_password: Option<&str>) -> (Self, String, ::Seed) { + (TestPair::GeneratedWithPhrase, "".into(), []) + } + fn from_phrase(phrase: &str, password: Option<&str>) + -> Result<(Self, ::Seed), SecretStringError> + { + Ok((TestPair::GeneratedFromPhrase { + phrase: phrase.to_owned(), + password: password.map(Into::into) + }, [])) } - fn derive>(&self, _path: Iter) -> Result { + fn derive>(&self, _path: Iter) + -> Result + { Err(()) } - fn from_seed(_seed: ::Seed) -> Self { TestPair::Seed(vec![]) } + fn from_seed(_seed: &::Seed) -> Self { TestPair::Seed(vec![]) } fn sign(&self, _message: &[u8]) -> Self::Signature { () } - fn verify, M: AsRef<[u8]>>(_sig: &Self::Signature, _message: M, _pubkey: P) -> bool { true } - fn verify_weak, M: AsRef<[u8]>>(_sig: &[u8], _message: M, _pubkey: P) -> bool { true } + fn verify, M: AsRef<[u8]>>( + _sig: &Self::Signature, + _message: M, + _pubkey: P + ) -> bool { true } + fn verify_weak, M: AsRef<[u8]>>( + _sig: &[u8], + _message: M, + _pubkey: P + ) -> bool { true } fn public(&self) -> Self::Public { () } - fn from_standard_components>(phrase: &str, password: Option<&str>, path: I) -> Result { - Ok(TestPair::Standard { phrase: phrase.to_owned(), password: password.map(ToOwned::to_owned), path: path.collect() }) + fn from_standard_components>( + phrase: &str, + password: Option<&str>, + path: I + ) -> Result { + Ok(TestPair::Standard { + phrase: phrase.to_owned(), + password: password.map(ToOwned::to_owned), + path: path.collect() + }) } - fn from_seed_slice(seed: &[u8]) -> Result { + fn from_seed_slice(seed: &[u8]) + -> Result + { Ok(TestPair::Seed(seed.to_owned())) } } diff --git a/core/primitives/src/ed25519.rs b/core/primitives/src/ed25519.rs index e593e997a4..26086816a3 100644 --- a/core/primitives/src/ed25519.rs +++ b/core/primitives/src/ed25519.rs @@ -29,8 +29,6 @@ use substrate_bip39::seed_from_entropy; #[cfg(feature = "std")] use bip39::{Mnemonic, Language, MnemonicType}; #[cfg(feature = "std")] -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}; @@ -355,46 +353,38 @@ impl TraitPair for Pair { type Signature = Signature; type DeriveError = DeriveError; - /// Generate new secure (random) key pair. - /// - /// This is only for ephemeral keys really, since you won't have access to the secret key - /// for storage. If you want a persistent key pair, use `generate_with_phrase` instead. - fn generate() -> Pair { - let mut seed: Seed = Default::default(); - rand::rngs::EntropyRng::new().fill(seed.as_mut()); - Self::from_seed(seed) - } - /// Generate new secure (random) key pair and provide the recovery phrase. /// /// You can recover the same key later with `from_phrase`. - fn generate_with_phrase(password: Option<&str>) -> (Pair, String) { + fn generate_with_phrase(password: Option<&str>) -> (Pair, String, Seed) { let mnemonic = Mnemonic::new(MnemonicType::Words12, Language::English); let phrase = mnemonic.phrase(); + let (pair, seed) = Self::from_phrase(phrase, password) + .expect("All phrases generated by Mnemonic are valid; qed"); ( - Self::from_phrase(phrase, password).expect("All phrases generated by Mnemonic are valid; qed"), + pair, phrase.to_owned(), + seed, ) } /// Generate key pair from given recovery phrase and password. - fn from_phrase(phrase: &str, password: Option<&str>) -> Result { + fn from_phrase(phrase: &str, password: Option<&str>) -> Result<(Pair, Seed), SecretStringError> { let big_seed = seed_from_entropy( Mnemonic::from_phrase(phrase, Language::English) .map_err(|_| SecretStringError::InvalidPhrase)?.entropy(), password.unwrap_or(""), ).map_err(|_| SecretStringError::InvalidSeed)?; - Self::from_seed_slice(&big_seed[0..32]) + let mut seed = Seed::default(); + seed.copy_from_slice(&big_seed[0..32]); + Self::from_seed_slice(&big_seed[0..32]).map(|x| (x, seed)) } /// Make a new key pair from secret seed material. /// /// You should never need to use this; generate(), generate_with_phrasee - fn from_seed(seed: Seed) -> Pair { - let secret = ed25519_dalek::SecretKey::from_bytes(&seed[..]) - .expect("seed has valid length; qed"); - let public = ed25519_dalek::PublicKey::from(&secret); - Pair(ed25519_dalek::Keypair { secret, public }) + fn from_seed(seed: &Seed) -> Pair { + Self::from_seed_slice(&seed[..]).expect("seed has valid length; qed") } /// Make a new key pair from secret seed material. The slice must be 32 bytes long or it @@ -402,13 +392,10 @@ impl TraitPair for Pair { /// /// You should never need to use this; generate(), generate_with_phrase fn from_seed_slice(seed_slice: &[u8]) -> Result { - if seed_slice.len() != 32 { - Err(SecretStringError::InvalidSeedLength) - } else { - let mut seed = [0u8; 32]; - seed.copy_from_slice(&seed_slice); - Ok(Self::from_seed(seed)) - } + let secret = ed25519_dalek::SecretKey::from_bytes(seed_slice) + .map_err(|_| SecretStringError::InvalidSeedLength)?; + let public = ed25519_dalek::PublicKey::from(&secret); + Ok(Pair(ed25519_dalek::Keypair { secret, public })) } /// Derive a child key from a series of given junctions. @@ -420,12 +407,18 @@ impl TraitPair for Pair { DeriveJunction::Hard(cc) => acc = derive_hard_junction(&acc, &cc), } } - Ok(Self::from_seed(acc)) + Ok(Self::from_seed(&acc)) } /// Generate a key from the phrase, password and derivation path. - fn from_standard_components>(phrase: &str, password: Option<&str>, path: I) -> Result { - Self::from_phrase(phrase, password)?.derive(path).map_err(|_| SecretStringError::InvalidPath) + fn from_standard_components>( + phrase: &str, + password: Option<&str>, + path: I + ) -> Result { + Self::from_phrase(phrase, password)?.0 + .derive(path) + .map_err(|_| SecretStringError::InvalidPath) } /// Get the public key. @@ -483,7 +476,7 @@ impl Pair { let mut padded_seed: Seed = [' ' as u8; 32]; let len = s.len().min(32); padded_seed[..len].copy_from_slice(&s.as_bytes()[..len]); - Self::from_seed(padded_seed) + Self::from_seed(&padded_seed) }) } } @@ -505,38 +498,52 @@ mod test { #[test] fn seed_and_derive_should_work() { let seed = hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60"); - let pair = Pair::from_seed(seed); + let pair = Pair::from_seed(&seed); assert_eq!(pair.seed(), &seed); let path = vec![DeriveJunction::Hard([0u8; 32])]; let derived = pair.derive(path.into_iter()).ok().unwrap(); - assert_eq!(derived.seed(), &hex!("ede3354e133f9c8e337ddd6ee5415ed4b4ffe5fc7d21e933f4930a3730e5b21c")); + assert_eq!( + derived.seed(), + &hex!("ede3354e133f9c8e337ddd6ee5415ed4b4ffe5fc7d21e933f4930a3730e5b21c") + ); } #[test] fn test_vector_should_work() { - let pair: Pair = Pair::from_seed(hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60")); + let pair = Pair::from_seed( + &hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60") + ); let public = pair.public(); - assert_eq!(public, Public::from_raw(hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"))); + assert_eq!(public, Public::from_raw( + hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a") + )); let message = b""; - let signature = Signature::from_raw(hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b")); + let signature = hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b"); + let signature = Signature::from_raw(signature); assert!(&pair.sign(&message[..]) == &signature); assert!(Pair::verify(&signature, &message[..], &public)); } #[test] fn test_vector_by_string_should_work() { - let pair: Pair = Pair::from_string("0x9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", None).unwrap(); + let pair = Pair::from_string( + "0x9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", + None + ).unwrap(); let public = pair.public(); - assert_eq!(public, Public::from_raw(hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"))); + assert_eq!(public, Public::from_raw( + hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a") + )); let message = b""; - let signature = Signature::from_raw(hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b")); + let signature = hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b"); + let signature = Signature::from_raw(signature); assert!(&pair.sign(&message[..]) == &signature); assert!(Pair::verify(&signature, &message[..], &public)); } #[test] fn generated_pair_should_work() { - let pair = Pair::generate(); + let (pair, _) = Pair::generate(); let public = pair.public(); let message = b"Something important"; let signature = pair.sign(&message[..]); @@ -546,9 +553,11 @@ mod test { #[test] fn seeded_pair_should_work() { - let pair = Pair::from_seed(*b"12345678901234567890123456789012"); + let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); - assert_eq!(public, Public::from_raw(hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee"))); + assert_eq!(public, Public::from_raw( + hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee") + )); let message = hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee00000000000000000200d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a4500000000000000"); let signature = pair.sign(&message[..]); println!("Correct signature: {:?}", signature); @@ -558,31 +567,31 @@ mod test { #[test] fn generate_with_phrase_recovery_possible() { - let (pair1, phrase) = Pair::generate_with_phrase(None); - let pair2 = Pair::from_phrase(&phrase, None).unwrap(); + let (pair1, phrase, _) = Pair::generate_with_phrase(None); + let (pair2, _) = Pair::from_phrase(&phrase, None).unwrap(); assert_eq!(pair1.public(), pair2.public()); } #[test] fn generate_with_password_phrase_recovery_possible() { - let (pair1, phrase) = Pair::generate_with_phrase(Some("password")); - let pair2 = Pair::from_phrase(&phrase, Some("password")).unwrap(); + let (pair1, phrase, _) = Pair::generate_with_phrase(Some("password")); + let (pair2, _) = Pair::from_phrase(&phrase, Some("password")).unwrap(); assert_eq!(pair1.public(), pair2.public()); } #[test] fn password_does_something() { - let (pair1, phrase) = Pair::generate_with_phrase(Some("password")); - let pair2 = Pair::from_phrase(&phrase, None).unwrap(); + let (pair1, phrase, _) = Pair::generate_with_phrase(Some("password")); + let (pair2, _) = Pair::from_phrase(&phrase, None).unwrap(); assert_ne!(pair1.public(), pair2.public()); } #[test] fn ss58check_roundtrip_works() { - let pair = Pair::from_seed(*b"12345678901234567890123456789012"); + let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); let s = public.to_ss58check(); println!("Correct: {}", s); diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index 876dcb7078..aa2db2dc12 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -21,8 +21,6 @@ //! for this to work. // end::description[] -#[cfg(feature = "std")] -use rand::rngs::OsRng; #[cfg(feature = "std")] use schnorrkel::{signing_context, Keypair, SecretKey, MiniSecretKey, PublicKey, derive::{Derivation, ChainCode, CHAIN_CODE_LENGTH} @@ -377,23 +375,14 @@ impl TraitPair for Pair { type Signature = Signature; type DeriveError = Infallible; - /// Generate new secure (random) key pair. - fn generate() -> Pair { - let mut csprng: OsRng = OsRng::new().expect("os random generator works; qed"); - let key_pair: Keypair = Keypair::generate(&mut csprng); - Pair(key_pair) - } - /// Make a new key pair from raw secret seed material. /// /// This is generated using schnorrkel's Mini-Secret-Keys. /// /// A MiniSecretKey is literally what Ed25519 calls a SecretKey, which is just 32 random bytes. - fn from_seed(seed: Seed) -> Pair { - let mini_key: MiniSecretKey = MiniSecretKey::from_bytes(&seed[..]) - .expect("32 bytes can always build a key; qed"); - let kp = mini_key.expand_to_keypair(); - Pair(kp) + fn from_seed(seed: &Seed) -> Pair { + Self::from_seed_slice(&seed[..]) + .expect("32 bytes can always build a key; qed") } /// Get the public key. @@ -420,22 +409,29 @@ impl TraitPair for Pair { } /// Generate a key from the phrase, password and derivation path. - fn from_standard_components>(phrase: &str, password: Option<&str>, path: I) -> Result { - Self::from_phrase(phrase, password)? + fn from_standard_components>( + phrase: &str, + password: Option<&str>, + path: I + ) -> Result { + Self::from_phrase(phrase, password)?.0 .derive(path) .map_err(|_| SecretStringError::InvalidPath) } - fn generate_with_phrase(password: Option<&str>) -> (Pair, String) { + fn generate_with_phrase(password: Option<&str>) -> (Pair, String, Seed) { let mnemonic = Mnemonic::new(MnemonicType::Words12, Language::English); let phrase = mnemonic.phrase(); + let (pair, seed) = Self::from_phrase(phrase, password) + .expect("All phrases generated by Mnemonic are valid; qed"); ( - Self::from_phrase(phrase, password).expect("All phrases generated by Mnemonic are valid; qed"), + pair, phrase.to_owned(), + seed, ) } - fn from_phrase(phrase: &str, password: Option<&str>) -> Result { + fn from_phrase(phrase: &str, password: Option<&str>) -> Result<(Pair, Seed), SecretStringError> { Mnemonic::from_phrase(phrase, Language::English) .map_err(|_| SecretStringError::InvalidPhrase) .map(|m| Self::from_entropy(m.entropy(), password)) @@ -490,11 +486,12 @@ impl Pair { /// /// This uses a key derivation function to convert the entropy into a seed, then returns /// the pair generated from it. - pub fn from_entropy(entropy: &[u8], password: Option<&str>) -> Pair { + pub fn from_entropy(entropy: &[u8], password: Option<&str>) -> (Pair, Seed) { let mini_key: MiniSecretKey = mini_secret_from_entropy(entropy, password.unwrap_or("")) .expect("32 bytes can always build a key; qed"); + let kp = mini_key.expand_to_keypair(); - Pair(kp) + (Pair(kp), mini_key.to_bytes()) } } @@ -538,7 +535,7 @@ mod test { #[test] fn derive_soft_should_work() { - let pair: Pair = Pair::from_seed(hex!( + let pair = Pair::from_seed(&hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let derive_1 = pair.derive(Some(DeriveJunction::soft(1)).into_iter()).unwrap(); @@ -550,7 +547,7 @@ mod test { #[test] fn derive_hard_should_work() { - let pair: Pair = Pair::from_seed(hex!( + let pair = Pair::from_seed(&hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let derive_1 = pair.derive(Some(DeriveJunction::hard(1)).into_iter()).unwrap(); @@ -562,7 +559,7 @@ mod test { #[test] fn derive_soft_public_should_work() { - let pair: Pair = Pair::from_seed(hex!( + let pair = Pair::from_seed(&hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let path = Some(DeriveJunction::soft(1)); @@ -573,7 +570,7 @@ mod test { #[test] fn derive_hard_public_should_fail() { - let pair: Pair = Pair::from_seed(hex!( + let pair = Pair::from_seed(&hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let path = Some(DeriveJunction::hard(1)); @@ -582,7 +579,7 @@ mod test { #[test] fn sr_test_vector_should_work() { - let pair: Pair = Pair::from_seed(hex!( + let pair = Pair::from_seed(&hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let public = pair.public(); @@ -599,7 +596,7 @@ mod test { #[test] fn generated_pair_should_work() { - let pair = Pair::generate(); + let (pair, _) = Pair::generate(); let public = pair.public(); let message = b"Something important"; let signature = pair.sign(&message[..]); @@ -609,7 +606,7 @@ mod test { #[test] fn seeded_pair_should_work() { - let pair = Pair::from_seed(*b"12345678901234567890123456789012"); + let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); assert_eq!( public, @@ -624,7 +621,7 @@ mod test { #[test] fn ss58check_roundtrip_works() { - let pair = Pair::generate(); + let (pair, _) = Pair::generate(); let public = pair.public(); let s = public.to_ss58check(); println!("Correct: {}", s); @@ -637,9 +634,13 @@ mod test { // The values in this test case are compared to the output of `node-test.js` in schnorrkel-js. // // This is to make sure that the wasm library is compatible. - let pk = Pair::from_seed(hex!("0000000000000000000000000000000000000000000000000000000000000000")); + let pk = Pair::from_seed( + &hex!("0000000000000000000000000000000000000000000000000000000000000000") + ); let public = pk.public(); - let js_signature = Signature::from_raw(hex!("28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00")); + let js_signature = Signature::from_raw( + hex!("28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00") + ); assert!(Pair::verify(&js_signature, b"SUBSTRATE", public)); } } diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs index a2ac6f5b29..0d94610362 100644 --- a/node/cli/src/factory_impl.rs +++ b/node/cli/src/factory_impl.rs @@ -170,13 +170,13 @@ impl RuntimeAdapter for FactoryState { /// Generates a random `AccountId` from `seed`. fn gen_random_account_id(seed: &Self::Number) -> Self::AccountId { - let pair: sr25519::Pair = sr25519::Pair::from_seed(gen_seed_bytes(*seed)); + let pair: sr25519::Pair = sr25519::Pair::from_seed(&gen_seed_bytes(*seed)); pair.public().into() } /// Generates a random `Secret` from `seed`. fn gen_random_account_secret(seed: &Self::Number) -> Self::Secret { - let pair: sr25519::Pair = sr25519::Pair::from_seed(gen_seed_bytes(*seed)); + let pair: sr25519::Pair = sr25519::Pair::from_seed(&gen_seed_bytes(*seed)); pair } diff --git a/subkey/src/cli.yml b/subkey/src/cli.yml index eedd475737..89190df362 100644 --- a/subkey/src/cli.yml +++ b/subkey/src/cli.yml @@ -21,6 +21,12 @@ args: subcommands: - generate: about: Generate a random account + args: + - words: + short: w + long: words + help: The number of words in the phrase to generate. One of 12 (default), 15, 18, 21 and 24. + takes_value: true - inspect: about: Gets a public key and a SS58 address from the provided Secret URI args: diff --git a/subkey/src/main.rs b/subkey/src/main.rs index 1b9afb8cd7..5bd698575d 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -18,75 +18,48 @@ #[cfg(feature = "bench")] extern crate test; -use std::io::{stdin, Read}; +use std::{str::FromStr, 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, 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; trait Crypto { - type Seed: AsRef<[u8]> + AsMut<[u8]> + Sized + Default; - type Pair: Pair; - fn generate_phrase() -> String { - Mnemonic::new(MnemonicType::Words12, Language::English).phrase().to_owned() - } - fn generate_seed() -> Self::Seed { - let mut seed: Self::Seed = Default::default(); - OsRng::new().unwrap().fill_bytes(seed.as_mut()); - seed - } - fn seed_from_phrase(phrase: &str, password: Option<&str>) -> Self::Seed; - fn pair_from_seed(seed: &Self::Seed) -> Self::Pair; - fn pair_from_suri(phrase: &str, password: Option<&str>) -> Self::Pair { - Self::pair_from_seed(&Self::seed_from_phrase(phrase, password)) - } - fn ss58_from_pair(pair: &Self::Pair) -> String; - fn public_from_pair(pair: &Self::Pair) -> Vec; - fn seed_from_pair(_pair: &Self::Pair) -> Option<&Self::Seed> { None } - fn print_from_seed(seed: &Self::Seed) { - let pair = Self::pair_from_seed(seed); - println!("Seed 0x{} is account:\n Public key (hex): 0x{}\n Address (SS58): {}", - HexDisplay::from(&seed.as_ref()), - HexDisplay::from(&Self::public_from_pair(&pair)), - Self::ss58_from_pair(&pair) - ); - } - fn print_from_phrase(phrase: &str, password: Option<&str>) { - let seed = Self::seed_from_phrase(phrase, password); - let pair = Self::pair_from_seed(&seed); - println!("Phrase `{}` is account:\n Seed: 0x{}\n Public key (hex): 0x{}\n Address (SS58): {}", - phrase, - HexDisplay::from(&seed.as_ref()), - HexDisplay::from(&Self::public_from_pair(&pair)), - Self::ss58_from_pair(&pair) - ); + type Pair: Pair; + type Public: Ss58Codec + AsRef<[u8]>; + fn pair_from_suri(suri: &str, password: Option<&str>) -> Self::Pair { + Self::Pair::from_string(suri, password).expect("Invalid phrase") } + fn ss58_from_pair(pair: &Self::Pair) -> String { pair.public().to_ss58check() } + fn public_from_pair(pair: &Self::Pair) -> Vec { pair.public().as_ref().to_owned() } fn print_from_uri(uri: &str, password: Option<&str>) where ::Public: Sized + Ss58Codec + AsRef<[u8]> { - if let Ok(pair) = Self::Pair::from_string(uri, password) { - let seed_text = Self::seed_from_pair(&pair) - .map_or_else(Default::default, |s| format!("\n Seed: 0x{}", HexDisplay::from(&s.as_ref()))); - println!("Secret Key URI `{}` is account:{}\n Public key (hex): 0x{}\n Address (SS58): {}", + if let Ok((pair, seed)) = Self::Pair::from_phrase(uri, password) { + println!("Secret phrase `{}` is account:\n Secret seed: 0x{}\n Public key (hex): 0x{}\n Address (SS58): {}", uri, - seed_text, + HexDisplay::from(&seed.as_ref()), HexDisplay::from(&Self::public_from_pair(&pair)), Self::ss58_from_pair(&pair) ); - } - if let Ok(public) = ::Public::from_string(uri) { + } else if let Ok(pair) = Self::Pair::from_string(uri, password) { + println!("Secret Key URI `{}` is account:\n Public key (hex): 0x{}\n Address (SS58): {}", + uri, + HexDisplay::from(&Self::public_from_pair(&pair)), + Self::ss58_from_pair(&pair) + ); + } else if let Ok(public) = ::Public::from_string(uri) { println!("Public Key URI `{}` is account:\n Public key (hex): 0x{}\n Address (SS58): {}", uri, HexDisplay::from(&public.as_ref()), public.to_ss58check() ); + } else { + println!("Invalid phrase/URI given"); } } } @@ -94,75 +67,47 @@ trait Crypto { struct Ed25519; impl Crypto for Ed25519 { - type Seed = [u8; 32]; type Pair = ed25519::Pair; + type Public = ed25519::Public; - fn seed_from_phrase(phrase: &str, password: Option<&str>) -> Self::Seed { - Sr25519::seed_from_phrase(phrase, password) - } fn pair_from_suri(suri: &str, password_override: Option<&str>) -> Self::Pair { ed25519::Pair::from_legacy_string(suri, password_override) } - fn pair_from_seed(seed: &Self::Seed) -> Self::Pair { ed25519::Pair::from_seed(seed.clone()) } - fn ss58_from_pair(pair: &Self::Pair) -> String { pair.public().to_ss58check() } - fn public_from_pair(pair: &Self::Pair) -> Vec { (&pair.public().0[..]).to_owned() } - fn seed_from_pair(pair: &Self::Pair) -> Option<&Self::Seed> { Some(pair.seed()) } } struct Sr25519; impl Crypto for Sr25519 { - type Seed = [u8; 32]; type Pair = sr25519::Pair; - - fn seed_from_phrase(phrase: &str, password: Option<&str>) -> Self::Seed { - mini_secret_from_entropy( - Mnemonic::from_phrase(phrase, Language::English) - .unwrap_or_else(|_| - panic!("Phrase is not a valid BIP-39 phrase: \n {}", phrase) - ) - .entropy(), - password.unwrap_or("") - ) - .expect("32 bytes can always build a key; qed") - .to_bytes() - } - - fn pair_from_suri(suri: &str, password: Option<&str>) -> Self::Pair { - sr25519::Pair::from_string(suri, password).expect("Invalid phrase") - } - - fn pair_from_seed(seed: &Self::Seed) -> Self::Pair { - MiniSecretKey::from_bytes(seed) - .expect("32 bytes can always build a key; qed") - .into() - } - fn ss58_from_pair(pair: &Self::Pair) -> String { pair.public().to_ss58check() } - fn public_from_pair(pair: &Self::Pair) -> Vec { (&pair.public().0[..]).to_owned() } + type Public = sr25519::Public; } -fn execute>(matches: clap::ArgMatches) where +fn execute(matches: clap::ArgMatches) where <::Pair as Pair>::Signature: AsRef<[u8]> + AsMut<[u8]> + Default, <::Pair as Pair>::Public: Sized + AsRef<[u8]> + Ss58Codec + AsRef<<::Pair as Pair>::Public>, { let password = matches.value_of("password"); match matches.subcommand() { - ("generate", Some(_matches)) => { + ("generate", Some(matches)) => { // create a new randomly generated mnemonic phrase - let mnemonic = Mnemonic::new(MnemonicType::Words12, Language::English); - C::print_from_phrase(mnemonic.phrase(), password); - }, - ("vanity", Some(matches)) => { - let desired: String = matches.value_of("pattern").map(str::to_string).unwrap_or_default(); - let key = vanity::generate_key::(&desired).expect("Key generation failed"); - C::print_from_seed(&key.seed); + let words = matches.value_of("words") + .map(|x| usize::from_str(x).expect("Invalid number given for --words")) + .map(|x| MnemonicType::for_word_count(x) + .expect("Invalid number of words given for phrase: must be 12/15/18/21/24") + ).unwrap_or(MnemonicType::Words12); + let mnemonic = Mnemonic::new(words, Language::English); + C::print_from_uri(mnemonic.phrase(), password); } ("inspect", Some(matches)) => { - // TODO: Accept public key with derivation path. let uri = matches.value_of("uri") .expect("URI parameter is required; thus it can't be None; qed"); C::print_from_uri(uri, password); - }, + } + ("vanity", Some(matches)) => { + let desired: String = matches.value_of("pattern").map(str::to_string).unwrap_or_default(); + let result = vanity::generate_key::(&desired).expect("Key generation failed"); + C::print_from_uri(&format!("0x{}", HexDisplay::from(&result.seed.as_ref())), None); + } ("sign", Some(matches)) => { let suri = matches.value_of("suri") .expect("secret URI parameter is required; thus it can't be None; qed"); diff --git a/subkey/src/vanity.rs b/subkey/src/vanity.rs index 2399197e99..ea1a609218 100644 --- a/subkey/src/vanity.rs +++ b/subkey/src/vanity.rs @@ -16,6 +16,7 @@ use rand::{rngs::OsRng, RngCore}; use super::Crypto; +use substrate_primitives::Pair; fn good_waypoint(done: u64) -> u64 { match done { @@ -26,21 +27,20 @@ fn good_waypoint(done: u64) -> u64 { } } -fn next_seed(mut seed: [u8; 32]) -> [u8; 32] { - for i in 0..32 { +fn next_seed(seed: &mut [u8]) { + for i in 0..seed.len() { match seed[i] { 255 => { seed[i] = 0; } _ => { seed[i] += 1; break; } } } - return seed; } /// A structure used to carry both Pair and seed. /// This should usually NOT been used. If unsure, use Pair. pub(super) struct KeyPair { pub pair: C::Pair, - pub seed: C::Seed, + pub seed: ::Seed, pub score: usize, } @@ -57,7 +57,7 @@ fn calculate_score(_desired: &str, key: &str) -> usize { 0 } -pub(super) fn generate_key>(desired: &str) -> Result, &str> { +pub(super) fn generate_key(desired: &str) -> Result, &str> { if desired.is_empty() { return Err("Pattern must not be empty"); } @@ -66,18 +66,17 @@ pub(super) fn generate_key>(desired: &str) -> Result::Seed::default(); let mut done = 0; - OsRng::new().unwrap().fill_bytes(&mut seed[..]); - loop { - // reset to a new random seed at beginning and regularly thereafter if done % 100000 == 0 { - OsRng::new().unwrap().fill_bytes(&mut seed[..]); + OsRng::new().unwrap().fill_bytes(seed.as_mut()); + } else { + next_seed(seed.as_mut()); } - let p = C::pair_from_seed(&seed); + let p = C::Pair::from_seed(&seed); let ss58 = C::ss58_from_pair(&p); let score = calculate_score(&desired, &ss58); if score > best || desired.len() < 2 { @@ -92,7 +91,6 @@ pub(super) fn generate_key>(desired: &str) -> Result Date: Thu, 13 Jun 2019 18:21:31 +0200 Subject: [PATCH 111/140] Merge network-libp2p into network (#2843) * Move network-libp2p into network * Merge libp2p_service into service * Don't expose RegisteredProtocol in the API * Extract DiscoveryBehaviour from Behaviour * Restore libp2p tests * Add a test for discovery * Line width * Remove bandwidth check * Fix gitlab --- .gitlab-ci.yml | 1 - Cargo.lock | 35 +- core/network-libp2p/Cargo.toml | 36 -- core/network-libp2p/src/config.rs | 304 --------------- core/network-libp2p/src/lib.rs | 282 -------------- core/network-libp2p/src/service_task.rs | 368 ------------------ core/network/Cargo.toml | 16 +- .../src/behaviour.rs | 171 +------- core/network/src/config.rs | 293 +++++++++++++- .../src/custom_proto/behaviour.rs | 32 +- .../src/custom_proto/handler.rs | 0 .../src/custom_proto/mod.rs | 2 +- .../src/custom_proto/upgrade.rs | 16 - .../behaviour => network/src}/debug_info.rs | 5 - core/network/src/discovery.rs | 302 ++++++++++++++ core/network/src/lib.rs | 193 ++++++++- core/network/src/protocol.rs | 10 +- core/network/src/protocol/consensus_gossip.rs | 2 +- core/network/src/protocol/message.rs | 2 +- core/network/src/protocol/on_demand.rs | 4 +- core/network/src/protocol/specialization.rs | 4 +- core/network/src/protocol/sync.rs | 2 +- core/network/src/protocol/sync/blocks.rs | 2 +- .../src/protocol/sync/extra_requests.rs | 2 +- core/network/src/service.rs | 210 ++++++++-- .../test.rs => network/src/service/tests.rs} | 80 ++-- core/network/src/test/mod.rs | 22 +- .../src/transport.rs | 0 28 files changed, 1071 insertions(+), 1325 deletions(-) delete mode 100644 core/network-libp2p/Cargo.toml delete mode 100644 core/network-libp2p/src/config.rs delete mode 100644 core/network-libp2p/src/lib.rs delete mode 100644 core/network-libp2p/src/service_task.rs rename core/{network-libp2p => network}/src/behaviour.rs (61%) rename core/{network-libp2p => network}/src/custom_proto/behaviour.rs (97%) rename core/{network-libp2p => network}/src/custom_proto/handler.rs (100%) rename core/{network-libp2p => network}/src/custom_proto/mod.rs (93%) rename core/{network-libp2p => network}/src/custom_proto/upgrade.rs (97%) rename core/{network-libp2p/src/behaviour => network/src}/debug_info.rs (98%) create mode 100644 core/network/src/discovery.rs rename core/{network-libp2p/tests/test.rs => network/src/service/tests.rs} (79%) rename core/{network-libp2p => network}/src/transport.rs (100%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 82fb604112..127aba4781 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -153,7 +153,6 @@ check-web-wasm: - time cargo web build -p substrate-keystore - time cargo web build -p substrate-executor - time cargo web build -p substrate-network - - 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 diff --git a/Cargo.lock b/Cargo.lock index a9d7945194..6e30fb4a75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4304,10 +4304,14 @@ name = "substrate-network" version = "2.0.0" dependencies = [ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (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)", "fork-tree 2.0.0", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.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)", "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)", @@ -4316,39 +4320,18 @@ dependencies = [ "parking_lot 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)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (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_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (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-runtime-client 2.0.0", - "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.11 (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 = "2.0.0" -dependencies = [ - "byteorder 1.3.2 (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.27 (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.9.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.8.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.92 (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_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.10 (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.21 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/core/network-libp2p/Cargo.toml b/core/network-libp2p/Cargo.toml deleted file mode 100644 index 16978ed02c..0000000000 --- a/core/network-libp2p/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -description = "libp2p implementation of the ethcore network library" -homepage = "http://parity.io" -license = "GPL-3.0" -name = "substrate-network-libp2p" -version = "2.0.0" -authors = ["Parity Technologies "] -edition = "2018" - -[dependencies] -byteorder = "1.3" -bytes = "0.4" -fnv = "1.0" -futures = "0.1" -libp2p = { version = "0.9.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } -parking_lot = "0.8.0" -lazy_static = "1.2" -log = "0.4" -rand = "0.6" -serde = { version = "1.0.70", features = ["derive"] } -serde_json = "1.0.24" -smallvec = "0.6" -substrate-peerset = { path = "../peerset" } -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/config.rs b/core/network-libp2p/src/config.rs deleted file mode 100644 index b9ccbb6428..0000000000 --- a/core/network-libp2p/src/config.rs +++ /dev/null @@ -1,304 +0,0 @@ -// Copyright 2015-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 . - -//! Libp2p network configuration. - -use libp2p::identity::{Keypair, secp256k1, ed25519}; -use libp2p::wasm_ext; -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)] -pub struct NetworkConfiguration { - /// Directory path to store general network configuration. None means nothing will be saved. - pub config_path: Option, - /// Directory path to store network-specific configuration. None means nothing will be saved. - pub net_config_path: Option, - /// Multiaddresses to listen for incoming connections. - pub listen_addresses: Vec, - /// Multiaddresses to advertise. Detected automatically if empty. - pub public_addresses: Vec, - /// List of initial node addresses - pub boot_nodes: Vec, - /// The node key configuration, which determines the node's network identity keypair. - pub node_key: NodeKeyConfig, - /// Maximum allowed number of incoming connections. - pub in_peers: u32, - /// Number of outgoing connections we're trying to maintain. - pub out_peers: u32, - /// List of reserved node addresses. - pub reserved_nodes: Vec, - /// The non-reserved peer mode. - pub non_reserved_mode: NonReservedPeerMode, - /// Client identifier. Sent over the wire for debugging purposes. - pub client_version: String, - /// Name of the node. Sent over the wire for debugging purposes. - pub node_name: String, - /// If true, the network will use mDNS to discover other libp2p nodes on the local network - /// and connect to them if they support the same chain. - pub enable_mdns: bool, - /// Optional external implementation of a libp2p transport. Used in WASM contexts where we need - /// some binding between the networking provided by the operating system or environment and - /// libp2p. - /// - /// This parameter exists whatever the target platform is, but it is expected to be set to - /// `Some` only when compiling for WASM. - pub wasm_external_transport: Option, -} - -impl Default for NetworkConfiguration { - fn default() -> Self { - NetworkConfiguration { - config_path: None, - net_config_path: None, - listen_addresses: Vec::new(), - public_addresses: Vec::new(), - boot_nodes: Vec::new(), - node_key: NodeKeyConfig::Ed25519(Secret::New), - in_peers: 25, - out_peers: 75, - reserved_nodes: Vec::new(), - non_reserved_mode: NonReservedPeerMode::Accept, - client_version: "unknown".into(), - node_name: "unknown".into(), - enable_mdns: false, - wasm_external_transport: None, - } - } -} - -impl NetworkConfiguration { - /// Create a new instance of default settings. - pub fn new() -> Self { - Self::default() - } - - /// Create new default configuration for localhost-only connection with random port (useful for testing) - pub fn new_local() -> NetworkConfiguration { - let mut config = NetworkConfiguration::new(); - config.listen_addresses = vec![ - iter::once(Protocol::Ip4(Ipv4Addr::new(127, 0, 0, 1))) - .chain(iter::once(Protocol::Tcp(0))) - .collect() - ]; - config - } -} - -/// The policy for connections to non-reserved peers. -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum NonReservedPeerMode { - /// Accept them. This is the default. - Accept, - /// Deny them. - Deny, -} - -impl NonReservedPeerMode { - /// Attempt to parse the peer mode from a string. - pub fn parse(s: &str) -> Option { - match s { - "accept" => Some(NonReservedPeerMode::Accept), - "deny" => Some(NonReservedPeerMode::Deny), - _ => None, - } - } -} - -/// The configuration of a node's secret key, describing the type of key -/// and how it is obtained. A node's identity keypair is the result of -/// the evaluation of the node key configuration. -#[derive(Clone)] -pub enum NodeKeyConfig { - /// A Secp256k1 secret key configuration. - Secp256k1(Secret), - /// A Ed25519 secret key configuration. - Ed25519(Secret) -} - -/// The options for obtaining a Secp256k1 secret key. -pub type Secp256k1Secret = Secret; - -/// The options for obtaining a Ed25519 secret key. -pub type Ed25519Secret = Secret; - -/// The configuration options for obtaining a secret key `K`. -#[derive(Clone)] -pub enum Secret { - /// Use the given secret key `K`. - Input(K), - /// Read the secret key from a file. If the file does not exist, - /// it is created with a newly generated secret key `K`. The format - /// of the file is determined by `K`: - /// - /// * `secp256k1::SecretKey`: An unencoded 32 bytes Secp256k1 secret key. - /// * `ed25519::SecretKey`: An unencoded 32 bytes Ed25519 secret key. - File(PathBuf), - /// Always generate a new secret key `K`. - New -} - -impl NodeKeyConfig { - /// Evaluate a `NodeKeyConfig` to obtain an identity `Keypair`: - /// - /// * If the secret is configured as input, the corresponding keypair is returned. - /// - /// * If the secret is configured as a file, it is read from that file, if it exists. - /// Otherwise a new secret is generated and stored. In either case, the - /// keypair obtained from the secret is returned. - /// - /// * If the secret is configured to be new, it is generated and the corresponding - /// keypair is returned. - pub fn into_keypair(self) -> io::Result { - use NodeKeyConfig::*; - match self { - Secp256k1(Secret::New) => - Ok(Keypair::generate_secp256k1()), - - Secp256k1(Secret::Input(k)) => - Ok(Keypair::Secp256k1(k.into())), - - Secp256k1(Secret::File(f)) => - get_secret(f, - |mut b| secp256k1::SecretKey::from_bytes(&mut b), - secp256k1::SecretKey::generate, - |b| b.to_bytes().to_vec()) - .map(secp256k1::Keypair::from) - .map(Keypair::Secp256k1), - - Ed25519(Secret::New) => - Ok(Keypair::generate_ed25519()), - - Ed25519(Secret::Input(k)) => - Ok(Keypair::Ed25519(k.into())), - - Ed25519(Secret::File(f)) => - get_secret(f, - |mut b| ed25519::SecretKey::from_bytes(&mut b), - ed25519::SecretKey::generate, - |b| b.as_ref().to_vec()) - .map(ed25519::Keypair::from) - .map(Keypair::Ed25519), - } - } -} - -/// 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, serialize: W) -> io::Result -where - P: AsRef, - F: for<'r> FnOnce(&'r mut [u8]) -> Result, - G: FnOnce() -> K, - E: Error + Send + Sync + 'static, - W: Fn(&K) -> Vec, -{ - std::fs::read(&file) - .and_then(|mut sk_bytes| - parse(&mut sk_bytes) - .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))) - .or_else(|e| { - if e.kind() == io::ErrorKind::NotFound { - file.as_ref().parent().map_or(Ok(()), fs::create_dir_all)?; - let sk = generate(); - let mut sk_vec = serialize(&sk); - write_secret_file(file, &sk_vec)?; - sk_vec.zeroize(); - Ok(sk) - } else { - Err(e) - } - }) -} - -/// Write secret bytes to a file. -fn write_secret_file

(path: P, sk_bytes: &[u8]) -> io::Result<()> -where - P: AsRef -{ - let mut file = open_secret_file(&path)?; - file.write_all(sk_bytes) -} - -/// Opens a file containing a secret key in write mode. -#[cfg(unix)] -fn open_secret_file

(path: P) -> io::Result -where - P: AsRef -{ - use std::os::unix::fs::OpenOptionsExt; - fs::OpenOptions::new() - .write(true) - .create_new(true) - .mode(0o600) - .open(path) -} - -/// Opens a file containing a secret key in write mode. -#[cfg(not(unix))] -fn open_secret_file

(path: P) -> Result -where - P: AsRef -{ - fs::OpenOptions::new() - .write(true) - .create_new(true) - .open(path) -} - -#[cfg(test)] -mod tests { - use super::*; - use tempdir::TempDir; - - fn secret_bytes(kp: &Keypair) -> Vec { - match kp { - Keypair::Ed25519(p) => p.secret().as_ref().iter().cloned().collect(), - Keypair::Secp256k1(p) => p.secret().to_bytes().to_vec(), - _ => panic!("Unexpected keypair.") - } - } - - #[test] - fn test_secret_file() { - let tmp = TempDir::new("x").unwrap(); - std::fs::remove_dir(tmp.path()).unwrap(); // should be recreated - let file = tmp.path().join("x").to_path_buf(); - let kp1 = NodeKeyConfig::Ed25519(Secret::File(file.clone())).into_keypair().unwrap(); - let kp2 = NodeKeyConfig::Ed25519(Secret::File(file.clone())).into_keypair().unwrap(); - assert!(file.is_file() && secret_bytes(&kp1) == secret_bytes(&kp2)) - } - - #[test] - fn test_secret_input() { - let sk = secp256k1::SecretKey::generate(); - let kp1 = NodeKeyConfig::Secp256k1(Secret::Input(sk.clone())).into_keypair().unwrap(); - let kp2 = NodeKeyConfig::Secp256k1(Secret::Input(sk)).into_keypair().unwrap(); - assert!(secret_bytes(&kp1) == secret_bytes(&kp2)); - } - - #[test] - fn test_secret_new() { - let kp1 = NodeKeyConfig::Ed25519(Secret::New).into_keypair().unwrap(); - let kp2 = NodeKeyConfig::Ed25519(Secret::New).into_keypair().unwrap(); - assert!(secret_bytes(&kp1) != secret_bytes(&kp2)); - } -} - diff --git a/core/network-libp2p/src/lib.rs b/core/network-libp2p/src/lib.rs deleted file mode 100644 index 540d8d7f0b..0000000000 --- a/core/network-libp2p/src/lib.rs +++ /dev/null @@ -1,282 +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 . - -//! 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; -mod custom_proto; -mod service_task; -mod transport; - -pub use crate::config::*; -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::{Deserialize, Serialize}; -use slog_derive::SerdeValue; -use std::{collections::{HashMap, HashSet}, error, fmt, time::Duration}; - -/// 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> { - let mut addr: Multiaddr = addr_str.parse()?; - - let who = match addr.pop() { - Some(multiaddr::Protocol::P2p(key)) => PeerId::from_multihash(key) - .map_err(|_| ParseErr::InvalidPeerId)?, - _ => return Err(ParseErr::PeerIdMissing), - }; - - Ok((who, addr)) -} - -/// Error that can be generated by `parse_str_addr`. -#[derive(Debug)] -pub enum ParseErr { - /// Error while parsing the multiaddress. - MultiaddrParse(multiaddr::Error), - /// Multihash of the peer ID is invalid. - InvalidPeerId, - /// The peer ID is missing from the address. - PeerIdMissing, -} - -impl fmt::Display for ParseErr { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ParseErr::MultiaddrParse(err) => write!(f, "{}", err), - ParseErr::InvalidPeerId => write!(f, "Peer id at the end of the address is invalid"), - ParseErr::PeerIdMissing => write!(f, "Peer id is missing from the address"), - } - } -} - -impl error::Error for ParseErr { - fn source(&self) -> Option<&(dyn error::Error + 'static)> { - match self { - ParseErr::MultiaddrParse(err) => Some(err), - ParseErr::InvalidPeerId => None, - ParseErr::PeerIdMissing => None, - } - } -} - -impl From for ParseErr { - fn from(err: multiaddr::Error) -> ParseErr { - ParseErr::MultiaddrParse(err) - } -} - -/// Returns general information about the networking. -/// -/// Meant for general diagnostic purposes. -/// -/// **Warning**: This API is not stable. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, SerdeValue)] -#[serde(rename_all = "camelCase")] -pub struct NetworkState { - /// PeerId of the local node. - pub peer_id: String, - /// List of addresses the node is currently listening on. - pub listened_addresses: HashSet, - /// List of addresses the node knows it can be reached as. - pub external_addresses: HashSet, - /// List of node we're connected to. - pub connected_peers: HashMap, - /// List of node that we know of but that we're not connected to. - pub not_connected_peers: HashMap, - /// Downloaded bytes per second averaged over the past few seconds. - pub average_download_per_sec: u64, - /// Uploaded bytes per second averaged over the past few seconds. - pub average_upload_per_sec: u64, - /// State of the peerset manager. - pub peerset: serde_json::Value, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct NetworkStatePeer { - /// How we are connected to the node. - pub endpoint: NetworkStatePeerEndpoint, - /// Node information, as provided by the node itself. Can be empty if not known yet. - pub version_string: Option, - /// Latest ping duration with this node. - pub latest_ping_time: Option, - /// If true, the peer is "enabled", which means that we try to open Substrate-related protocols - /// with this peer. If false, we stick to Kademlia and/or other network-only protocols. - pub enabled: bool, - /// If true, the peer is "open", which means that we have a Substrate-related protocol - /// with this peer. - pub open: bool, - /// List of addresses known for this node. - pub known_addresses: HashSet, -} - -#[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(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum NetworkStatePeerEndpoint { - /// We are dialing the given address. - Dialing(Multiaddr), - /// We are listening. - Listening { - /// Address we're listening on that received the connection. - listen_addr: Multiaddr, - /// Address data is sent back to. - send_back_addr: Multiaddr, - }, -} - -impl From for NetworkStatePeerEndpoint { - fn from(endpoint: ConnectedPoint) -> Self { - match endpoint { - ConnectedPoint::Dialer { address } => - NetworkStatePeerEndpoint::Dialing(address), - ConnectedPoint::Listener { listen_addr, send_back_addr } => - NetworkStatePeerEndpoint::Listening { - listen_addr, - send_back_addr - } - } - } -} diff --git a/core/network-libp2p/src/service_task.rs b/core/network-libp2p/src/service_task.rs deleted file mode 100644 index e74757e0b1..0000000000 --- a/core/network-libp2p/src/service_task.rs +++ /dev/null @@ -1,368 +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 crate::{ - behaviour::Behaviour, - config::NodeKeyConfig, - transport, NetworkState, NetworkStatePeer, NetworkStateNotConnectedPeer -}; -use crate::custom_proto::{CustomProto, CustomProtoOut, CustomMessage, RegisteredProtocol}; -use crate::{NetworkConfiguration, NonReservedPeerMode, parse_str_addr}; -use futures::{prelude::*, Stream}; -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::{info, error, warn}; -use std::fs; -use std::io::Error as IoError; -use std::path::Path; -use std::sync::Arc; - -/// Starts the substrate libp2p service. -/// -/// Returns a stream that must be polled regularly in order for the networking to function. -pub fn start_service( - config: NetworkConfiguration, - registered_custom: RegisteredProtocol, -) -> Result<(Service, substrate_peerset::PeersetHandle), IoError> -where TMessage: CustomMessage + Send + 'static { - - if let Some(ref path) = config.net_config_path { - fs::create_dir_all(Path::new(path))?; - } - - // List of multiaddresses that we know in the network. - let mut known_addresses = Vec::new(); - let mut bootnodes = Vec::new(); - let mut reserved_nodes = Vec::new(); - - // Process the bootnodes. - for bootnode in config.boot_nodes.iter() { - match parse_str_addr(bootnode) { - Ok((peer_id, addr)) => { - bootnodes.push(peer_id.clone()); - known_addresses.push((peer_id, addr)); - }, - Err(_) => warn!(target: "sub-libp2p", "Not a valid bootnode address: {}", bootnode), - } - } - - // Initialize the reserved peers. - for reserved in config.reserved_nodes.iter() { - if let Ok((peer_id, addr)) = parse_str_addr(reserved) { - reserved_nodes.push(peer_id.clone()); - known_addresses.push((peer_id, addr)); - } else { - warn!(target: "sub-libp2p", "Not a valid reserved node address: {}", reserved); - } - } - - // Build the peerset. - let (peerset, peerset_handle) = substrate_peerset::Peerset::from_config(substrate_peerset::PeersetConfig { - in_peers: config.in_peers, - out_peers: config.out_peers, - bootnodes, - reserved_only: config.non_reserved_mode == NonReservedPeerMode::Deny, - reserved_nodes, - }); - - // Private and public keys configuration. - if let NodeKeyConfig::Secp256k1(_) = config.node_key { - warn!(target: "sub-libp2p", "Secp256k1 keys are deprecated in favour of ed25519"); - } - 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 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, - config.wasm_external_transport - ); - (Swarm::new(transport, behaviour, local_peer_id.clone()), bandwidth) - }; - - // Listen on multiaddresses. - for addr in &config.listen_addresses { - if let Err(err) = Swarm::listen_on(&mut swarm, addr.clone()) { - warn!(target: "sub-libp2p", "Can't listen on {} because: {:?}", addr, err) - } - } - - // Add external addresses. - for addr in &config.public_addresses { - Swarm::add_external_address(&mut swarm, addr.clone()); - } - - let service = Service { - swarm, - bandwidth, - injected_events: Vec::new(), - }; - - Ok((service, peerset_handle)) -} - -/// Event produced by the service. -#[derive(Debug)] -pub enum ServiceEvent { - /// A custom protocol substream has been opened with a node. - OpenedCustomProtocol { - /// Identity of the node. - peer_id: PeerId, - /// Version of the protocol that was opened. - version: u8, - /// Node debug info - debug_info: String, - }, - - /// A custom protocol substream has been closed. - ClosedCustomProtocol { - /// Identity of the node. - peer_id: PeerId, - /// Node debug info - debug_info: String, - }, - - /// Receives a message on a custom protocol stream. - CustomMessage { - /// Identity of the node. - peer_id: PeerId, - /// Message that has been received. - message: TMessage, - }, - - /// The substream with a node is clogged. We should avoid sending data to it if possible. - Clogged { - /// Index of the node. - peer_id: PeerId, - /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, - }, -} - -/// 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< - Boxed<(PeerId, StreamMuxerBox), IoError>, - Behaviour>, CustomProtoOut, Substream> - >, - - /// Bandwidth logging system. Can be queried to know the average bandwidth consumed. - bandwidth: Arc, - - /// Events to produce on the Stream. - injected_events: Vec>, -} - -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; - open.iter().filter_map(move |peer_id| { - let known_addresses = NetworkBehaviour::addresses_of_peer(&mut **swarm, peer_id) - .into_iter().collect(); - - 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 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(), - }) - }).collect() - }; - - NetworkState { - peer_id: Swarm::local_peer_id(&self.swarm).to_base58(), - listened_addresses: Swarm::listeners(&self.swarm).cloned().collect(), - external_addresses: Swarm::external_addresses(&self.swarm).cloned().collect(), - average_download_per_sec: self.bandwidth.average_download_per_sec(), - average_upload_per_sec: self.bandwidth.average_upload_per_sec(), - connected_peers, - not_connected_peers, - peerset: self.swarm.user_protocol_mut().peerset_debug_info(), - } - } - - /// Returns an iterator that produces the list of addresses we're listening on. - #[inline] - pub fn listeners(&self) -> impl Iterator { - Swarm::listeners(&self.swarm) - } - - /// Returns the downloaded bytes per second averaged over the past few seconds. - #[inline] - pub fn average_download_per_sec(&self) -> u64 { - self.bandwidth.average_download_per_sec() - } - - /// Returns the uploaded bytes per second averaged over the past few seconds. - #[inline] - pub fn average_upload_per_sec(&self) -> u64 { - self.bandwidth.average_upload_per_sec() - } - - /// Returns the peer id of the local node. - pub fn peer_id(&self) -> &PeerId { - Swarm::local_peer_id(&self.swarm) - } - - /// Returns the list of all the peers we are connected to. - pub fn connected_peers<'a>(&'a self) -> impl Iterator + 'a { - self.swarm.user_protocol().open_peers() - } - - /// 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> { - if self.swarm.user_protocol().is_open(peer_id) { - self.swarm.node(peer_id).map(|n| n.endpoint()) - } else { - None - } - } - - /// 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.swarm.node(peer_id).and_then(|n| n.client_version()) - } - - /// Sends a message to a peer using the custom protocol. - /// - /// Has no effect if the connection to the node has been closed, or if the node index is - /// invalid. - pub fn send_custom_message( - &mut self, - peer_id: &PeerId, - message: TMessage - ) { - self.swarm.user_protocol_mut().send_packet(peer_id, message); - } - - /// Disconnects a peer. - /// - /// 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) { - self.swarm.user_protocol_mut().disconnect_peer(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) { - self.swarm.add_known_address(peer_id, addr) - } - - /// Get debug info for a given peer. - pub fn peer_debug_info(&self, who: &PeerId) -> String { - if let Some(node) = self.swarm.node(who) { - format!("{:?} {}", who, node.debug_info()) - } else { - format!("{:?} (unknown)", who) - } - } - - /// Polls for what happened on the network. - fn poll_swarm(&mut self) -> Poll>, IoError> { - loop { - match self.swarm.poll() { - 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, - version, - debug_info, - }))) - } - Ok(Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { peer_id, .. }))) => { - let debug_info = self.peer_debug_info(&peer_id); - break Ok(Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { - peer_id, - debug_info, - }))) - } - Ok(Async::Ready(Some(CustomProtoOut::CustomMessage { peer_id, message }))) => { - break Ok(Async::Ready(Some(ServiceEvent::CustomMessage { - peer_id, - message, - }))) - } - Ok(Async::Ready(Some(CustomProtoOut::Clogged { peer_id, messages }))) => { - break Ok(Async::Ready(Some(ServiceEvent::Clogged { - peer_id, - messages, - }))) - } - Ok(Async::NotReady) => break Ok(Async::NotReady), - Ok(Async::Ready(None)) => unreachable!("The Swarm stream never ends"), - Err(_) => unreachable!("The Swarm never errors"), - } - } - } -} - -impl Stream for Service where TMessage: CustomMessage + Send + 'static { - type Item = ServiceEvent; - type Error = IoError; - - fn poll(&mut self) -> Poll, Self::Error> { - if !self.injected_events.is_empty() { - return Ok(Async::Ready(Some(self.injected_events.remove(0)))); - } - - match self.poll_swarm()? { - Async::Ready(value) => return Ok(Async::Ready(value)), - Async::NotReady => (), - } - - // The only way we reach this is if we went through all the `NotReady` paths above, - // ensuring the current task is registered everywhere. - Ok(Async::NotReady) - } -} diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 1b3a473288..85fef9c3c7 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -6,38 +6,48 @@ license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" -[lib] - [dependencies] +bytes = "0.4" derive_more = "0.14.0" log = "0.4" parking_lot = "0.8.0" bitflags = "1.0" +fnv = "1.0" futures = "0.1.17" linked-hash-map = "0.5" linked_hash_set = "0.1.3" lru-cache = "0.1.1" rustc-hex = "2.0" rand = "0.6" +libp2p = { version = "0.9.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } fork-tree = { path = "../../core/util/fork-tree" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common" } client = { package = "substrate-client", path = "../../core/client" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } parity-codec = { version = "3.3", features = ["derive"] } -network_libp2p = { package = "substrate-network-libp2p", path = "../../core/network-libp2p" } peerset = { package = "substrate-peerset", path = "../../core/peerset" } +serde = { version = "1.0.70", features = ["derive"] } +serde_json = "1.0.24" +slog = { version = "^2", features = ["nested-values"] } +slog_derive = "0.1.1" +smallvec = "0.6" +tokio-io = "0.1" tokio-timer = "0.2.11" tokio = { version = "0.1.11", optional = true } +unsigned-varint = { version = "0.2.1", features = ["codec"] } keyring = { package = "substrate-keyring", path = "../../core/keyring", optional = true } test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client", optional = true } +erased-serde = "0.3.9" void = "1.0" +zeroize = "0.6.0" [dev-dependencies] env_logger = { version = "0.6" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common", features = ["test-helpers"] } +tempdir = "0.3" tokio = "0.1.11" [features] diff --git a/core/network-libp2p/src/behaviour.rs b/core/network/src/behaviour.rs similarity index 61% rename from core/network-libp2p/src/behaviour.rs rename to core/network/src/behaviour.rs index 379983a3fb..35684bc257 100644 --- a/core/network-libp2p/src/behaviour.rs +++ b/core/network/src/behaviour.rs @@ -14,7 +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::{debug_info, discovery::DiscoveryBehaviour, discovery::DiscoveryOut, DiscoveryNetBehaviour}; use futures::prelude::*; use libp2p::NetworkBehaviour; use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, protocols_handler::IntoProtocolsHandler, PublicKey}; @@ -22,18 +22,12 @@ use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourActi use libp2p::core::swarm::{NetworkBehaviourEventProcess, PollParameters}; #[cfg(not(target_os = "unknown"))] use libp2p::core::swarm::toggle::Toggle; -use libp2p::kad::{Kademlia, KademliaOut}; #[cfg(not(target_os = "unknown"))] use libp2p::mdns::{Mdns, MdnsEvent}; -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, clock::Clock}; +use log::warn; +use std::iter; use void; -mod debug_info; - /// General behaviour of the network. #[derive(NetworkBehaviour)] #[behaviour(out_event = "TBehaviourEv", poll_method = "poll")] @@ -65,28 +59,15 @@ impl Behaviour Self { let debug_info = debug_info::DebugInfoBehaviour::new(user_agent, local_public_key.clone()); - let mut kademlia = Kademlia::new(local_public_key.clone().into_peer_id()); - for (peer_id, addr) in &known_addresses { - kademlia.add_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 { user_protocol: UserBehaviourWrap(user_protocol), debug_info, - discovery: DiscoveryBehaviour { - user_defined: known_addresses, - kademlia, - 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(), - }, + discovery: DiscoveryBehaviour::new(local_public_key, known_addresses), #[cfg(not(target_os = "unknown"))] mdns: if enable_mdns { match Mdns::new() { @@ -105,14 +86,12 @@ impl Behaviour impl Iterator { - self.discovery.kademlia.kbuckets_entries() + self.discovery.known_peers() } /// 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) { - self.discovery.user_defined.push((peer_id, addr)); - } + self.discovery.add_known_address(peer_id, addr) } /// Borrows `self` and returns a struct giving access to the information about a node. @@ -165,33 +144,20 @@ impl NetworkBehaviourEventProcess NetworkBehaviourEventProcess +impl NetworkBehaviourEventProcess for Behaviour where TBehaviour: DiscoveryNetBehaviour { - fn inject_event(&mut self, out: KademliaOut) { + fn inject_event(&mut self, out: DiscoveryOut) { match out { - KademliaOut::Discovered { .. } => {} - KademliaOut::KBucketAdded { peer_id, .. } => { + DiscoveryOut::Discovered(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", - key, closer_peers.len()); - if closer_peers.is_empty() { - warn!(target: "sub-libp2p", "Libp2p => Random Kademlia query has yielded empty \ - results"); - } - } - // We never start any other type of query. - KademliaOut::GetProvidersResult { .. } => {} - KademliaOut::GetValueResult(_) => {} - KademliaOut::PutValueResult(_) => {} } } } @@ -287,120 +253,3 @@ impl NetworkBehaviour for UserBehaviourWrap { 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 - /// reserved nodes. - user_defined: Vec<(PeerId, Multiaddr)>, - /// Kademlia requests and answers. - kademlia: Kademlia, - /// Stream that fires when we need to perform the next random Kademlia query. - 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 -where - TSubstream: AsyncRead + AsyncWrite, -{ - type ProtocolsHandler = as NetworkBehaviour>::ProtocolsHandler; - type OutEvent = as NetworkBehaviour>::OutEvent; - - fn new_handler(&mut self) -> Self::ProtocolsHandler { - NetworkBehaviour::new_handler(&mut self.kademlia) - } - - fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { - let mut list = self.user_defined.iter() - .filter_map(|(p, a)| if p == peer_id { Some(a.clone()) } else { None }) - .collect::>(); - list.extend(self.kademlia.addresses_of_peer(peer_id)); - trace!(target: "sub-libp2p", "Addresses of {:?} are {:?}", peer_id, list); - if list.is_empty() { - if self.kademlia.kbuckets_entries().any(|p| p == peer_id) { - debug!(target: "sub-libp2p", "Requested dialing to {:?} (peer in k-buckets), \ - and no address was found", peer_id); - } else { - debug!(target: "sub-libp2p", "Requested dialing to {:?} (peer not in k-buckets), \ - and no address was found", peer_id); - } - } - list - } - - fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { - NetworkBehaviour::inject_connected(&mut self.kademlia, peer_id, endpoint) - } - - fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { - NetworkBehaviour::inject_disconnected(&mut self.kademlia, peer_id, endpoint) - } - - fn inject_replaced(&mut self, peer_id: PeerId, closed: ConnectedPoint, opened: ConnectedPoint) { - NetworkBehaviour::inject_replaced(&mut self.kademlia, peer_id, closed, opened) - } - - fn inject_node_event( - &mut self, - peer_id: PeerId, - event: ::OutEvent, - ) { - 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, - ) -> Async< - NetworkBehaviourAction< - ::InEvent, - Self::OutEvent, - >, - > { - // Poll Kademlia. - match self.kademlia.poll(params) { - Async::Ready(action) => return Async::Ready(action), - Async::NotReady => (), - } - - // Poll the stream that fires when we need to start a random Kademlia query. - loop { - match self.next_kad_random_query.poll() { - Ok(Async::NotReady) => break, - Ok(Async::Ready(_)) => { - let random_peer_id = PeerId::random(); - debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ - {:?}", random_peer_id); - self.kademlia.find_node(random_peer_id); - - // Reset the `Delay` to the next random. - 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)); - }, - Err(err) => { - warn!(target: "sub-libp2p", "Kademlia query timer errored: {:?}", err); - break - } - } - } - - Async::NotReady - } -} diff --git a/core/network/src/config.rs b/core/network/src/config.rs index d8fd0f68c7..fd0a3a924e 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -17,16 +17,22 @@ //! Configuration for the networking layer of Substrate. pub use crate::protocol::ProtocolConfig; -pub use network_libp2p::{NonReservedPeerMode, NetworkConfiguration, NodeKeyConfig, ProtocolId, Secret}; +use crate::ProtocolId; +use crate::chain::{Client, FinalityProofProvider}; +use crate::on_demand_layer::OnDemand; +use crate::service::{ExHashT, TransactionPool}; use bitflags::bitflags; use consensus::import_queue::ImportQueue; -use crate::chain::{Client, FinalityProofProvider}; use parity_codec; -use crate::on_demand_layer::OnDemand; use runtime_primitives::traits::{Block as BlockT}; -use crate::service::{ExHashT, TransactionPool}; use std::sync::Arc; +use libp2p::identity::{Keypair, secp256k1, ed25519}; +use libp2p::wasm_ext; +use libp2p::{Multiaddr, multiaddr::Protocol}; +use std::error::Error; +use std::{io::{self, Write}, iter, fs, net::Ipv4Addr, path::{Path, PathBuf}}; +use zeroize::Zeroize; /// Service initialization parameters. pub struct Params { @@ -87,3 +93,282 @@ impl parity_codec::Decode for Roles { Self::from_bits(input.read_byte()?) } } + +/// Network service configuration. +#[derive(Clone)] +pub struct NetworkConfiguration { + /// Directory path to store general network configuration. None means nothing will be saved. + pub config_path: Option, + /// Directory path to store network-specific configuration. None means nothing will be saved. + pub net_config_path: Option, + /// Multiaddresses to listen for incoming connections. + pub listen_addresses: Vec, + /// Multiaddresses to advertise. Detected automatically if empty. + pub public_addresses: Vec, + /// List of initial node addresses + pub boot_nodes: Vec, + /// The node key configuration, which determines the node's network identity keypair. + pub node_key: NodeKeyConfig, + /// Maximum allowed number of incoming connections. + pub in_peers: u32, + /// Number of outgoing connections we're trying to maintain. + pub out_peers: u32, + /// List of reserved node addresses. + pub reserved_nodes: Vec, + /// The non-reserved peer mode. + pub non_reserved_mode: NonReservedPeerMode, + /// Client identifier. Sent over the wire for debugging purposes. + pub client_version: String, + /// Name of the node. Sent over the wire for debugging purposes. + pub node_name: String, + /// If true, the network will use mDNS to discover other libp2p nodes on the local network + /// and connect to them if they support the same chain. + pub enable_mdns: bool, + /// Optional external implementation of a libp2p transport. Used in WASM contexts where we need + /// some binding between the networking provided by the operating system or environment and + /// libp2p. + /// + /// This parameter exists whatever the target platform is, but it is expected to be set to + /// `Some` only when compiling for WASM. + pub wasm_external_transport: Option, +} + +impl Default for NetworkConfiguration { + fn default() -> Self { + NetworkConfiguration { + config_path: None, + net_config_path: None, + listen_addresses: Vec::new(), + public_addresses: Vec::new(), + boot_nodes: Vec::new(), + node_key: NodeKeyConfig::Ed25519(Secret::New), + in_peers: 25, + out_peers: 75, + reserved_nodes: Vec::new(), + non_reserved_mode: NonReservedPeerMode::Accept, + client_version: "unknown".into(), + node_name: "unknown".into(), + enable_mdns: false, + wasm_external_transport: None, + } + } +} + +impl NetworkConfiguration { + /// Create a new instance of default settings. + pub fn new() -> Self { + Self::default() + } + + /// Create new default configuration for localhost-only connection with random port (useful for testing) + pub fn new_local() -> NetworkConfiguration { + let mut config = NetworkConfiguration::new(); + config.listen_addresses = vec![ + iter::once(Protocol::Ip4(Ipv4Addr::new(127, 0, 0, 1))) + .chain(iter::once(Protocol::Tcp(0))) + .collect() + ]; + config + } +} + +/// The policy for connections to non-reserved peers. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum NonReservedPeerMode { + /// Accept them. This is the default. + Accept, + /// Deny them. + Deny, +} + +impl NonReservedPeerMode { + /// Attempt to parse the peer mode from a string. + pub fn parse(s: &str) -> Option { + match s { + "accept" => Some(NonReservedPeerMode::Accept), + "deny" => Some(NonReservedPeerMode::Deny), + _ => None, + } + } +} + +/// The configuration of a node's secret key, describing the type of key +/// and how it is obtained. A node's identity keypair is the result of +/// the evaluation of the node key configuration. +#[derive(Clone)] +pub enum NodeKeyConfig { + /// A Secp256k1 secret key configuration. + Secp256k1(Secret), + /// A Ed25519 secret key configuration. + Ed25519(Secret) +} + +/// The options for obtaining a Secp256k1 secret key. +pub type Secp256k1Secret = Secret; + +/// The options for obtaining a Ed25519 secret key. +pub type Ed25519Secret = Secret; + +/// The configuration options for obtaining a secret key `K`. +#[derive(Clone)] +pub enum Secret { + /// Use the given secret key `K`. + Input(K), + /// Read the secret key from a file. If the file does not exist, + /// it is created with a newly generated secret key `K`. The format + /// of the file is determined by `K`: + /// + /// * `secp256k1::SecretKey`: An unencoded 32 bytes Secp256k1 secret key. + /// * `ed25519::SecretKey`: An unencoded 32 bytes Ed25519 secret key. + File(PathBuf), + /// Always generate a new secret key `K`. + New +} + +impl NodeKeyConfig { + /// Evaluate a `NodeKeyConfig` to obtain an identity `Keypair`: + /// + /// * If the secret is configured as input, the corresponding keypair is returned. + /// + /// * If the secret is configured as a file, it is read from that file, if it exists. + /// Otherwise a new secret is generated and stored. In either case, the + /// keypair obtained from the secret is returned. + /// + /// * If the secret is configured to be new, it is generated and the corresponding + /// keypair is returned. + pub fn into_keypair(self) -> io::Result { + use NodeKeyConfig::*; + match self { + Secp256k1(Secret::New) => + Ok(Keypair::generate_secp256k1()), + + Secp256k1(Secret::Input(k)) => + Ok(Keypair::Secp256k1(k.into())), + + Secp256k1(Secret::File(f)) => + get_secret(f, + |mut b| secp256k1::SecretKey::from_bytes(&mut b), + secp256k1::SecretKey::generate, + |b| b.to_bytes().to_vec()) + .map(secp256k1::Keypair::from) + .map(Keypair::Secp256k1), + + Ed25519(Secret::New) => + Ok(Keypair::generate_ed25519()), + + Ed25519(Secret::Input(k)) => + Ok(Keypair::Ed25519(k.into())), + + Ed25519(Secret::File(f)) => + get_secret(f, + |mut b| ed25519::SecretKey::from_bytes(&mut b), + ed25519::SecretKey::generate, + |b| b.as_ref().to_vec()) + .map(ed25519::Keypair::from) + .map(Keypair::Ed25519), + } + } +} + +/// 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, serialize: W) -> io::Result +where + P: AsRef, + F: for<'r> FnOnce(&'r mut [u8]) -> Result, + G: FnOnce() -> K, + E: Error + Send + Sync + 'static, + W: Fn(&K) -> Vec, +{ + std::fs::read(&file) + .and_then(|mut sk_bytes| + parse(&mut sk_bytes) + .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))) + .or_else(|e| { + if e.kind() == io::ErrorKind::NotFound { + file.as_ref().parent().map_or(Ok(()), fs::create_dir_all)?; + let sk = generate(); + let mut sk_vec = serialize(&sk); + write_secret_file(file, &sk_vec)?; + sk_vec.zeroize(); + Ok(sk) + } else { + Err(e) + } + }) +} + +/// Write secret bytes to a file. +fn write_secret_file

(path: P, sk_bytes: &[u8]) -> io::Result<()> +where + P: AsRef +{ + let mut file = open_secret_file(&path)?; + file.write_all(sk_bytes) +} + +/// Opens a file containing a secret key in write mode. +#[cfg(unix)] +fn open_secret_file

(path: P) -> io::Result +where + P: AsRef +{ + use std::os::unix::fs::OpenOptionsExt; + fs::OpenOptions::new() + .write(true) + .create_new(true) + .mode(0o600) + .open(path) +} + +/// Opens a file containing a secret key in write mode. +#[cfg(not(unix))] +fn open_secret_file

(path: P) -> Result +where + P: AsRef +{ + fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(path) +} + +#[cfg(test)] +mod tests { + use super::*; + use tempdir::TempDir; + + fn secret_bytes(kp: &Keypair) -> Vec { + match kp { + Keypair::Ed25519(p) => p.secret().as_ref().iter().cloned().collect(), + Keypair::Secp256k1(p) => p.secret().to_bytes().to_vec(), + _ => panic!("Unexpected keypair.") + } + } + + #[test] + fn test_secret_file() { + let tmp = TempDir::new("x").unwrap(); + std::fs::remove_dir(tmp.path()).unwrap(); // should be recreated + let file = tmp.path().join("x").to_path_buf(); + let kp1 = NodeKeyConfig::Ed25519(Secret::File(file.clone())).into_keypair().unwrap(); + let kp2 = NodeKeyConfig::Ed25519(Secret::File(file.clone())).into_keypair().unwrap(); + assert!(file.is_file() && secret_bytes(&kp1) == secret_bytes(&kp2)) + } + + #[test] + fn test_secret_input() { + let sk = secp256k1::SecretKey::generate(); + let kp1 = NodeKeyConfig::Secp256k1(Secret::Input(sk.clone())).into_keypair().unwrap(); + let kp2 = NodeKeyConfig::Secp256k1(Secret::Input(sk)).into_keypair().unwrap(); + assert!(secret_bytes(&kp1) == secret_bytes(&kp2)); + } + + #[test] + fn test_secret_new() { + let kp1 = NodeKeyConfig::Ed25519(Secret::New).into_keypair().unwrap(); + let kp2 = NodeKeyConfig::Ed25519(Secret::New).into_keypair().unwrap(); + assert!(secret_bytes(&kp1) != secret_bytes(&kp2)); + } +} diff --git a/core/network-libp2p/src/custom_proto/behaviour.rs b/core/network/src/custom_proto/behaviour.rs similarity index 97% rename from core/network-libp2p/src/custom_proto/behaviour.rs rename to core/network/src/custom_proto/behaviour.rs index 41b3b32218..975a1d2f3a 100644 --- a/core/network-libp2p/src/custom_proto/behaviour.rs +++ b/core/network/src/custom_proto/behaviour.rs @@ -14,7 +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::{DiscoveryNetBehaviour, ProtocolId}; use crate::custom_proto::handler::{CustomProtoHandlerProto, CustomProtoHandlerOut, CustomProtoHandlerIn}; use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; use fnv::FnvHashMap; @@ -23,7 +23,8 @@ use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourActi use libp2p::core::{Multiaddr, PeerId}; use log::{debug, error, trace, warn}; use smallvec::SmallVec; -use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, time::Duration, time::Instant}; +use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem}; +use std::time::{Duration, Instant}; use tokio_io::{AsyncRead, AsyncWrite}; use tokio_timer::clock::Clock; @@ -62,7 +63,7 @@ pub struct CustomProto { protocol: RegisteredProtocol, /// Receiver for instructions about who to connect to or disconnect from. - peerset: substrate_peerset::Peerset, + peerset: peerset::Peerset, /// List of peers in our state. peers: FnvHashMap, @@ -73,7 +74,7 @@ pub struct CustomProto { /// We generate indices to identify incoming connections. This is the next value for the index /// to use when a connection is incoming. - next_incoming_index: substrate_peerset::IncomingIndex, + next_incoming_index: peerset::IncomingIndex, /// Events to produce from `poll()`. events: SmallVec<[NetworkBehaviourAction, CustomProtoOut>; 4]>, @@ -179,7 +180,7 @@ struct IncomingPeer { /// connection corresponding to it has been closed or replaced already. alive: bool, /// Id that the we sent to the peerset. - incoming_id: substrate_peerset::IncomingIndex, + incoming_id: peerset::IncomingIndex, } /// Event that can be emitted by the `CustomProto`. @@ -224,15 +225,18 @@ pub enum CustomProtoOut { impl CustomProto { /// Creates a `CustomProtos`. pub fn new( - protocol: RegisteredProtocol, - peerset: substrate_peerset::Peerset, + protocol: impl Into, + versions: &[u8], + peerset: peerset::Peerset, ) -> Self { + let protocol = RegisteredProtocol::new(protocol, versions); + CustomProto { protocol, peerset, peers: FnvHashMap::default(), incoming: SmallVec::new(), - next_incoming_index: substrate_peerset::IncomingIndex(0), + next_incoming_index: peerset::IncomingIndex(0), events: SmallVec::new(), marker: PhantomData, clock: Clock::new(), @@ -514,7 +518,7 @@ impl CustomProto { } /// Function that is called when the peerset wants us to accept an incoming node. - fn peerset_report_accept(&mut self, index: substrate_peerset::IncomingIndex) { + fn peerset_report_accept(&mut self, index: peerset::IncomingIndex) { let incoming = if let Some(pos) = self.incoming.iter().position(|i| i.incoming_id == index) { self.incoming.remove(pos) } else { @@ -558,7 +562,7 @@ impl CustomProto { } /// Function that is called when the peerset wants us to reject an incoming node. - fn peerset_report_reject(&mut self, index: substrate_peerset::IncomingIndex) { + fn peerset_report_reject(&mut self, index: peerset::IncomingIndex) { let incoming = if let Some(pos) = self.incoming.iter().position(|i| i.incoming_id == index) { self.incoming.remove(pos) } else { @@ -939,16 +943,16 @@ where // Note that the peerset is a *best effort* crate, and we have to use defensive programming. loop { match self.peerset.poll() { - Ok(Async::Ready(Some(substrate_peerset::Message::Accept(index)))) => { + Ok(Async::Ready(Some(peerset::Message::Accept(index)))) => { self.peerset_report_accept(index); } - Ok(Async::Ready(Some(substrate_peerset::Message::Reject(index)))) => { + Ok(Async::Ready(Some(peerset::Message::Reject(index)))) => { self.peerset_report_reject(index); } - Ok(Async::Ready(Some(substrate_peerset::Message::Connect(id)))) => { + Ok(Async::Ready(Some(peerset::Message::Connect(id)))) => { self.peerset_report_connect(id); } - Ok(Async::Ready(Some(substrate_peerset::Message::Drop(id)))) => { + Ok(Async::Ready(Some(peerset::Message::Drop(id)))) => { self.peerset_report_disconnect(id); } Ok(Async::Ready(None)) => { diff --git a/core/network-libp2p/src/custom_proto/handler.rs b/core/network/src/custom_proto/handler.rs similarity index 100% rename from core/network-libp2p/src/custom_proto/handler.rs rename to core/network/src/custom_proto/handler.rs diff --git a/core/network-libp2p/src/custom_proto/mod.rs b/core/network/src/custom_proto/mod.rs similarity index 93% rename from core/network-libp2p/src/custom_proto/mod.rs rename to core/network/src/custom_proto/mod.rs index 261f710d8d..a4fdebbb31 100644 --- a/core/network-libp2p/src/custom_proto/mod.rs +++ b/core/network/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, RegisteredProtocol}; +pub use self::upgrade::CustomMessage; mod behaviour; mod handler; diff --git a/core/network-libp2p/src/custom_proto/upgrade.rs b/core/network/src/custom_proto/upgrade.rs similarity index 97% rename from core/network-libp2p/src/custom_proto/upgrade.rs rename to core/network/src/custom_proto/upgrade.rs index bc61ff74e8..0df280ad1a 100644 --- a/core/network-libp2p/src/custom_proto/upgrade.rs +++ b/core/network/src/custom_proto/upgrade.rs @@ -62,11 +62,6 @@ impl RegisteredProtocol { marker: PhantomData, } } - - /// Returns the ID of the protocol. - pub fn id(&self) -> &ProtocolId { - &self.id - } } impl Clone for RegisteredProtocol { @@ -93,8 +88,6 @@ pub struct RegisteredProtocolSubstream { requires_poll_complete: bool, /// The underlying substream. inner: stream::Fuse, UviBytes>>>, - /// Id of the protocol. - protocol_id: ProtocolId, /// Version of the protocol that was negotiated. protocol_version: u8, /// If true, we have sent a "remote is clogged" event recently and shouldn't send another one @@ -105,14 +98,7 @@ pub struct RegisteredProtocolSubstream { } impl RegisteredProtocolSubstream { - /// Returns the protocol id. - #[inline] - pub fn protocol_id(&self) -> &ProtocolId { - &self.protocol_id - } - /// Returns the version of the protocol that was negotiated. - #[inline] pub fn protocol_version(&self) -> u8 { self.protocol_version } @@ -310,7 +296,6 @@ where TSubstream: AsyncRead + AsyncWrite, send_queue: VecDeque::new(), requires_poll_complete: false, inner: framed.fuse(), - protocol_id: self.id, protocol_version: info.version, clogged_fuse: false, marker: PhantomData, @@ -338,7 +323,6 @@ where TSubstream: AsyncRead + AsyncWrite, send_queue: VecDeque::new(), requires_poll_complete: false, inner: framed.fuse(), - protocol_id: self.id, protocol_version: info.version, clogged_fuse: false, marker: PhantomData, diff --git a/core/network-libp2p/src/behaviour/debug_info.rs b/core/network/src/debug_info.rs similarity index 98% rename from core/network-libp2p/src/behaviour/debug_info.rs rename to core/network/src/debug_info.rs index 46c7422fd7..f482f13fc2 100644 --- a/core/network-libp2p/src/behaviour/debug_info.rs +++ b/core/network/src/debug_info.rs @@ -133,11 +133,6 @@ impl<'a> Node<'a> { 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. diff --git a/core/network/src/discovery.rs b/core/network/src/discovery.rs new file mode 100644 index 0000000000..4e44d9fa9e --- /dev/null +++ b/core/network/src/discovery.rs @@ -0,0 +1,302 @@ +// 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 futures::prelude::*; +use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, PublicKey}; +use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; +use libp2p::core::swarm::PollParameters; +use libp2p::kad::{Kademlia, KademliaOut}; +use libp2p::multiaddr::Protocol; +use log::{debug, info, trace, warn}; +use std::{cmp, time::Duration}; +use tokio_io::{AsyncRead, AsyncWrite}; +use tokio_timer::{Delay, clock::Clock}; + +/// 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 + /// reserved nodes. + user_defined: Vec<(PeerId, Multiaddr)>, + /// Kademlia requests and answers. + kademlia: Kademlia, + /// Stream that fires when we need to perform the next random Kademlia query. + 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 DiscoveryBehaviour { + /// Builds a new `DiscoveryBehaviour`. + /// + /// `user_defined` is a list of known address for nodes that never expire. + pub fn new(local_public_key: PublicKey, user_defined: Vec<(PeerId, Multiaddr)>) -> Self { + let mut kademlia = Kademlia::new(local_public_key.clone().into_peer_id()); + for (peer_id, addr) in &user_defined { + kademlia.add_address(peer_id, addr.clone()); + } + + let clock = Clock::new(); + DiscoveryBehaviour { + user_defined, + kademlia, + 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(), + } + } + + /// Returns the list of nodes that we know exist in the network. + pub fn known_peers(&mut self) -> impl Iterator { + self.kademlia.kbuckets_entries() + } + + /// Adds a hard-coded address for the given peer, that never expires. + /// + /// This adds an entry to the parameter that was passed to `new`. + pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { + if self.user_defined.iter().all(|(p, a)| *p != peer_id && *a != addr) { + self.user_defined.push((peer_id, addr)); + } + } + + /// Call this method when a node reports an address for itself. + pub fn add_self_reported_address(&mut self, peer_id: &PeerId, addr: Multiaddr) { + self.kademlia.add_address(peer_id, addr); + } +} + +/// Event generated by the `DiscoveryBehaviour`. +pub enum DiscoveryOut { + /// We have discovered a node. Can be called multiple times with the same identity. + Discovered(PeerId), +} + +impl NetworkBehaviour for DiscoveryBehaviour +where + TSubstream: AsyncRead + AsyncWrite, +{ + type ProtocolsHandler = as NetworkBehaviour>::ProtocolsHandler; + type OutEvent = DiscoveryOut; + + fn new_handler(&mut self) -> Self::ProtocolsHandler { + NetworkBehaviour::new_handler(&mut self.kademlia) + } + + fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { + let mut list = self.user_defined.iter() + .filter_map(|(p, a)| if p == peer_id { Some(a.clone()) } else { None }) + .collect::>(); + list.extend(self.kademlia.addresses_of_peer(peer_id)); + trace!(target: "sub-libp2p", "Addresses of {:?} are {:?}", peer_id, list); + if list.is_empty() { + if self.kademlia.kbuckets_entries().any(|p| p == peer_id) { + debug!(target: "sub-libp2p", "Requested dialing to {:?} (peer in k-buckets), \ + and no address was found", peer_id); + } else { + debug!(target: "sub-libp2p", "Requested dialing to {:?} (peer not in k-buckets), \ + and no address was found", peer_id); + } + } + list + } + + fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { + NetworkBehaviour::inject_connected(&mut self.kademlia, peer_id, endpoint) + } + + fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { + NetworkBehaviour::inject_disconnected(&mut self.kademlia, peer_id, endpoint) + } + + fn inject_replaced(&mut self, peer_id: PeerId, closed: ConnectedPoint, opened: ConnectedPoint) { + NetworkBehaviour::inject_replaced(&mut self.kademlia, peer_id, closed, opened) + } + + fn inject_node_event( + &mut self, + peer_id: PeerId, + event: ::OutEvent, + ) { + 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, + ) -> Async< + NetworkBehaviourAction< + ::InEvent, + Self::OutEvent, + >, + > { + // Poll Kademlia. + match self.kademlia.poll(params) { + Async::NotReady => (), + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => { + match ev { + KademliaOut::Discovered { .. } => {} + KademliaOut::KBucketAdded { peer_id, .. } => { + let ev = DiscoveryOut::Discovered(peer_id); + return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaOut::FindNodeResult { key, closer_peers } => { + trace!(target: "sub-libp2p", "Libp2p => Query for {:?} yielded {:?} results", + key, closer_peers.len()); + if closer_peers.is_empty() { + warn!(target: "sub-libp2p", "Libp2p => Random Kademlia query has yielded empty \ + results"); + } + } + // We never start any other type of query. + KademliaOut::GetProvidersResult { .. } => {} + KademliaOut::GetValueResult(_) => {} + KademliaOut::PutValueResult(_) => {} + } + }, + 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 }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + + // Poll the stream that fires when we need to start a random Kademlia query. + loop { + match self.next_kad_random_query.poll() { + Ok(Async::NotReady) => break, + Ok(Async::Ready(_)) => { + let random_peer_id = PeerId::random(); + debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ + {:?}", random_peer_id); + self.kademlia.find_node(random_peer_id); + + // Reset the `Delay` to the next random. + 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)); + }, + Err(err) => { + warn!(target: "sub-libp2p", "Kademlia query timer errored: {:?}", err); + break + } + } + } + + Async::NotReady + } +} + +#[cfg(test)] +mod tests { + use futures::prelude::*; + use libp2p::identity::Keypair; + use libp2p::Multiaddr; + use libp2p::core::{upgrade, Swarm}; + use libp2p::core::transport::{Transport, MemoryTransport}; + use libp2p::core::upgrade::{InboundUpgradeExt, OutboundUpgradeExt}; + use std::collections::HashSet; + use super::{DiscoveryBehaviour, DiscoveryOut}; + + #[test] + fn discovery_working() { + let mut user_defined = Vec::new(); + + // Build swarms whose behaviour is `DiscoveryBehaviour`. + let mut swarms = (0..25).map(|_| { + let keypair = Keypair::generate_ed25519(); + + let transport = MemoryTransport + .with_upgrade(libp2p::secio::SecioConfig::new(keypair.clone())) + .and_then(move |out, endpoint| { + let peer_id = out.remote_key.into_peer_id(); + let peer_id2 = peer_id.clone(); + let upgrade = libp2p::yamux::Config::default() + .map_inbound(move |muxer| (peer_id, muxer)) + .map_outbound(move |muxer| (peer_id2, muxer)); + upgrade::apply(out.stream, upgrade, endpoint) + }); + + let behaviour = DiscoveryBehaviour::new(keypair.public(), user_defined.clone()); + let mut swarm = Swarm::new(transport, behaviour, keypair.public().into_peer_id()); + let listen_addr: Multiaddr = format!("/memory/{}", rand::random::()).parse().unwrap(); + + if user_defined.is_empty() { + user_defined.push((keypair.public().into_peer_id(), listen_addr.clone())); + } + + Swarm::listen_on(&mut swarm, listen_addr.clone()).unwrap(); + (swarm, listen_addr) + }).collect::>(); + + // Build a `Vec>` with the list of nodes remaining to be discovered. + let mut to_discover = (0..swarms.len()).map(|n| { + (0..swarms.len()).filter(|p| *p != n) + .map(|p| Swarm::local_peer_id(&swarms[p].0).clone()) + .collect::>() + }).collect::>(); + + let fut = futures::future::poll_fn(move || -> Result<_, ()> { + loop { + let mut keep_polling = false; + + for swarm_n in 0..swarms.len() { + if let Async::Ready(Some(DiscoveryOut::Discovered(other))) = + swarms[swarm_n].0.poll().unwrap() { + if to_discover[swarm_n].remove(&other) { + keep_polling = true; + // Call `add_self_reported_address` to simulate identify happening. + let addr = swarms.iter() + .find(|s| *Swarm::local_peer_id(&s.0) == other) + .unwrap() + .1.clone(); + swarms[swarm_n].0.add_self_reported_address(&other, addr); + } + } + } + + if !keep_polling { + break; + } + } + + if to_discover.iter().all(|l| l.is_empty()) { + Ok(Async::Ready(())) + } else { + Ok(Async::NotReady) + } + }); + + tokio::runtime::Runtime::new().unwrap().block_on(fut).unwrap(); + } +} diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index a65df59fd8..2ef682f33f 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -23,11 +23,17 @@ //! **Important**: This crate is unstable and the API and usage may change. //! -mod service; -#[macro_use] -mod protocol; +mod behaviour; mod chain; +mod custom_proto; +mod debug_info; +mod discovery; mod on_demand_layer; +#[macro_use] +mod protocol; +mod service; +mod transport; + pub mod config; pub mod error; @@ -39,18 +45,185 @@ pub use service::{ NetworkService, NetworkWorker, FetchFuture, TransactionPool, ManageNetwork, NetworkMsg, SyncProvider, ExHashT, ReportHandle, }; +pub use config::{NodeKeyConfig, Secret, Secp256k1Secret, Ed25519Secret}; pub use protocol::{ProtocolStatus, PeerInfo, Context, consensus_gossip, message, specialization}; pub use protocol::sync::{Status as SyncStatus, SyncState}; -pub use network_libp2p::{ - identity, multiaddr, - ProtocolId, Multiaddr, - NetworkState, NetworkStatePeer, NetworkStateNotConnectedPeer, NetworkStatePeerEndpoint, - NodeKeyConfig, Secret, Secp256k1Secret, Ed25519Secret, - build_multiaddr, PeerId, PublicKey -}; +pub use libp2p::{Multiaddr, multiaddr, build_multiaddr}; +pub use libp2p::{identity, PeerId, core::PublicKey}; + pub use message::{generic as generic_message, RequestId, Status as StatusMessage}; pub use error::Error; pub use protocol::on_demand::AlwaysBadChecker; pub use on_demand_layer::{OnDemand, RemoteResponse}; #[doc(hidden)] pub use runtime_primitives::traits::Block as BlockT; + +use libp2p::core::nodes::ConnectedPoint; +use serde::{Deserialize, Serialize}; +use slog_derive::SerdeValue; +use std::{collections::{HashMap, HashSet}, fmt, time::Duration}; + +/// 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> { + let mut addr: Multiaddr = addr_str.parse()?; + + let who = match addr.pop() { + Some(multiaddr::Protocol::P2p(key)) => PeerId::from_multihash(key) + .map_err(|_| ParseErr::InvalidPeerId)?, + _ => return Err(ParseErr::PeerIdMissing), + }; + + Ok((who, addr)) +} + +/// Error that can be generated by `parse_str_addr`. +#[derive(Debug)] +pub enum ParseErr { + /// Error while parsing the multiaddress. + MultiaddrParse(multiaddr::Error), + /// Multihash of the peer ID is invalid. + InvalidPeerId, + /// The peer ID is missing from the address. + PeerIdMissing, +} + +impl fmt::Display for ParseErr { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ParseErr::MultiaddrParse(err) => write!(f, "{}", err), + ParseErr::InvalidPeerId => write!(f, "Peer id at the end of the address is invalid"), + ParseErr::PeerIdMissing => write!(f, "Peer id is missing from the address"), + } + } +} + +impl std::error::Error for ParseErr { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + ParseErr::MultiaddrParse(err) => Some(err), + ParseErr::InvalidPeerId => None, + ParseErr::PeerIdMissing => None, + } + } +} + +impl From for ParseErr { + fn from(err: multiaddr::Error) -> ParseErr { + ParseErr::MultiaddrParse(err) + } +} + +/// Returns general information about the networking. +/// +/// Meant for general diagnostic purposes. +/// +/// **Warning**: This API is not stable. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, SerdeValue)] +#[serde(rename_all = "camelCase")] +pub struct NetworkState { + /// PeerId of the local node. + pub peer_id: String, + /// List of addresses the node is currently listening on. + pub listened_addresses: HashSet, + /// List of addresses the node knows it can be reached as. + pub external_addresses: HashSet, + /// List of node we're connected to. + pub connected_peers: HashMap, + /// List of node that we know of but that we're not connected to. + pub not_connected_peers: HashMap, + /// Downloaded bytes per second averaged over the past few seconds. + pub average_download_per_sec: u64, + /// Uploaded bytes per second averaged over the past few seconds. + pub average_upload_per_sec: u64, + /// State of the peerset manager. + pub peerset: serde_json::Value, +} + +/// Part of the `NetworkState` struct. Unstable. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct NetworkStatePeer { + /// How we are connected to the node. + pub endpoint: NetworkStatePeerEndpoint, + /// Node information, as provided by the node itself. Can be empty if not known yet. + pub version_string: Option, + /// Latest ping duration with this node. + pub latest_ping_time: Option, + /// If true, the peer is "enabled", which means that we try to open Substrate-related protocols + /// with this peer. If false, we stick to Kademlia and/or other network-only protocols. + pub enabled: bool, + /// If true, the peer is "open", which means that we have a Substrate-related protocol + /// with this peer. + pub open: bool, + /// List of addresses known for this node. + pub known_addresses: HashSet, +} + +/// Part of the `NetworkState` struct. Unstable. +#[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, +} + +/// Part of the `NetworkState` struct. Unstable. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum NetworkStatePeerEndpoint { + /// We are dialing the given address. + Dialing(Multiaddr), + /// We are listening. + Listening { + /// Address we're listening on that received the connection. + listen_addr: Multiaddr, + /// Address data is sent back to. + send_back_addr: Multiaddr, + }, +} + +impl From for NetworkStatePeerEndpoint { + fn from(endpoint: ConnectedPoint) -> Self { + match endpoint { + ConnectedPoint::Dialer { address } => + NetworkStatePeerEndpoint::Dialing(address), + ConnectedPoint::Listener { listen_addr, send_back_addr } => + NetworkStatePeerEndpoint::Listening { + listen_addr, + send_back_addr + } + } + } +} diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 576d37a82f..4b300e7a3e 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use futures::prelude::*; -use network_libp2p::PeerId; +use libp2p::PeerId; use primitives::storage::StorageKey; use consensus::{import_queue::IncomingBlock, import_queue::Origin, BlockOrigin}; use runtime_primitives::{generic::BlockId, ConsensusEngineId, Justification}; @@ -618,15 +618,15 @@ impl, H: ExHashT> Protocol { } /// Called when a new peer is connected - pub fn on_peer_connected(&mut self, network_out: &mut dyn NetworkOut, who: PeerId, debug_info: String) { - trace!(target: "sync", "Connecting {}: {}", who, debug_info); + pub fn on_peer_connected(&mut self, network_out: &mut dyn NetworkOut, who: PeerId) { + trace!(target: "sync", "Connecting {}", who); self.handshaking_peers.insert(who.clone(), HandshakingPeer { timestamp: time::Instant::now() }); self.send_status(network_out, who); } /// Called by peer when it is disconnecting - 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); + pub fn on_peer_disconnected(&mut self, mut network_out: &mut dyn NetworkOut, peer: PeerId) { + trace!(target: "sync", "Disconnecting {}", peer); // lock all the the peer lists so that add/remove peer events are in order let removed = { self.handshaking_peers.remove(&peer); diff --git a/core/network/src/protocol/consensus_gossip.rs b/core/network/src/protocol/consensus_gossip.rs index 5de6fb2602..a1c9783b91 100644 --- a/core/network/src/protocol/consensus_gossip.rs +++ b/core/network/src/protocol/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::PeerId; +use libp2p::PeerId; use runtime_primitives::traits::{Block as BlockT, Hash, HashFor}; use runtime_primitives::ConsensusEngineId; pub use crate::message::generic::{Message, ConsensusMessage}; diff --git a/core/network/src/protocol/message.rs b/core/network/src/protocol/message.rs index 6a38c106b7..7b9b684cd8 100644 --- a/core/network/src/protocol/message.rs +++ b/core/network/src/protocol/message.rs @@ -125,8 +125,8 @@ pub struct RemoteReadResponse { /// Generic types. pub mod generic { + use crate::custom_proto::CustomMessage; use parity_codec::{Encode, Decode}; - use network_libp2p::CustomMessage; use runtime_primitives::Justification; use crate::config::Roles; use super::{ diff --git a/core/network/src/protocol/on_demand.rs b/core/network/src/protocol/on_demand.rs index 90051e9caf..76c926df10 100644 --- a/core/network/src/protocol/on_demand.rs +++ b/core/network/src/protocol/on_demand.rs @@ -27,7 +27,7 @@ use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof, RemoteReadChildRequest, RemoteBodyRequest}; use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; -use network_libp2p::PeerId; +use libp2p::PeerId; use crate::config::Roles; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; @@ -644,7 +644,7 @@ pub mod tests { RemoteReadChildRequest, RemoteChangesRequest, RemoteBodyRequest}; use crate::config::Roles; use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; - use network_libp2p::PeerId; + use libp2p::PeerId; use super::{REQUEST_TIMEOUT, OnDemandCore, OnDemandNetwork, RequestData}; use test_client::runtime::{changes_trie_config, Block, Extrinsic, Header}; diff --git a/core/network/src/protocol/specialization.rs b/core/network/src/protocol/specialization.rs index e8a0a0c949..41b10bf707 100644 --- a/core/network/src/protocol/specialization.rs +++ b/core/network/src/protocol/specialization.rs @@ -16,9 +16,9 @@ //! Specializations of the substrate network protocol to allow more complex forms of communication. -use crate::PeerId; -use runtime_primitives::traits::Block as BlockT; use crate::protocol::Context; +use libp2p::PeerId; +use runtime_primitives::traits::Block as BlockT; /// A specialization of the substrate network protocol. Handles events and sends messages. pub trait NetworkSpecialization: Send + Sync + 'static { diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs index 4ec8f18e35..0f78348b18 100644 --- a/core/network/src/protocol/sync.rs +++ b/core/network/src/protocol/sync.rs @@ -35,7 +35,7 @@ use std::ops::Range; use std::collections::{HashMap, VecDeque}; use log::{debug, trace, warn, info, error}; use crate::protocol::PeerInfo as ProtocolPeerInfo; -use network_libp2p::PeerId; +use libp2p::PeerId; use client::{BlockStatus, ClientInfo}; use consensus::{BlockOrigin, import_queue::{IncomingBlock, SharedFinalityProofRequestBuilder}}; use client::error::Error as ClientError; diff --git a/core/network/src/protocol/sync/blocks.rs b/core/network/src/protocol/sync/blocks.rs index 66730fcc3e..ff8d9907af 100644 --- a/core/network/src/protocol/sync/blocks.rs +++ b/core/network/src/protocol/sync/blocks.rs @@ -20,7 +20,7 @@ use std::ops::Range; use std::collections::{HashMap, BTreeMap}; use std::collections::hash_map::Entry; use log::trace; -use network_libp2p::PeerId; +use libp2p::PeerId; use runtime_primitives::traits::{Block as BlockT, NumberFor, One}; use crate::message; diff --git a/core/network/src/protocol/sync/extra_requests.rs b/core/network/src/protocol/sync/extra_requests.rs index f41997a05c..589a5d3787 100644 --- a/core/network/src/protocol/sync/extra_requests.rs +++ b/core/network/src/protocol/sync/extra_requests.rs @@ -20,7 +20,7 @@ use log::{trace, warn}; use client::error::Error as ClientError; use consensus::import_queue::SharedFinalityProofRequestBuilder; use fork_tree::ForkTree; -use network_libp2p::PeerId; +use libp2p::PeerId; use runtime_primitives::Justification; use runtime_primitives::traits::{Block as BlockT, NumberFor}; use crate::protocol::message; diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 6a328e854d..7009310a8d 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -15,16 +15,20 @@ // along with Substrate. If not, see . use std::collections::HashMap; -use std::io; +use std::{fs, io, path::Path}; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use std::time::Duration; use log::{warn, debug, error, info}; +use libp2p::core::swarm::NetworkBehaviour; +use libp2p::core::{nodes::Substream, transport::boxed::Boxed, muxing::StreamMuxerBox}; use futures::{prelude::*, sync::oneshot, sync::mpsc}; use parking_lot::{Mutex, RwLock}; -use network_libp2p::{start_service, parse_str_addr, Service as Libp2pNetService, ServiceEvent as Libp2pNetServiceEvent}; -use network_libp2p::{RegisteredProtocol, NetworkState}; +use crate::custom_proto::{CustomProto, CustomProtoOut}; +use crate::{behaviour::Behaviour, parse_str_addr, ProtocolId}; +use crate::{NetworkState, NetworkStateNotConnectedPeer, NetworkStatePeer}; +use crate::{transport, config::NodeKeyConfig, config::NonReservedPeerMode, config::NetworkConfiguration}; use peerset::PeersetHandle; use consensus::import_queue::{ImportQueue, Link, SharedFinalityProofRequestBuilder}; use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; @@ -40,12 +44,14 @@ use crate::config::Params; use crate::error::Error; use crate::protocol::specialization::NetworkSpecialization; +mod tests; + /// 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; +pub use libp2p::PeerId; /// Type that represents fetch completion future. pub type FetchFuture = oneshot::Receiver>; @@ -187,7 +193,9 @@ pub struct NetworkService> { /// Channel for networking messages processed by the background thread. network_chan: mpsc::UnboundedSender>, /// Network service - network: Arc>>>, + network: Arc>>, + /// Bandwidth logging system. Can be queried to know the average bandwidth consumed. + bandwidth: Arc, /// Peerset manager (PSM); manages the reputation of nodes and indicates the network which /// nodes it should be connected to or not. peerset: PeersetHandle, @@ -227,19 +235,20 @@ impl, H: ExHashT> NetworkWorker params.specialization, )?; let versions: Vec<_> = ((protocol::MIN_VERSION as u8)..=(protocol::CURRENT_VERSION as u8)).collect(); - let registered = RegisteredProtocol::new(params.protocol_id, &versions); // Start the main service. - let (network, peerset) = match start_service(params.network_config, registered) { - Ok((network, peerset)) => (Arc::new(Mutex::new(network)), peerset), - Err(err) => { - warn!("Error starting network: {}", err); - return Err(err.into()) - }, - }; + let (network, bandwidth, peerset) = + match start_service::(params.network_config, params.protocol_id, &versions) { + Ok((network, bandwidth, peerset)) => (Arc::new(Mutex::new(network)), bandwidth, peerset), + Err(err) => { + warn!("Error starting network: {}", err); + return Err(err.into()) + }, + }; let service = Arc::new(NetworkService { status_sinks: status_sinks.clone(), + bandwidth, is_offline: is_offline.clone(), is_major_syncing: is_major_syncing.clone(), network_chan, @@ -278,20 +287,18 @@ impl, H: ExHashT> NetworkWorker impl> NetworkService { /// Returns the downloaded bytes per second averaged over the past few seconds. - #[inline] pub fn average_download_per_sec(&self) -> u64 { - self.network.lock().average_download_per_sec() + self.bandwidth.average_download_per_sec() } /// Returns the uploaded bytes per second averaged over the past few seconds. - #[inline] pub fn average_upload_per_sec(&self) -> u64 { - self.network.lock().average_upload_per_sec() + self.bandwidth.average_upload_per_sec() } /// Returns the network identity of the node. pub fn local_peer_id(&self) -> PeerId { - self.network.lock().peer_id().clone() + Swarm::::local_peer_id(&*self.network.lock()).clone() } /// Called when a new block is imported by the client. @@ -404,7 +411,58 @@ impl> SyncProvider for Netwo } fn network_state(&self) -> NetworkState { - self.network.lock().state() + let mut swarm = self.network.lock(); + let open = swarm.user_protocol().open_peers().cloned().collect::>(); + + let connected_peers = { + let swarm = &mut *swarm; + open.iter().filter_map(move |peer_id| { + let known_addresses = NetworkBehaviour::addresses_of_peer(&mut **swarm, peer_id) + .into_iter().collect(); + + 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 *swarm; + 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(), + }) + }).collect() + }; + + NetworkState { + peer_id: Swarm::::local_peer_id(&swarm).to_base58(), + listened_addresses: Swarm::::listeners(&swarm).cloned().collect(), + external_addresses: Swarm::::external_addresses(&swarm).cloned().collect(), + average_download_per_sec: self.bandwidth.average_download_per_sec(), + average_upload_per_sec: self.bandwidth.average_upload_per_sec(), + connected_peers, + not_connected_peers, + peerset: swarm.user_protocol_mut().peerset_debug_info(), + } } fn peers_debug_info(&self) -> Vec<(PeerId, PeerInfo)> { @@ -533,7 +591,7 @@ pub struct NetworkWorker, H: Ex protocol: Protocol, /// The network service that can be extracted and shared through the codebase. service: Arc>, - network_service: Arc>>>, + network_service: Arc>>, peers: Arc>>>, import_queue: Box>, transaction_pool: Arc>, @@ -556,16 +614,16 @@ impl, H: ExHashT> Future for Ne fn poll(&mut self) -> Poll { // Implementation of `protocol::NetworkOut` using the available local variables. - struct Context<'a, B: BlockT>(&'a mut Libp2pNetService>, &'a PeersetHandle); + struct Context<'a, B: BlockT>(&'a mut Swarm, &'a PeersetHandle); impl<'a, B: BlockT> NetworkOut for Context<'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) + self.0.user_protocol_mut().disconnect_peer(&who) } fn send_message(&mut self, who: PeerId, message: Message) { - self.0.send_custom_message(&who, message) + self.0.user_protocol_mut().send_packet(&who, message) } } @@ -598,11 +656,11 @@ impl, H: ExHashT> Future for Ne match self.network_port.poll() { Ok(Async::NotReady) => break, Ok(Async::Ready(Some(NetworkMsg::Outgoing(who, outgoing_message)))) => - self.network_service.lock().send_custom_message(&who, outgoing_message), + self.network_service.lock().user_protocol_mut().send_packet(&who, outgoing_message), Ok(Async::Ready(Some(NetworkMsg::ReportPeer(who, reputation)))) => self.peerset.report_peer(who, reputation), Ok(Async::Ready(Some(NetworkMsg::DisconnectPeer(who)))) => - self.network_service.lock().drop_node(&who), + self.network_service.lock().user_protocol_mut().disconnect_peer(&who), #[cfg(any(test, feature = "test-helpers"))] Ok(Async::Ready(Some(NetworkMsg::Synchronized))) => {} @@ -672,19 +730,19 @@ impl, H: ExHashT> Future for Ne let outcome = match poll_value { Ok(Async::NotReady) => break, - Ok(Async::Ready(Some(Libp2pNetServiceEvent::OpenedCustomProtocol { peer_id, version, debug_info, .. }))) => { + Ok(Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { peer_id, version, .. }))) => { debug_assert!( version <= protocol::CURRENT_VERSION as u8 && version >= protocol::MIN_VERSION as u8 ); - self.protocol.on_peer_connected(&mut network_out, peer_id, debug_info); + self.protocol.on_peer_connected(&mut network_out, peer_id); CustomMessageOutcome::None } - Ok(Async::Ready(Some(Libp2pNetServiceEvent::ClosedCustomProtocol { peer_id, debug_info, .. }))) => { - self.protocol.on_peer_disconnected(&mut network_out, peer_id, debug_info); + Ok(Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { peer_id, .. }))) => { + self.protocol.on_peer_disconnected(&mut network_out, peer_id); CustomMessageOutcome::None }, - Ok(Async::Ready(Some(Libp2pNetServiceEvent::CustomMessage { peer_id, message, .. }))) => + Ok(Async::Ready(Some(CustomProtoOut::CustomMessage { peer_id, message }))) => self.protocol.on_custom_message( &mut network_out, &*self.transaction_pool, @@ -692,7 +750,7 @@ impl, H: ExHashT> Future for Ne message, self.finality_proof_provider.as_ref().map(|p| &**p) ), - Ok(Async::Ready(Some(Libp2pNetServiceEvent::Clogged { peer_id, messages, .. }))) => { + Ok(Async::Ready(Some(CustomProtoOut::Clogged { peer_id, messages, .. }))) => { debug!(target: "sync", "{} clogging messages:", messages.len()); for msg in messages.into_iter().take(5) { debug!(target: "sync", "{:?}", msg); @@ -724,3 +782,93 @@ impl, H: ExHashT> Future for Ne Ok(Async::NotReady) } } + +/// The libp2p swarm, customized for our needs. +type Swarm = libp2p::core::Swarm< + Boxed<(PeerId, StreamMuxerBox), io::Error>, + Behaviour, Substream>, CustomProtoOut>, Substream> +>; + +/// Starts the substrate libp2p service. +/// +/// Returns a stream that must be polled regularly in order for the networking to function. +fn start_service>( + config: NetworkConfiguration, + protocol_id: Pid, + versions: &[u8], +) -> Result<(Swarm, Arc, peerset::PeersetHandle), io::Error> { + + if let Some(ref path) = config.net_config_path { + fs::create_dir_all(Path::new(path))?; + } + + // List of multiaddresses that we know in the network. + let mut known_addresses = Vec::new(); + let mut bootnodes = Vec::new(); + let mut reserved_nodes = Vec::new(); + + // Process the bootnodes. + for bootnode in config.boot_nodes.iter() { + match parse_str_addr(bootnode) { + Ok((peer_id, addr)) => { + bootnodes.push(peer_id.clone()); + known_addresses.push((peer_id, addr)); + }, + Err(_) => warn!(target: "sub-libp2p", "Not a valid bootnode address: {}", bootnode), + } + } + + // Initialize the reserved peers. + for reserved in config.reserved_nodes.iter() { + if let Ok((peer_id, addr)) = parse_str_addr(reserved) { + reserved_nodes.push(peer_id.clone()); + known_addresses.push((peer_id, addr)); + } else { + warn!(target: "sub-libp2p", "Not a valid reserved node address: {}", reserved); + } + } + + // Build the peerset. + let (peerset, peerset_handle) = peerset::Peerset::from_config(peerset::PeersetConfig { + in_peers: config.in_peers, + out_peers: config.out_peers, + bootnodes, + reserved_only: config.non_reserved_mode == NonReservedPeerMode::Deny, + reserved_nodes, + }); + + // Private and public keys configuration. + if let NodeKeyConfig::Secp256k1(_) = config.node_key { + warn!(target: "sub-libp2p", "Secp256k1 keys are deprecated in favour of ed25519"); + } + 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 proto = CustomProto::new(protocol_id, versions, peerset); + let behaviour = Behaviour::new(proto, user_agent, local_public, known_addresses, config.enable_mdns); + let (transport, bandwidth) = transport::build_transport( + local_identity, + config.wasm_external_transport + ); + (Swarm::::new(transport, behaviour, local_peer_id.clone()), bandwidth) + }; + + // Listen on multiaddresses. + for addr in &config.listen_addresses { + if let Err(err) = Swarm::::listen_on(&mut swarm, addr.clone()) { + warn!(target: "sub-libp2p", "Can't listen on {} because: {:?}", addr, err) + } + } + + // Add external addresses. + for addr in &config.public_addresses { + Swarm::::add_external_address(&mut swarm, addr.clone()); + } + + Ok((swarm, bandwidth, peerset_handle)) +} diff --git a/core/network-libp2p/tests/test.rs b/core/network/src/service/tests.rs similarity index 79% rename from core/network-libp2p/tests/test.rs rename to core/network/src/service/tests.rs index 36e00e1318..1bcd4e90f9 100644 --- a/core/network-libp2p/tests/test.rs +++ b/core/network/src/service/tests.rs @@ -14,17 +14,23 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +#![cfg(test)] + use futures::{future, stream, prelude::*, try_ready}; +use libp2p::core::swarm::ExpandedSwarm; use rand::seq::SliceRandom; +use runtime_primitives::traits::Block as BlockT; use std::{io, time::Duration, time::Instant}; -use substrate_network_libp2p::{CustomMessage, Multiaddr, multiaddr::Protocol, ServiceEvent, build_multiaddr}; +use test_client::runtime::Block; +use crate::protocol::message::generic::Message; +use crate::{Multiaddr, multiaddr::Protocol, build_multiaddr}; +use crate::custom_proto::CustomProtoOut; +use super::{start_service, Swarm}; /// 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, base_port: u16) -> Vec> - where TMsg: CustomMessage + Send + 'static -{ - let mut result: Vec> = Vec::with_capacity(num); +fn build_nodes(num: usize, base_port: u16) -> Vec> { + let mut result: Vec> = Vec::with_capacity(num); let mut first_addr = None::; for index in 0 .. num { @@ -32,22 +38,21 @@ fn build_nodes(num: usize, base_port: u16) -> Vec(config, &b"tst"[..], &[1]).unwrap().0); } result @@ -56,7 +61,7 @@ fn build_nodes(num: usize, base_port: u16) -> Vec>(2, 50400).into_iter(); + let mut l = build_nodes::(2, 50400).into_iter(); let a = l.next().unwrap(); let b = l.next().unwrap(); (a, b) @@ -64,7 +69,7 @@ fn basic_two_nodes_connectivity() { let fut1 = future::poll_fn(move || -> io::Result<_> { match try_ready!(service1.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { version, .. }) => { + Some(CustomProtoOut::CustomProtocolOpen { version, .. }) => { assert_eq!(version, 1); Ok(Async::Ready(())) }, @@ -74,7 +79,7 @@ fn basic_two_nodes_connectivity() { let fut2 = future::poll_fn(move || -> io::Result<_> { match try_ready!(service2.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { version, .. }) => { + Some(CustomProtoOut::CustomProtocolOpen { version, .. }) => { assert_eq!(version, 1); Ok(Async::Ready(())) }, @@ -96,7 +101,7 @@ fn two_nodes_transfer_lots_of_packets() { const NUM_PACKETS: u32 = 5000; let (mut service1, mut service2) = { - let mut l = build_nodes::>(2, 50450).into_iter(); + let mut l = build_nodes::(2, 50450).into_iter(); let a = l.next().unwrap(); let b = l.next().unwrap(); (a, b) @@ -105,9 +110,12 @@ fn two_nodes_transfer_lots_of_packets() { let fut1 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service1.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { peer_id, .. }) => { + Some(CustomProtoOut::CustomProtocolOpen { peer_id, .. }) => { for n in 0 .. NUM_PACKETS { - service1.send_custom_message(&peer_id, vec![(n % 256) as u8]); + service1.user_protocol_mut().send_packet( + &peer_id, + Message::ChainSpecific(vec![(n % 256) as u8]) + ); } }, _ => panic!(), @@ -119,8 +127,8 @@ fn two_nodes_transfer_lots_of_packets() { let fut2 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service2.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { .. }) => {}, - Some(ServiceEvent::CustomMessage { message, .. }) => { + Some(CustomProtoOut::CustomProtocolOpen { .. }) => {}, + Some(CustomProtoOut::CustomMessage { message: Message::ChainSpecific(message), .. }) => { assert_eq!(message.len(), 1); packet_counter += 1; if packet_counter == NUM_PACKETS { @@ -144,25 +152,21 @@ fn many_nodes_connectivity() { // increased in the `NetworkConfiguration`. const NUM_NODES: usize = 25; - let mut futures = build_nodes::>(NUM_NODES, 50500) + 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 * 2048; // 2kiB/s/node - assert!(node.average_download_per_sec() < MAX_BANDWIDTH); - assert!(node.average_upload_per_sec() < MAX_BANDWIDTH); - match try_ready!(node.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { .. }) => { + Some(CustomProtoOut::CustomProtocolOpen { .. }) => { num_connecs += 1; assert!(num_connecs < NUM_NODES); if num_connecs == NUM_NODES - 1 { return Ok(Async::Ready(Some(true))) } } - Some(ServiceEvent::ClosedCustomProtocol { .. }) => { + Some(CustomProtoOut::CustomProtocolClosed { .. }) => { let was_success = num_connecs == NUM_NODES - 1; num_connecs -= 1; if was_success && num_connecs < NUM_NODES - 1 { @@ -200,7 +204,7 @@ fn many_nodes_connectivity() { #[test] fn basic_two_nodes_requests_in_parallel() { let (mut service1, mut service2) = { - let mut l = build_nodes::>(2, 50550).into_iter(); + let mut l = build_nodes::(2, 50550).into_iter(); let a = l.next().unwrap(); let b = l.next().unwrap(); (a, b) @@ -211,7 +215,7 @@ fn basic_two_nodes_requests_in_parallel() { let mut to_send = Vec::new(); for _ in 0..200 { // Note: don't make that number too high or the CPU usage will explode. let msg = (0..10).map(|_| rand::random::()).collect::>(); - to_send.push(msg); + to_send.push(Message::ChainSpecific(msg)); } to_send }; @@ -224,9 +228,9 @@ fn basic_two_nodes_requests_in_parallel() { let fut1 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service1.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { peer_id, .. }) => { + Some(CustomProtoOut::CustomProtocolOpen { peer_id, .. }) => { for msg in to_send.drain(..) { - service1.send_custom_message(&peer_id, msg); + service1.user_protocol_mut().send_packet(&peer_id, msg); } }, _ => panic!(), @@ -237,8 +241,8 @@ fn basic_two_nodes_requests_in_parallel() { let fut2 = future::poll_fn(move || -> io::Result<_> { loop { match try_ready!(service2.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { .. }) => {}, - Some(ServiceEvent::CustomMessage { message, .. }) => { + Some(CustomProtoOut::CustomProtocolOpen { .. }) => {}, + Some(CustomProtoOut::CustomMessage { message, .. }) => { let pos = to_receive.iter().position(|m| *m == message).unwrap(); to_receive.remove(pos); if to_receive.is_empty() { @@ -260,7 +264,7 @@ fn reconnect_after_disconnect() { // 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 mut l = build_nodes::(2, 50350).into_iter(); let a = l.next().unwrap(); let b = l.next().unwrap(); (a, b) @@ -281,19 +285,19 @@ fn reconnect_after_disconnect() { let mut service1_not_ready = false; match service1.poll().unwrap() { - Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { .. })) => { + Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { .. })) => { match service1_state { ServiceState::NotConnected => { service1_state = ServiceState::FirstConnec; if service2_state == ServiceState::FirstConnec { - service1.drop_node(service2.peer_id()); + service1.user_protocol_mut().disconnect_peer(ExpandedSwarm::local_peer_id(&service2)); } }, ServiceState::Disconnected => service1_state = ServiceState::ConnectedAgain, ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), } }, - Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { .. })) => { + Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { .. })) => { match service1_state { ServiceState::FirstConnec => service1_state = ServiceState::Disconnected, ServiceState::ConnectedAgain| ServiceState::NotConnected | @@ -305,19 +309,19 @@ fn reconnect_after_disconnect() { } match service2.poll().unwrap() { - Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { .. })) => { + Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { .. })) => { match service2_state { ServiceState::NotConnected => { service2_state = ServiceState::FirstConnec; if service1_state == ServiceState::FirstConnec { - service1.drop_node(service2.peer_id()); + service1.user_protocol_mut().disconnect_peer(ExpandedSwarm::local_peer_id(&service2)); } }, ServiceState::Disconnected => service2_state = ServiceState::ConnectedAgain, ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), } }, - Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { .. })) => { + Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { .. })) => { match service2_state { ServiceState::FirstConnec => service2_state = ServiceState::Disconnected, ServiceState::ConnectedAgain| ServiceState::NotConnected | diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index b27214d07b..1f41c43e07 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -42,7 +42,7 @@ use consensus::{BlockOrigin, ForkChoiceStrategy, ImportBlock, JustificationImpor use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient, TopicNotification}; use futures::{prelude::*, sync::{mpsc, oneshot}}; use crate::message::Message; -use network_libp2p::PeerId; +use libp2p::PeerId; use parking_lot::{Mutex, RwLock}; use primitives::{H256, sr25519::Public as AuthorityId, Blake2Hasher}; use crate::protocol::{Context, Protocol, ProtocolConfig, ProtocolStatus, CustomMessageOutcome, NetworkOut}; @@ -296,10 +296,10 @@ pub struct Peer> { type MessageFilter = dyn 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 peer connected. + PeerConnected(PeerId), + /// A peer disconnected. + PeerDisconnected(PeerId), /// A custom message from another peer. CustomMessage(PeerId, Message), /// Synchronization request. @@ -504,12 +504,12 @@ impl> Peer { /// Called on connection to other indicated peer. fn on_connect(&self, other: &Self) { - self.net_proto_channel.send_from_net(FromNetworkMsg::PeerConnected(other.peer_id.clone(), String::new())); + self.net_proto_channel.send_from_net(FromNetworkMsg::PeerConnected(other.peer_id.clone())); } /// Called on disconnect from other indicated peer. fn on_disconnect(&self, other: &Self) { - self.net_proto_channel.send_from_net(FromNetworkMsg::PeerDisconnected(other.peer_id.clone(), String::new())); + self.net_proto_channel.send_from_net(FromNetworkMsg::PeerDisconnected(other.peer_id.clone())); } /// Receive a message from another peer. Return a set of peers to disconnect. @@ -828,12 +828,12 @@ pub trait TestNetFactory: Sized { 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); + Some(FromNetworkMsg::PeerConnected(peer_id)) => { + protocol.on_peer_connected(&mut Ctxt(&network_sender), peer_id); CustomMessageOutcome::None }, - Some(FromNetworkMsg::PeerDisconnected(peer_id, debug_msg)) => { - protocol.on_peer_disconnected(&mut Ctxt(&network_sender), peer_id, debug_msg); + Some(FromNetworkMsg::PeerDisconnected(peer_id)) => { + protocol.on_peer_disconnected(&mut Ctxt(&network_sender), peer_id); CustomMessageOutcome::None }, Some(FromNetworkMsg::CustomMessage(peer_id, message)) => diff --git a/core/network-libp2p/src/transport.rs b/core/network/src/transport.rs similarity index 100% rename from core/network-libp2p/src/transport.rs rename to core/network/src/transport.rs -- GitLab From b96ddc3078a8a263ed3022860a8580e693af30d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Thu, 13 Jun 2019 18:23:04 +0200 Subject: [PATCH 112/140] Various minor fixes (#2860) * Make sr-api-macros benchmark work again It broke with 70cf5b0fab30626bc721c4eedba51405bd2afcee. * Give better indication of import progress * Only send consensus info when explicitly enabled This is only necessary for validators and they can explicitly enable it via --telemetry-url 'wss://telemetry.polkadot.io 1' (or some other endpoint) * Remove unnecessary mutable * Fix style --- core/service/src/chain_ops.rs | 9 ++++++++- core/sr-api-macros/benches/bench.rs | 9 ++++++--- core/telemetry/src/lib.rs | 2 +- test-utils/transaction-factory/src/complex_mode.rs | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index 83f103ec8f..a0d17bd7a5 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -175,7 +175,7 @@ pub fn import_blocks( block_count = b; if b % 1000 == 0 { - info!("#{}", b); + info!("#{} blocks were added to the queue", b); } } @@ -184,6 +184,13 @@ pub fn import_blocks( wait_recv.recv() .expect("Importing thread has panicked. Then the main process will die before this can be reached. qed."); blocks_imported += 1; + if blocks_imported % 1000 == 0 { + info!( + "#{} blocks were imported (#{} left)", + blocks_imported, + count - blocks_imported + ); + } } info!("Imported {} blocks. Best: #{}", block_count, client.info().chain.best_number); diff --git a/core/sr-api-macros/benches/bench.rs b/core/sr-api-macros/benches/bench.rs index 55399fb4d8..054f73c3d4 100644 --- a/core/sr-api-macros/benches/bench.rs +++ b/core/sr-api-macros/benches/bench.rs @@ -15,7 +15,10 @@ // along with Substrate. If not, see . use criterion::{Criterion, criterion_group, criterion_main}; -use test_client::runtime::TestAPI; +use test_client::{ + DefaultTestClientBuilderExt, TestClientBuilder, + TestClientBuilderExt, runtime::TestAPI, +}; use runtime_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; use state_machine::ExecutionStrategy; @@ -53,13 +56,13 @@ fn sr_api_benchmark(c: &mut Criterion) { }); c.bench_function("calling function by function pointer in wasm", |b| { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_indirect_call(&block_id).unwrap()) }); c.bench_function("calling function in wasm", |b| { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_direct_call(&block_id).unwrap()) }); diff --git a/core/telemetry/src/lib.rs b/core/telemetry/src/lib.rs index 3e5d8278b0..d17dd43169 100644 --- a/core/telemetry/src/lib.rs +++ b/core/telemetry/src/lib.rs @@ -111,7 +111,7 @@ 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 = "0"; +pub const CONSENSUS_INFO: &str = "1"; /// Telemetry object. Implements `Future` and must be polled regularly. /// Contains an `Arc` and can be cloned and pass around. Only one clone needs to be polled diff --git a/test-utils/transaction-factory/src/complex_mode.rs b/test-utils/transaction-factory/src/complex_mode.rs index 6200affaea..0d383c3025 100644 --- a/test-utils/transaction-factory/src/complex_mode.rs +++ b/test-utils/transaction-factory/src/complex_mode.rs @@ -83,7 +83,7 @@ where let seed = factory_state.start_number() + factory_state.block_no(); let to = RA::gen_random_account_id(&seed); - let mut amount; + let amount; if factory_state.round() == RA::Number::zero() { amount = RA::minimum_balance() * factory_state.rounds(); } else { -- GitLab From 879e4a8975c3f8717452a287d5eb16191d622f5a Mon Sep 17 00:00:00 2001 From: cheme Date: Fri, 14 Jun 2019 11:25:20 +0200 Subject: [PATCH 113/140] Add storage cache for child trie and notification internals (#2639) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * child cache, and test failing notifications * fix tests and no listen child on top wildcard * remove useless method * bump impl version * Update core/client/src/notifications.rs Co-Authored-By: Tomasz Drwięga * Update core/client/src/notifications.rs Co-Authored-By: Tomasz Drwięga * Update core/client/src/notifications.rs Co-Authored-By: Tomasz Drwięga * Update core/client/src/notifications.rs Co-Authored-By: Tomasz Drwięga * factoring notification methods to remove some redundant code. * test child sub removal * HStorage implementation and some type alias. * Remove HStorage cache: does not fit * fix removal * Make cache use byte length (shared) instead of number of kv * Make use of hashes cache in rpc * applying ratio on different lru caches * Fix format * break a line * Remove per element overhead of lru cache. * typo --- Cargo.lock | 2 +- core/client/db/Cargo.toml | 2 +- core/client/db/src/lib.rs | 62 +++- core/client/db/src/storage_cache.rs | 351 +++++++++++++++----- core/client/src/backend.rs | 14 +- core/client/src/client.rs | 77 ++++- core/client/src/in_mem.rs | 8 +- core/client/src/lib.rs | 2 +- core/client/src/light/backend.rs | 11 +- core/client/src/notifications.rs | 291 ++++++++++++---- core/rpc/src/state/mod.rs | 30 +- core/service/src/components.rs | 4 + core/service/src/config.rs | 3 + core/service/test/src/lib.rs | 1 + core/state-machine/src/backend.rs | 5 + core/state-machine/src/overlayed_changes.rs | 8 +- 16 files changed, 677 insertions(+), 194 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6e30fb4a75..a2b315a559 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4023,8 +4023,8 @@ dependencies = [ "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)", + "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)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index e40b1568f6..bfc7108db7 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -11,7 +11,7 @@ kvdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c # FIXME replace with release as soon as our rocksdb changes are released upstream https://github.com/paritytech/parity-common/issues/88 kvdb-rocksdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d", optional = true } kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } -lru-cache = "0.1.1" +linked-hash-map = "0.5" hash-db = { version = "0.12" } primitives = { package = "substrate-primitives", path = "../../primitives" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 674e8022dc..b487770fb3 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -38,6 +38,7 @@ use std::collections::HashMap; use client::backend::NewBlockState; use client::blockchain::HeaderBackend; use client::ExecutionStrategies; +use client::backend::{StorageCollection, ChildStorageCollection}; use parity_codec::{Decode, Encode}; use hash_db::Hasher; use kvdb::{KeyValueDB, DBTransaction}; @@ -69,6 +70,9 @@ use client::in_mem::Backend as InMemoryBackend; const CANONICALIZATION_DELAY: u64 = 4096; const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u32 = 32768; +/// Default value for storage cache child ratio. +const DEFAULT_CHILD_RATIO: (usize, usize) = (1, 10); + /// DB-backed patricia trie state, transaction type is an overlay of changes to commit. pub type DbState = state_machine::TrieBackend>, Blake2Hasher>; @@ -169,6 +173,8 @@ pub struct DatabaseSettings { pub cache_size: Option, /// State cache size. pub state_cache_size: usize, + /// Ratio of cache size dedicated to child tries. + pub state_cache_child_ratio: Option<(usize, usize)>, /// Path to the database. pub path: PathBuf, /// Pruning mode. @@ -181,7 +187,10 @@ pub fn new_client( executor: E, genesis_storage: S, execution_strategies: ExecutionStrategies, -) -> Result, client::LocalCallExecutor, E>, Block, RA>, client::error::Error> +) -> Result< + client::Client, + client::LocalCallExecutor, E>, Block, RA>, client::error::Error +> where Block: BlockT, E: CodeExecutor + RuntimeInfo, @@ -363,7 +372,8 @@ impl client::blockchain::ProvideCache for BlockchainDb { old_state: CachingState, Block>, db_updates: PrefixedMemoryDB, - storage_updates: Vec<(Vec, Option>)>, + storage_updates: StorageCollection, + child_storage_updates: ChildStorageCollection, changes_trie_updates: MemoryDB, pending_block: Option>, aux_ops: Vec<(Vec, Option>)>, @@ -455,8 +465,13 @@ where Block: BlockT, Ok(()) } - fn update_storage(&mut self, update: Vec<(Vec, Option>)>) -> Result<(), client::error::Error> { + fn update_storage( + &mut self, + update: StorageCollection, + child_update: ChildStorageCollection, + ) -> Result<(), client::error::Error> { self.storage_updates = update; + self.child_storage_updates = child_update; Ok(()) } @@ -670,14 +685,14 @@ impl> Backend { #[cfg(feature = "kvdb-rocksdb")] fn new_inner(config: DatabaseSettings, canonicalization_delay: u64) -> Result { let db = crate::utils::open_database(&config, columns::META, "full")?; - Backend::from_kvdb(db as Arc<_>, config.pruning, canonicalization_delay, config.state_cache_size) + Backend::from_kvdb(db as Arc<_>, canonicalization_delay, &config) } #[cfg(not(feature = "kvdb-rocksdb"))] fn new_inner(config: DatabaseSettings, canonicalization_delay: u64) -> Result { log::warn!("Running without the RocksDB feature. The database will NOT be saved."); let db = Arc::new(kvdb_memorydb::create(crate::utils::NUM_COLUMNS)); - Backend::from_kvdb(db as Arc<_>, config.pruning, canonicalization_delay, config.state_cache_size) + Backend::from_kvdb(db as Arc<_>, canonicalization_delay, &config) } #[cfg(any(test, feature = "test-helpers"))] @@ -685,26 +700,36 @@ impl> Backend { use utils::NUM_COLUMNS; let db = Arc::new(::kvdb_memorydb::create(NUM_COLUMNS)); + Self::new_test_db(keep_blocks, canonicalization_delay, db as Arc<_>) + } + #[cfg(any(test, feature = "test-helpers"))] + pub fn new_test_db(keep_blocks: u32, canonicalization_delay: u64, db: Arc) -> Self { + + let db_setting = DatabaseSettings { + cache_size: None, + state_cache_size: 16777216, + state_cache_child_ratio: Some((50, 100)), + path: Default::default(), + pruning: PruningMode::keep_blocks(keep_blocks), + }; Backend::from_kvdb( - db as Arc<_>, - PruningMode::keep_blocks(keep_blocks), + db, canonicalization_delay, - 16777216, + &db_setting, ).expect("failed to create test-db") } fn from_kvdb( db: Arc, - pruning: PruningMode, canonicalization_delay: u64, - state_cache_size: usize + config: &DatabaseSettings ) -> Result { - let is_archive_pruning = pruning.is_archive(); + let is_archive_pruning = config.pruning.is_archive(); let blockchain = BlockchainDb::new(db.clone())?; let meta = blockchain.meta.clone(); let map_e = |e: state_db::Error| ::client::error::Error::from(format!("State database error: {:?}", e)); - let state_db: StateDb<_, _> = StateDb::new(pruning, &StateMetaDb(&*db)).map_err(map_e)?; + let state_db: StateDb<_, _> = StateDb::new(config.pruning.clone(), &StateMetaDb(&*db)).map_err(map_e)?; let storage_db = StorageDb { db: db.clone(), state_db, @@ -722,7 +747,10 @@ impl> Backend { changes_trie_config: Mutex::new(None), blockchain, canonicalization_delay, - shared_cache: new_shared_cache(state_cache_size), + shared_cache: new_shared_cache( + config.state_cache_size, + config.state_cache_child_ratio.unwrap_or(DEFAULT_CHILD_RATIO), + ), import_lock: Default::default(), }) } @@ -1094,6 +1122,7 @@ impl> Backend { &enacted, &retracted, operation.storage_updates, + operation.child_storage_updates, Some(hash), Some(number), || is_best, @@ -1200,6 +1229,7 @@ impl client::backend::Backend for Backend whe old_state, db_updates: PrefixedMemoryDB::default(), storage_updates: Default::default(), + child_storage_updates: Default::default(), changes_trie_updates: MemoryDB::default(), aux_ops: Vec::new(), finalized_blocks: Vec::new(), @@ -1282,7 +1312,7 @@ impl client::backend::Backend for Backend whe || client::error::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; - best -= One::one(); // prev block + best -= One::one(); // prev block let hash = self.blockchain.hash(best)?.ok_or_else( || client::error::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; @@ -1348,7 +1378,7 @@ impl client::backend::Backend for Backend whe fn destroy_state(&self, state: Self::State) -> Result<(), client::error::Error> { if let Some(hash) = state.cache.parent_hash.clone() { let is_best = || self.blockchain.meta.read().best_hash == hash; - state.release().sync_cache(&[], &[], vec![], None, None, is_best); + state.release().sync_cache(&[], &[], vec![], vec![], None, None, is_best); } Ok(()) } @@ -1473,7 +1503,7 @@ mod tests { db.storage.db.clone() }; - let backend = Backend::::from_kvdb(backing, PruningMode::keep_blocks(1), 0, 16777216).unwrap(); + let backend = Backend::::new_test_db(1, 0, backing); assert_eq!(backend.blockchain().info().best_number, 9); for i in 0..10 { assert!(backend.blockchain().hash(i).unwrap().is_some()) diff --git a/core/client/db/src/storage_cache.rs b/core/client/db/src/storage_cache.rs index cc4670866c..53e4594856 100644 --- a/core/client/db/src/storage_cache.rs +++ b/core/client/db/src/storage_cache.rs @@ -19,60 +19,158 @@ use std::collections::{VecDeque, HashSet, HashMap}; use std::sync::Arc; use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard}; -use lru_cache::LruCache; +use linked_hash_map::{LinkedHashMap, Entry}; use hash_db::Hasher; use runtime_primitives::traits::{Block, Header}; use state_machine::{backend::Backend as StateBackend, TrieBackend}; use log::trace; - +use super::{StorageCollection, ChildStorageCollection}; +use std::hash::Hash as StdHash; const STATE_CACHE_BLOCKS: usize = 12; type StorageKey = Vec; +type ChildStorageKey = (Vec, Vec); type StorageValue = Vec; /// Shared canonical state cache. pub struct Cache { /// Storage cache. `None` indicates that key is known to be missing. - storage: LruCache>, + lru_storage: LRUMap>, /// Storage hashes cache. `None` indicates that key is known to be missing. - hashes: LruCache>, + lru_hashes: LRUMap>, + /// Storage cache for child trie. `None` indicates that key is known to be missing. + lru_child_storage: LRUMap>, /// 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, } +struct LRUMap(LinkedHashMap, usize, usize); + +/// Internal trait similar to `heapsize` but using +/// a simply estimation. +/// +/// This should not be made public, it is implementation +/// detail trait. If it need to become public please +/// consider using `malloc_size_of`. +trait EstimateSize { + /// Return a size estimation of additional size needed + /// to cache this struct (in bytes). + fn estimate_size(&self) -> usize; +} + +impl EstimateSize for Vec { + fn estimate_size(&self) -> usize { + self.capacity() + } +} + +impl EstimateSize for Option> { + fn estimate_size(&self) -> usize { + self.as_ref().map(|v|v.capacity()).unwrap_or(0) + } +} + +struct OptionHOut>(Option); + +impl> EstimateSize for OptionHOut { + fn estimate_size(&self) -> usize { + // capacity would be better + self.0.as_ref().map(|v|v.as_ref().len()).unwrap_or(0) + } +} + +impl EstimateSize for (T, T) { + fn estimate_size(&self) -> usize { + self.0.estimate_size() + self.1.estimate_size() + } +} + +impl LRUMap { + fn remove(&mut self, k: &K) { + let map = &mut self.0; + let storage_used_size = &mut self.1; + if let Some(v) = map.remove(k) { + *storage_used_size -= k.estimate_size(); + *storage_used_size -= v.estimate_size(); + } + } + + fn add(&mut self, k: K, v: V) { + let lmap = &mut self.0; + let storage_used_size = &mut self.1; + let limit = self.2; + let klen = k.estimate_size(); + *storage_used_size += v.estimate_size(); + // TODO assert k v size fit into limit?? to avoid insert remove? + match lmap.entry(k) { + Entry::Occupied(mut entry) => { + // note that in this case we are not running pure lru as + // it would require to remove first + *storage_used_size -= entry.get().estimate_size(); + entry.insert(v); + }, + Entry::Vacant(entry) => { + *storage_used_size += klen; + entry.insert(v); + }, + }; + + while *storage_used_size > limit { + if let Some((k,v)) = lmap.pop_front() { + *storage_used_size -= k.estimate_size(); + *storage_used_size -= v.estimate_size(); + } else { + // can happen fairly often as we get value from multiple lru + // and only remove from a single lru + break; + } + } + } + + fn get(&mut self, k: &Q) -> Option<&mut V> + where K: std::borrow::Borrow, + Q: StdHash + Eq { + self.0.get_refresh(k) + } + + fn used_size(&self) -> usize { + self.1 + } + fn clear(&mut self) { + self.0.clear(); + self.1 = 0; + } + +} + 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 + self.lru_storage.used_size() + + self.lru_child_storage.used_size() + // ignore small hashes storage and self.lru_hashes.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 { - // 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. +/// Fix lru storage size for hash (small 64ko). +const FIX_LRU_HASH_SIZE: usize = 65_536; +/// Create a new shared cache instance with given max memory usage. +pub fn new_shared_cache( + shared_cache_size: usize, + child_ratio: (usize, usize), +) -> SharedCache { + let top = child_ratio.1.saturating_sub(child_ratio.0); Arc::new(Mutex::new(Cache { - storage: LruCache::new(shared_cache_size), - hashes: LruCache::new(shared_cache_size), + lru_storage: LRUMap(LinkedHashMap::new(), 0, + shared_cache_size * top / child_ratio.1), + lru_hashes: LRUMap(LinkedHashMap::new(), 0, FIX_LRU_HASH_SIZE), + lru_child_storage: LRUMap(LinkedHashMap::new(), 0, + shared_cache_size * child_ratio.0 / child_ratio.1), modifications: VecDeque::new(), - shared_cache_size: shared_cache_size, - storage_used_size: 0, })) } @@ -87,6 +185,8 @@ struct BlockChanges { parent: B::Hash, /// A set of modified storage keys. storage: HashSet, + /// A set of modified child storage keys. + child_storage: HashSet, /// Block is part of the canonical chain. is_canon: bool, } @@ -97,6 +197,8 @@ struct LocalCache { storage: HashMap>, /// Storage hashes cache. `None` indicates that key is known to be missing. hashes: HashMap>, + /// Child storage cache. `None` indicates that key is known to be missing. + child_storage: HashMap>, } /// Cache changes. @@ -135,7 +237,8 @@ impl CacheChanges { &mut self, enacted: &[B::Hash], retracted: &[B::Hash], - changes: Vec<(StorageKey, Option)>, + changes: StorageCollection, + child_changes: ChildStorageCollection, commit_hash: Option, commit_number: Option<::Number>, is_best: F, @@ -155,7 +258,11 @@ impl CacheChanges { m.is_canon = true; for a in &m.storage { trace!("Reverting enacted key {:?}", a); - CacheChanges::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); + cache.lru_storage.remove(a); + } + for a in &m.child_storage { + trace!("Reverting enacted child key {:?}", a); + cache.lru_child_storage.remove(a); } false } else { @@ -171,7 +278,11 @@ impl CacheChanges { m.is_canon = false; for a in &m.storage { trace!("Retracted key {:?}", a); - CacheChanges::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); + cache.lru_storage.remove(a); + } + for a in &m.child_storage { + trace!("Retracted child key {:?}", a); + cache.lru_child_storage.remove(a); } false } else { @@ -182,7 +293,9 @@ impl CacheChanges { if clear { // We don't know anything about the block; clear everything trace!("Wiping cache"); - cache.storage.clear(); + cache.lru_storage.clear(); + cache.lru_child_storage.clear(); + cache.lru_hashes.clear(); cache.modifications.clear(); } @@ -192,12 +305,21 @@ impl CacheChanges { if let Some(_) = self.parent_hash { let mut local_cache = self.local_cache.write(); if is_best { - trace!("Committing {} local, {} hashes, {} modified entries", local_cache.storage.len(), local_cache.hashes.len(), changes.len()); + trace!( + "Committing {} local, {} hashes, {} modified root entries, {} modified child entries", + local_cache.storage.len(), + local_cache.hashes.len(), + changes.len(), + child_changes.iter().map(|v|v.1.len()).sum::(), + ); for (k, v) in local_cache.storage.drain() { - CacheChanges::::storage_insert(cache, k, v); + cache.lru_storage.add(k, v); + } + for (k, v) in local_cache.child_storage.drain() { + cache.lru_child_storage.add(k, v); } for (k, v) in local_cache.hashes.drain() { - cache.hashes.insert(k, v); + cache.lru_hashes.add(k, OptionHOut(v)); } } } @@ -210,16 +332,28 @@ impl CacheChanges { cache.modifications.pop_back(); } let mut modifications = HashSet::new(); + let mut child_modifications = HashSet::new(); + child_changes.into_iter().for_each(|(sk, changes)| + for (k, v) in changes.into_iter() { + let k = (sk.clone(), k); + if is_best { + cache.lru_child_storage.add(k.clone(), v); + } + child_modifications.insert(k); + } + ); for (k, v) in changes.into_iter() { - modifications.insert(k.clone()); if is_best { - cache.hashes.remove(&k); - CacheChanges::::storage_insert(cache, k, v); + cache.lru_hashes.remove(&k); + cache.lru_storage.add(k.clone(), v); } + modifications.insert(k); } + // Save modified storage. These are ordered by the block number. let block_changes = BlockChanges { storage: modifications, + child_storage: child_modifications, number: *number, hash: hash.clone(), is_canon: is_best, @@ -238,32 +372,6 @@ impl CacheChanges { } } - 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(); - } - } } impl, B: Block> CachingState { @@ -276,6 +384,7 @@ impl, B: Block> CachingState { local_cache: RwLock::new(LocalCache { storage: Default::default(), hashes: Default::default(), + child_storage: Default::default(), }), parent_hash: parent_hash, }, @@ -285,7 +394,8 @@ impl, B: Block> CachingState { /// Check if the key can be returned from cache by matching current block parent hash against canonical /// state and filtering out entries modified in later blocks. fn is_allowed( - key: &[u8], + key: Option<&[u8]>, + child_key: Option<&ChildStorageKey>, parent_hash: &Option, modifications: &VecDeque> @@ -314,9 +424,17 @@ impl, B: Block> CachingState { } parent = &m.parent; } - if m.storage.contains(key) { - trace!("Cache lookup skipped for {:?}: modified in a later block", key); - return false; + if let Some(key) = key { + if m.storage.contains(key) { + trace!("Cache lookup skipped for {:?}: modified in a later block", key); + return false; + } + } + if let Some(child_key) = child_key { + if m.child_storage.contains(child_key) { + trace!("Cache lookup skipped for {:?}: modified in a later block", child_key); + return false; + } } } trace!("Cache lookup skipped for {:?}: parent hash is unknown", key); @@ -330,19 +448,20 @@ impl, B: Block> CachingState { } impl, B:Block> StateBackend for CachingState { - type Error = S::Error; + type Error = S::Error; type Transaction = S::Transaction; type TrieBackendStorage = S::TrieBackendStorage; fn storage(&self, key: &[u8]) -> Result>, Self::Error> { let local_cache = self.cache.local_cache.upgradable_read(); + // Note that local cache makes that lru is not refreshed if let Some(entry) = local_cache.storage.get(key).cloned() { trace!("Found in local cache: {:?}", key); return Ok(entry) } let mut cache = self.cache.shared_cache.lock(); - if Self::is_allowed(key, &self.cache.parent_hash, &cache.modifications) { - if let Some(entry) = cache.storage.get_mut(key).map(|a| a.clone()) { + if Self::is_allowed(Some(key), None, &self.cache.parent_hash, &cache.modifications) { + if let Some(entry) = cache.lru_storage.get(key).map(|a| a.clone()) { trace!("Found in shared cache: {:?}", key); return Ok(entry) } @@ -360,8 +479,8 @@ impl, B:Block> StateBackend for CachingState, B:Block> StateBackend for CachingState Result>, Self::Error> { - self.state.child_storage(storage_key, key) + let key = (storage_key.to_vec(), key.to_vec()); + let local_cache = self.cache.local_cache.upgradable_read(); + if let Some(entry) = local_cache.child_storage.get(&key).cloned() { + trace!("Found in local cache: {:?}", key); + return Ok(entry) + } + let mut cache = self.cache.shared_cache.lock(); + if Self::is_allowed(None, Some(&key), &self.cache.parent_hash, &cache.modifications) { + if let Some(entry) = cache.lru_child_storage.get(&key).map(|a| a.clone()) { + trace!("Found in shared cache: {:?}", key); + return Ok(entry) + } + } + trace!("Cache miss: {:?}", key); + let value = self.state.child_storage(storage_key, &key.1[..])?; + RwLockUpgradableReadGuard::upgrade(local_cache).child_storage.insert(key, value.clone()); + Ok(value) } fn exists_storage(&self, key: &[u8]) -> Result { @@ -446,27 +581,27 @@ mod tests { let h3a = H256::random(); let h3b = H256::random(); - let shared = new_shared_cache::(256*1024); + let shared = new_shared_cache::(256*1024, (0,1)); // blocks [ 3a(c) 2a(c) 2b 1b 1a(c) 0 ] // state [ 5 5 4 3 2 2 ] let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], Some(h0.clone()), Some(0), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], vec![], Some(h0.clone()), Some(0), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h0.clone())); - s.cache.sync_cache(&[], &[], vec![], Some(h1a.clone()), Some(1), || true); + s.cache.sync_cache(&[], &[], vec![], vec![], Some(h1a.clone()), Some(1), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h0.clone())); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], Some(h1b.clone()), Some(1), || false); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], vec![], Some(h1b.clone()), Some(1), || false); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1b.clone())); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![4]))], Some(h2b.clone()), Some(2), || false); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![4]))], vec![], Some(h2b.clone()), Some(2), || false); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1a.clone())); - s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![5]))], Some(h2a.clone()), Some(2), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![5]))], vec![], Some(h2a.clone()), Some(2), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2a.clone())); - s.cache.sync_cache(&[], &[], vec![], Some(h3a.clone()), Some(3), || true); + s.cache.sync_cache(&[], &[], vec![], vec![], Some(h3a.clone()), Some(3), || true); let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a.clone())); assert_eq!(s.storage(&key).unwrap().unwrap(), vec![5]); @@ -487,9 +622,10 @@ mod tests { &[h1b.clone(), h2b.clone(), h3b.clone()], &[h1a.clone(), h2a.clone(), h3a.clone()], vec![], + vec![], Some(h3b.clone()), Some(3), - || true + || true, ); let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a.clone())); assert!(s.storage(&key).unwrap().is_none()); @@ -498,34 +634,71 @@ mod tests { #[test] fn should_track_used_size_correctly() { let root_parent = H256::random(); - let shared = new_shared_cache::(5); + let shared = new_shared_cache::(109, ((109-36), 109)); let h0 = H256::random(); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); let key = H256::random()[..].to_vec(); - s.cache.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 s_key = H256::random()[..].to_vec(); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![1, 2, 3]))], + vec![], + Some(h0.clone()), + Some(0), + || true, + ); + // 32 key, 3 byte size + assert_eq!(shared.lock().used_storage_cache_size(), 35 /* bytes */); let key = H256::random()[..].to_vec(); - s.cache.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 */); + s.cache.sync_cache( + &[], + &[], + vec![], + vec![(s_key.clone(), vec![(key.clone(), Some(vec![1, 2]))])], + Some(h0.clone()), + Some(0), + || true, + ); + // 35 + (2 * 32) key, 2 byte size + assert_eq!(shared.lock().used_storage_cache_size(), 101 /* bytes */); } #[test] fn should_remove_lru_items_based_on_tracking_used_size() { let root_parent = H256::random(); - let shared = new_shared_cache::(5); + let shared = new_shared_cache::(36*3, (2,3)); let h0 = H256::random(); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); let key = H256::random()[..].to_vec(); - s.cache.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 */); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![1, 2, 3, 4]))], + vec![], + Some(h0.clone()), + Some(0), + || true, + ); + // 32 key, 4 byte size + assert_eq!(shared.lock().used_storage_cache_size(), 36 /* bytes */); let key = H256::random()[..].to_vec(); - s.cache.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 */); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![1, 2]))], + vec![], + Some(h0.clone()), + Some(0), + || true, + ); + // 32 key, 2 byte size + assert_eq!(shared.lock().used_storage_cache_size(), 34 /* bytes */); } } diff --git a/core/client/src/backend.rs b/core/client/src/backend.rs index 5028b9dde7..8860f61c47 100644 --- a/core/client/src/backend.rs +++ b/core/client/src/backend.rs @@ -28,6 +28,12 @@ use hash_db::Hasher; use trie::MemoryDB; use parking_lot::Mutex; +/// In memory array of storage values. +pub type StorageCollection = Vec<(Vec, Option>)>; + +/// In memory arrays of storage values for multiple child tries. +pub type ChildStorageCollection = Vec<(Vec, StorageCollection)>; + /// State of a new block. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum NewBlockState { @@ -82,8 +88,12 @@ pub trait BlockImportOperation where fn update_db_storage(&mut self, update: >::Transaction) -> error::Result<()>; /// Inject storage data into the database replacing any existing data. fn reset_storage(&mut self, top: StorageOverlay, children: ChildrenStorageOverlay) -> error::Result; - /// Set top level storage changes. - fn update_storage(&mut self, update: Vec<(Vec, Option>)>) -> error::Result<()>; + /// Set storage changes. + fn update_storage( + &mut self, + update: StorageCollection, + child_update: ChildStorageCollection, + ) -> error::Result<()>; /// Inject changes trie data into the database. fn update_changes_trie(&mut self, update: MemoryDB) -> error::Result<()>; /// Insert auxiliary keys. Values are `None` if should be deleted. diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 8336a90ca4..ea1dfe6a45 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -59,7 +59,10 @@ use state_machine::{ }; use hash_db::Hasher; -use crate::backend::{self, BlockImportOperation, PrunableStateChangesTrieStorage}; +use crate::backend::{ + self, BlockImportOperation, PrunableStateChangesTrieStorage, + StorageCollection, ChildStorageCollection +}; use crate::blockchain::{ self, Info as ChainInfo, Backend as ChainBackend, HeaderBackend as ChainHeaderBackend, ProvideCache, Cache, @@ -77,6 +80,7 @@ use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; use log::{info, trace, warn}; + /// Type that implements `futures::Stream` of block import events. pub type ImportNotifications = mpsc::UnboundedReceiver>; @@ -133,7 +137,15 @@ pub struct Client where Block: BlockT { /// Client import operation, a wrapper for the backend. pub struct ClientImportOperation, B: backend::Backend> { op: B::BlockImportOperation, - notify_imported: Option<(Block::Hash, BlockOrigin, Block::Header, bool, Option, Option>)>>)>, + notify_imported: Option<( + Block::Hash, + BlockOrigin, + Block::Header, + bool, + Option<( + StorageCollection, + ChildStorageCollection, + )>)>, notify_finalized: Vec, } @@ -150,8 +162,10 @@ 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]> + fn storage_changes_notification_stream( + &self, + filter_keys: Option<&[StorageKey]>, + child_filter_keys: Option<&[(StorageKey, Option>)]>, ) -> error::Result>; } @@ -351,6 +365,14 @@ impl Client where .map(StorageData)) } + /// Given a `BlockId` and a key, return the value under the hash in that block. + pub fn storage_hash(&self, id: &BlockId, key: &StorageKey) + -> error::Result> { + Ok(self.state_at(id)? + .storage_hash(&key.0).map_err(|e| error::Error::from_state(Box::new(e)))? + ) + } + /// Given a `BlockId`, a key prefix, and a child storage key, return the matching child storage keys. pub fn child_storage_keys( &self, @@ -378,6 +400,18 @@ impl Client where .map(StorageData)) } + /// Given a `BlockId`, a key and a child storage key, return the hash under the key in that block. + pub fn child_storage_hash( + &self, + id: &BlockId, + child_storage_key: &StorageKey, + key: &StorageKey + ) -> error::Result> { + Ok(self.state_at(id)? + .child_storage_hash(&child_storage_key.0, &key.0).map_err(|e| error::Error::from_state(Box::new(e)))? + ) + } + /// 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()))? @@ -913,7 +947,7 @@ impl Client where operation.op.update_db_storage(storage_update)?; } if let Some(storage_changes) = storage_changes.clone() { - operation.op.update_storage(storage_changes)?; + operation.op.update_storage(storage_changes.0, storage_changes.1)?; } if let Some(Some(changes_update)) = changes_update { operation.op.update_changes_trie(changes_update)?; @@ -942,7 +976,10 @@ impl Client where ) -> error::Result<( Option>, Option>, - Option, Option>)>>, + Option<( + Vec<(Vec, Option>)>, + Vec<(Vec, Vec<(Vec, Option>)>)> + )> )> where E: CallExecutor + Send + Sync + Clone, @@ -985,7 +1022,9 @@ impl Client where overlay.commit_prospective(); - Ok((Some(storage_update), Some(changes_update), Some(overlay.into_committed().collect()))) + let (top, children) = overlay.into_committed(); + let children = children.map(|(sk, it)| (sk, it.collect())).collect(); + Ok((Some(storage_update), Some(changes_update), Some((top.collect(), children)))) }, None => Ok((None, None, None)) } @@ -1084,14 +1123,26 @@ impl Client where fn notify_imported( &self, - notify_import: (Block::Hash, BlockOrigin, Block::Header, bool, Option, Option>)>>), + notify_import: ( + Block::Hash, BlockOrigin, + Block::Header, + bool, + Option<( + Vec<(Vec, Option>)>, + Vec<(Vec, Vec<(Vec, Option>)>)>, + ) + >), ) -> error::Result<()> { let (hash, origin, header, is_new_best, storage_changes) = notify_import; if let Some(storage_changes) = storage_changes { // TODO [ToDr] How to handle re-orgs? Should we re-emit all storage changes? self.storage_notifications.lock() - .trigger(&hash, storage_changes.into_iter()); + .trigger( + &hash, + storage_changes.0.into_iter(), + storage_changes.1.into_iter().map(|(sk, v)| (sk, v.into_iter())), + ); } let notification = BlockImportNotification:: { @@ -1467,8 +1518,12 @@ where } /// Get storage changes event stream. - fn storage_changes_notification_stream(&self, filter_keys: Option<&[StorageKey]>) -> error::Result> { - Ok(self.storage_notifications.lock().listen(filter_keys)) + fn storage_changes_notification_stream( + &self, + filter_keys: Option<&[StorageKey]>, + child_filter_keys: Option<&[(StorageKey, Option>)]>, + ) -> error::Result> { + Ok(self.storage_notifications.lock().listen(filter_keys, child_filter_keys)) } } diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index dec10d40f7..54e1ac027b 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -33,7 +33,7 @@ use trie::MemoryDB; use consensus::well_known_cache_keys::Id as CacheKeyId; use crate::error; -use crate::backend::{self, NewBlockState}; +use crate::backend::{self, NewBlockState, StorageCollection, ChildStorageCollection}; use crate::light; use crate::leaves::LeafSet; use crate::blockchain::{self, BlockStatus, HeaderBackend}; @@ -515,7 +515,11 @@ where Ok(()) } - fn update_storage(&mut self, _update: Vec<(Vec, Option>)>) -> error::Result<()> { + fn update_storage( + &mut self, + _update: StorageCollection, + _child_update: ChildStorageCollection, + ) -> error::Result<()> { Ok(()) } diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index 574ec95dc0..8062fae500 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -59,7 +59,7 @@ pub use crate::client::{ new_in_mem, BlockBody, BlockStatus, ImportNotifications, FinalityNotifications, BlockchainEvents, BlockImportNotification, Client, ClientInfo, ExecutionStrategies, - LongestChain + LongestChain, }; #[cfg(feature = "std")] pub use crate::notifications::{StorageEventStream, StorageChangeSet}; diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index 60b4c66c17..f71366808e 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -26,7 +26,10 @@ use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, Childr use state_machine::{Backend as StateBackend, TrieBackend, backend::InMemory as InMemoryState}; 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::backend::{ + AuxStore, Backend as ClientBackend, BlockImportOperation, RemoteBackend, NewBlockState, + StorageCollection, ChildStorageCollection, +}; use crate::blockchain::HeaderBackend as BlockchainHeaderBackend; use crate::error::{Error as ClientError, Result as ClientResult}; use crate::light::blockchain::{Blockchain, Storage as BlockchainStorage}; @@ -310,7 +313,11 @@ where Ok(()) } - fn update_storage(&mut self, _update: Vec<(Vec, Option>)>) -> ClientResult<()> { + fn update_storage( + &mut self, + _update: StorageCollection, + _child_update: ChildStorageCollection, + ) -> ClientResult<()> { // we're not storing anything locally => ignore changes Ok(()) } diff --git a/core/client/src/notifications.rs b/core/client/src/notifications.rs index 139238f343..931a40f20d 100644 --- a/core/client/src/notifications.rs +++ b/core/client/src/notifications.rs @@ -30,18 +30,39 @@ use runtime_primitives::traits::Block as BlockT; #[derive(Debug)] pub struct StorageChangeSet { changes: Arc)>>, + child_changes: Arc)>)>>, filter: Option>, + child_filters: Option>>>, } impl StorageChangeSet { /// Convert the change set into iterator over storage items. - pub fn iter<'a>(&'a self) -> impl Iterator)> + 'a { - self.changes + pub fn iter<'a>(&'a self) + -> impl Iterator, &'a StorageKey, Option<&'a StorageData>)> + 'a { + let top = self.changes .iter() .filter(move |&(key, _)| match self.filter { Some(ref filter) => filter.contains(key), None => true, }) + .map(move |(k,v)| (None, k, v.as_ref())); + let children = self.child_changes + .iter() + .filter_map(move |(sk, changes)| { + if let Some(cf) = self.child_filters.as_ref() { + if let Some(filter) = cf.get(sk) { + Some(changes + .iter() + .filter(move |&(key, _)| match filter { + Some(ref filter) => filter.contains(key), + None => true, + }) + .map(move |(k,v)| (Some(sk), k, v.as_ref()))) + } else { None } + } else { None } + }) + .flatten(); + top.chain(children) } } @@ -56,9 +77,14 @@ pub struct StorageNotifications { next_id: SubscriberId, wildcard_listeners: FnvHashSet, listeners: HashMap>, + child_listeners: HashMap>, + FnvHashSet + )>, sinks: FnvHashMap, Option>, + Option>>>, )>, } @@ -68,6 +94,7 @@ impl Default for StorageNotifications { next_id: Default::default(), wildcard_listeners: Default::default(), listeners: Default::default(), + child_listeners: Default::default(), sinks: Default::default(), } } @@ -78,16 +105,24 @@ impl StorageNotifications { /// /// Note the changes are going to be filtered by listener's filter key. /// In fact no event might be sent if clients are not interested in the changes. - pub fn trigger(&mut self, hash: &Block::Hash, changeset: impl Iterator, Option>)>) { + pub fn trigger( + &mut self, + hash: &Block::Hash, + changeset: impl Iterator, Option>)>, + child_changeset: impl Iterator< + Item=(Vec, impl Iterator, Option>)>) + >, + ) { let has_wildcard = !self.wildcard_listeners.is_empty(); // early exit if no listeners - if !has_wildcard && self.listeners.is_empty() { + if !has_wildcard && self.listeners.is_empty() && self.child_listeners.is_empty() { return; } let mut subscribers = self.wildcard_listeners.clone(); let mut changes = Vec::new(); + let mut child_changes = Vec::new(); // Collect subscribers and changes for (k, v) in changeset { @@ -102,21 +137,47 @@ impl StorageNotifications { changes.push((k, v.map(StorageData))); } } + for (sk, changeset) in child_changeset { + let sk = StorageKey(sk); + if let Some((cl, cw)) = self.child_listeners.get(&sk) { + let mut changes = Vec::new(); + for (k, v) in changeset { + let k = StorageKey(k); + let listeners = cl.get(&k); + + if let Some(ref listeners) = listeners { + subscribers.extend(listeners.iter()); + } + + subscribers.extend(cw.iter()); + + if !cw.is_empty() || listeners.is_some() { + changes.push((k, v.map(StorageData))); + } + } + if !changes.is_empty() { + child_changes.push((sk, changes)); + } + } + } // Don't send empty notifications - if changes.is_empty() { + if changes.is_empty() && child_changes.is_empty() { return; } let changes = Arc::new(changes); + let child_changes = Arc::new(child_changes); // Trigger the events for subscriber in subscribers { let should_remove = { - let &(ref sink, ref filter) = self.sinks.get(&subscriber) + let &(ref sink, ref filter, ref child_filters) = self.sinks.get(&subscriber) .expect("subscribers returned from self.listeners are always in self.sinks; qed"); sink.unbounded_send((hash.clone(), StorageChangeSet { changes: changes.clone(), + child_changes: child_changes.clone(), filter: filter.clone(), + child_filters: child_filters.clone(), })).is_err() }; @@ -126,53 +187,120 @@ impl StorageNotifications { } } + fn remove_subscriber_from( + subscriber: &SubscriberId, + filters: &Option>, + listeners: &mut HashMap>, + wildcards: &mut FnvHashSet, + ){ + match filters { + None => { + wildcards.remove(subscriber); + }, + Some(filters) => { + + for key in filters.iter() { + let remove_key = match listeners.get_mut(key) { + Some(ref mut set) => { + set.remove(subscriber); + set.is_empty() + }, + None => false, + }; + + if remove_key { + listeners.remove(key); + } + } + } + } + } + fn remove_subscriber(&mut self, subscriber: SubscriberId) { - if let Some((_, filters)) = self.sinks.remove(&subscriber) { - match filters { - None => { - self.wildcard_listeners.remove(&subscriber); - }, - Some(filters) => { - for key in filters { - let remove_key = match self.listeners.get_mut(&key) { - Some(ref mut set) => { - set.remove(&subscriber); - set.is_empty() - }, - None => false, - }; - - if remove_key { - self.listeners.remove(&key); + if let Some((_, filters, child_filters)) = self.sinks.remove(&subscriber) { + Self::remove_subscriber_from( + &subscriber, + &filters, + &mut self.listeners, + &mut self.wildcard_listeners, + ); + if let Some(child_filters) = child_filters.as_ref() { + for (c_key, filters) in child_filters { + + if let Some((listeners, wildcards)) = self.child_listeners.get_mut(&c_key) { + Self::remove_subscriber_from( + &subscriber, + &filters, + &mut *listeners, + &mut *wildcards, + ); + + if listeners.is_empty() && wildcards.is_empty() { + self.child_listeners.remove(&c_key); } } - }, + } } } } - /// Start listening for particular storage keys. - pub fn listen(&mut self, filter_keys: Option<&[StorageKey]>) -> StorageEventStream { - self.next_id += 1; - - // add subscriber for every key - let keys = match filter_keys { + fn listen_from( + current_id: SubscriberId, + filter_keys: &Option>, + listeners: &mut HashMap>, + wildcards: &mut FnvHashSet, + ) -> Option> + { + match filter_keys { None => { - self.wildcard_listeners.insert(self.next_id); + wildcards.insert(current_id); None }, - Some(keys) => Some(keys.iter().map(|key| { - self.listeners + Some(keys) => Some(keys.as_ref().iter().map(|key| { + listeners .entry(key.clone()) .or_insert_with(Default::default) - .insert(self.next_id); + .insert(current_id); key.clone() }).collect()) - }; + } + } + + /// Start listening for particular storage keys. + pub fn listen( + &mut self, + filter_keys: Option<&[StorageKey]>, + filter_child_keys: Option<&[(StorageKey, Option>)]>, + ) -> StorageEventStream { + self.next_id += 1; + let current_id = self.next_id; + + // add subscriber for every key + let keys = Self::listen_from( + current_id, + &filter_keys, + &mut self.listeners, + &mut self.wildcard_listeners, + ); + let child_keys = filter_child_keys.map(|filter_child_keys| { + filter_child_keys.iter().map(|(c_key, o_keys)| { + let (c_listeners, c_wildcards) = self.child_listeners + .entry(c_key.clone()) + .or_insert_with(Default::default); + + (c_key.clone(), Self::listen_from( + current_id, + o_keys, + &mut *c_listeners, + &mut *c_wildcards, + )) + }).collect() + }); + // insert sink let (tx, rx) = mpsc::unbounded(); - self.sinks.insert(self.next_id, (tx, keys)); + self.sinks.insert(current_id, (tx, keys, child_keys)); rx } } @@ -182,13 +310,26 @@ mod tests { use runtime_primitives::testing::{H256 as Hash, Block as RawBlock, ExtrinsicWrapper}; use super::*; use futures::Stream; + use std::iter::{empty, Empty}; + + type TestChangeSet = ( + Vec<(StorageKey, Option)>, + Vec<(StorageKey, Vec<(StorageKey, Option)>)>, + ); #[cfg(test)] - impl From)>> for StorageChangeSet { - fn from(changes: Vec<(StorageKey, Option)>) -> Self { + impl From for StorageChangeSet { + fn from(changes: TestChangeSet) -> Self { + // warning hardcoded child trie wildcard to test upon + let child_filters = Some([ + (StorageKey(vec![4]), None), + (StorageKey(vec![5]), None), + ].into_iter().cloned().collect()); StorageChangeSet { - changes: Arc::new(changes), + changes: Arc::new(changes.0), + child_changes: Arc::new(changes.1), filter: None, + child_filters, } } } @@ -206,43 +347,73 @@ mod tests { fn triggering_change_should_notify_wildcard_listeners() { // given let mut notifications = StorageNotifications::::default(); - let mut recv = notifications.listen(None).wait(); + let child_filter = [(StorageKey(vec![4]), None)]; + let mut recv = notifications.listen(None, Some(&child_filter[..])).wait(); // when let changeset = vec![ (vec![2], Some(vec![3])), (vec![3], None), ]; - notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter()); + let c_changeset_1 = vec![ + (vec![5], Some(vec![4])), + (vec![6], None), + ]; + let c_changeset = vec![(vec![4], c_changeset_1)]; + notifications.trigger( + &Hash::from_low_u64_be(1), + changeset.into_iter(), + c_changeset.into_iter().map(|(a,b)| (a, b.into_iter())), + ); // then - assert_eq!(recv.next().unwrap(), Ok((Hash::from_low_u64_be(1), vec![ + assert_eq!(recv.next().unwrap(), Ok((Hash::from_low_u64_be(1), (vec![ (StorageKey(vec![2]), Some(StorageData(vec![3]))), (StorageKey(vec![3]), None), - ].into()))); + ], vec![(StorageKey(vec![4]), vec![ + (StorageKey(vec![5]), Some(StorageData(vec![4]))), + (StorageKey(vec![6]), None), + ])]).into()))); } #[test] fn should_only_notify_interested_listeners() { // given let mut notifications = StorageNotifications::::default(); - let mut recv1 = notifications.listen(Some(&[StorageKey(vec![1])])).wait(); - let mut recv2 = notifications.listen(Some(&[StorageKey(vec![2])])).wait(); + let child_filter = [(StorageKey(vec![4]), Some(vec![StorageKey(vec![5])]))]; + let mut recv1 = notifications.listen(Some(&[StorageKey(vec![1])]), None).wait(); + let mut recv2 = notifications.listen(Some(&[StorageKey(vec![2])]), None).wait(); + let mut recv3 = notifications.listen(Some(&[]), Some(&child_filter)).wait(); // when let changeset = vec![ (vec![2], Some(vec![3])), (vec![1], None), ]; - notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter()); + let c_changeset_1 = vec![ + (vec![5], Some(vec![4])), + (vec![6], None), + ]; + + let c_changeset = vec![(vec![4], c_changeset_1)]; + notifications.trigger( + &Hash::from_low_u64_be(1), + changeset.into_iter(), + c_changeset.into_iter().map(|(a,b)| (a, b.into_iter())), + ); // then - assert_eq!(recv1.next().unwrap(), Ok((Hash::from_low_u64_be(1), vec![ + assert_eq!(recv1.next().unwrap(), Ok((Hash::from_low_u64_be(1), (vec![ (StorageKey(vec![1]), None), - ].into()))); - assert_eq!(recv2.next().unwrap(), Ok((Hash::from_low_u64_be(1), vec![ + ], vec![]).into()))); + assert_eq!(recv2.next().unwrap(), Ok((Hash::from_low_u64_be(1), (vec![ (StorageKey(vec![2]), Some(StorageData(vec![3]))), - ].into()))); + ], vec![]).into()))); + assert_eq!(recv3.next().unwrap(), Ok((Hash::from_low_u64_be(1), (vec![], + vec![ + (StorageKey(vec![4]), vec![(StorageKey(vec![5]), Some(StorageData(vec![4])))]), + ]).into()))); + } #[test] @@ -250,11 +421,14 @@ mod tests { // given let mut notifications = StorageNotifications::::default(); { - let _recv1 = notifications.listen(Some(&[StorageKey(vec![1])])).wait(); - let _recv2 = notifications.listen(Some(&[StorageKey(vec![2])])).wait(); - let _recv3 = notifications.listen(None).wait(); + let child_filter = [(StorageKey(vec![4]), Some(vec![StorageKey(vec![5])]))]; + let _recv1 = notifications.listen(Some(&[StorageKey(vec![1])]), None).wait(); + let _recv2 = notifications.listen(Some(&[StorageKey(vec![2])]), None).wait(); + let _recv3 = notifications.listen(None, None).wait(); + let _recv4 = notifications.listen(None, Some(&child_filter)).wait(); assert_eq!(notifications.listeners.len(), 2); - assert_eq!(notifications.wildcard_listeners.len(), 1); + assert_eq!(notifications.wildcard_listeners.len(), 2); + assert_eq!(notifications.child_listeners.len(), 1); } // when @@ -262,11 +436,13 @@ mod tests { (vec![2], Some(vec![3])), (vec![1], None), ]; - notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter()); + let c_changeset = empty::<(_, Empty<_>)>(); + notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter(), c_changeset); // then assert_eq!(notifications.listeners.len(), 0); assert_eq!(notifications.wildcard_listeners.len(), 0); + assert_eq!(notifications.child_listeners.len(), 0); } #[test] @@ -274,11 +450,12 @@ mod tests { // given let mut recv = { let mut notifications = StorageNotifications::::default(); - let recv = notifications.listen(None).wait(); + let recv = notifications.listen(None, None).wait(); // when let changeset = vec![]; - notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter()); + let c_changeset = empty::<(_, Empty<_>)>(); + notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter(), c_changeset); recv }; diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs index e52d318d9f..474dfe10ed 100644 --- a/core/rpc/src/state/mod.rs +++ b/core/rpc/src/state/mod.rs @@ -362,8 +362,9 @@ impl StateApi for State where } fn storage_hash(&self, key: StorageKey, block: Option) -> Result> { - use runtime_primitives::traits::{Hash, Header as HeaderT}; - Ok(self.storage(key, block)?.map(|x| ::Hashing::hash(&x.0))) + let block = self.unwrap_or_best(block)?; + trace!(target: "rpc", "Querying storage hash at {:?} for key {}", block, HexDisplay::from(&key.0)); + Ok(self.client.storage_hash(&BlockId::Hash(block), &key)?) } fn storage_size(&self, key: StorageKey, block: Option) -> Result> { @@ -398,11 +399,13 @@ impl StateApi for State where 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)) - ) + let block = self.unwrap_or_best(block)?; + trace!( + target: "rpc", "Querying child storage hash at {:?} for key {}", + block, + HexDisplay::from(&key.0), + ); + Ok(self.client.child_storage_hash(&BlockId::Hash(block), &child_storage_key, &key)?) } fn child_storage_size( @@ -439,7 +442,10 @@ impl StateApi for State where keys: Option> ) { let keys = Into::>>::into(keys); - let stream = match self.client.storage_changes_notification_stream(keys.as_ref().map(|x| &**x)) { + let stream = match self.client.storage_changes_notification_stream( + keys.as_ref().map(|x| &**x), + None + ) { Ok(stream) => stream, Err(err) => { let _ = subscriber.reject(error::Error::from(err).into()); @@ -466,7 +472,10 @@ impl StateApi for State where .map_err(|e| warn!("Error creating storage notification stream: {:?}", e)) .map(|(block, changes)| Ok(StorageChangeSet { block, - changes: changes.iter().cloned().collect(), + changes: changes.iter() + .filter_map(|(o_sk, k, v)| if o_sk.is_none() { + Some((k.clone(),v.cloned())) + } else { None }).collect(), })); sink @@ -488,7 +497,8 @@ 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())]) + Some(&[StorageKey(storage::well_known_keys::CODE.to_vec())]), + None, ) { Ok(stream) => stream, Err(err) => { diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 0f5afb7772..c095bdb7f4 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -499,6 +499,8 @@ 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, + state_cache_child_ratio: + config.state_cache_child_ratio.map(|v| (v, 100)), path: config.database_path.as_str().into(), pruning: config.pruning.clone(), }; @@ -591,6 +593,8 @@ impl Components for LightComponents { let db_settings = client_db::DatabaseSettings { cache_size: None, state_cache_size: config.state_cache_size, + state_cache_child_ratio: + config.state_cache_child_ratio.map(|v| (v, 100)), path: config.database_path.as_str().into(), pruning: config.pruning.clone(), }; diff --git a/core/service/src/config.rs b/core/service/src/config.rs index 5996ec837d..3a49630898 100644 --- a/core/service/src/config.rs +++ b/core/service/src/config.rs @@ -50,6 +50,8 @@ pub struct Configuration { pub database_cache_size: Option, /// Size of internal state cache in Bytes pub state_cache_size: usize, + /// Size in percent of cache size dedicated to child tries + pub state_cache_child_ratio: Option, /// Pruning settings. pub pruning: PruningMode, /// Additional key seeds. @@ -100,6 +102,7 @@ impl Configuration ( database_path: root.join("db").to_str().unwrap().into(), database_cache_size: None, state_cache_size: 16777216, + state_cache_child_ratio: None, pruning: Default::default(), keys: keys, chain_spec: (*spec).clone(), diff --git a/core/state-machine/src/backend.rs b/core/state-machine/src/backend.rs index 81529c6da3..c86c802bfb 100644 --- a/core/state-machine/src/backend.rs +++ b/core/state-machine/src/backend.rs @@ -51,6 +51,11 @@ pub trait Backend { /// Get keyed child storage or None if there is nothing associated. fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result>, Self::Error>; + /// Get child keyed storage value hash or None if there is nothing associated. + fn child_storage_hash(&self, storage_key: &[u8], key: &[u8]) -> Result, Self::Error> { + self.child_storage(storage_key, key).map(|v| v.map(|v| H::hash(&v))) + } + /// true if a key exists in storage. fn exists_storage(&self, key: &[u8]) -> Result { Ok(self.storage(key)?.is_some()) diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index 663e4ff72e..7d6d6081bd 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -255,9 +255,13 @@ impl OverlayedChanges { /// /// Panics: /// Will panic if there are any uncommitted prospective changes. - pub fn into_committed(self) -> impl Iterator, Option>)> { + pub fn into_committed(self) -> ( + impl Iterator, Option>)>, + impl Iterator, impl Iterator, Option>)>)>, + ){ assert!(self.prospective.is_empty()); - self.committed.top.into_iter().map(|(k, v)| (k, v.value)) + (self.committed.top.into_iter().map(|(k, v)| (k, v.value)), + self.committed.children.into_iter().map(|(sk, v)| (sk, v.1.into_iter()))) } /// Inserts storage entry responsible for current extrinsic index. -- GitLab From fa13e2706ab8f07f2076d66b966f671c3dc046c4 Mon Sep 17 00:00:00 2001 From: TriplEight Date: Fri, 14 Jun 2019 12:58:09 +0200 Subject: [PATCH 114/140] Cargo check benches (#2862) * add job --- .gitlab-ci.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 127aba4781..2487f7e078 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,7 +7,6 @@ stages: - - pre-test - test - build - publish @@ -58,7 +57,7 @@ variables: #### stage: test check-runtime: - stage: pre-test + stage: test image: parity/tools:latest <<: *kubernetes-build only: @@ -72,7 +71,7 @@ check-runtime: check-line-width: - stage: pre-test + stage: test image: parity/tools:latest <<: *kubernetes-build only: @@ -83,7 +82,7 @@ check-line-width: cargo-audit: - stage: pre-test + stage: test <<: *docker-env except: - /^[0-9]+$/ @@ -92,6 +91,15 @@ cargo-audit: allow_failure: true +cargo-check-benches: + stage: test + <<: *docker-env + script: + - ./scripts/build.sh --locked + - time cargo check --benches + - sccache -s + + cargo-check-subkey: stage: test <<: *docker-env -- GitLab From dbf322620948935d2bbae214504e6c668c3073ed Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 14 Jun 2019 16:34:34 +0200 Subject: [PATCH 115/140] New sessions, kill consensus module (#2802) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Draft of new sessions * Reintroduce tuple impls * Move staking module to new session API * More work on staking and grandpa. * Use iterator to avoid cloning and tuple macro * Make runtime build again * Polish the OpaqueKeys devex * Move consensus logic into system & aura. * Fix up system module * Get build mostly going. Stuck at service.rs * Building again * Update srml/staking/src/lib.rs Co-Authored-By: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> * Refactoring out Consensus module, AuthorityIdOf, &c. * Refactored out DigestItem::AuthoritiesChanged. Building. * Remove tentative code * Remove invalid comment * Make Seal opaque and introduce nice methods for handling opaque items. * Start to use proper digest for Aura authorities tracking. * Fix up grandpa, remove system::Raw/Log * Refactor Grandpa to use new logging infrastructure. Also make authorityid/sessionkey static. Switch over to storing authorities in a straight Vec. * Building again * Tidy up some AuthorityIds * Expunge most of the rest of the AuthorityKey confusion. Also, de-generify Babe and re-generify Aura. * Remove cruft * Untangle last of the `AuthorityId`s. * Sort out finality_tracker * Refactor median getting * Apply suggestions from code review Co-Authored-By: Robert Habermeier * Session tests works * Update core/sr-primitives/src/generic/digest.rs Co-Authored-By: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> * Session tests works * Fix for staking from @dvc94ch * log an error * fix test runtime build * Some test fixes * Staking mock update to new session api. * Fix build. * Move OpaqueKeys to primitives. * Use on_initialize instead of check_rotate_session. * Update tests to new staking api. * fixup mock * Fix bond_extra_and_withdraw_unbonded_works. * Fix bond_with_little_staked_value_bounded_by_slot_stake. * Fix bond_with_no_staked_value. * Fix change_controller_works. * Fix less_than_needed_candidates_works. * Fix multi_era_reward_should_work. * Fix nominating_and_rewards_should_work. * Fix nominators_also_get_slashed. * Fix phragmen_large_scale_test. * Fix phragmen_poc_works. * Fix phragmen_score_should_be_accurate_on_large_stakes. * Fix phragmen_should_not_overflow. * Fix reward_destination_works. * Fix rewards_should_work. * Fix sessions_and_eras_should_work. * Fix slot_stake_is_least_staked_validator. * Fix too_many_unbond_calls_should_not_work. * Fix wrong_vote_is_null. * Fix runtime. * Fix wasm runtime build. * Update Cargo.lock * Fix warnings. * Fix grandpa tests. * Fix test-runtime build. * Fix template node build. * Fix stuff. * Update Cargo.lock to fix CI * Re-add missing AuRa logs Runtimes are required to know about every digest they receive ― they panic otherwise. This re-adds support for AuRa pre-runtime digests. * Update core/consensus/babe/src/digest.rs Co-Authored-By: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com> * Kill log trait and all that jazz. * Refactor staking tests. * Fix ci runtime wasm check. * Line length 120. * Make tests build again * Remove trailing commas in function declarations The `extern_functions!` macro doesn’t like them, perhaps due to a bug in rustc. * Fix type error * Fix compilation errors * Fix a test * Another couple of fixes * Fix another test * More test fixes * Another test fix * Bump runtime. * Wrap long line * Fix build, remove redundant code. * Issue to track TODO * Leave the benchmark code alone. * Fix missing `std::time::{Instant, Duration}` * Indentation * Aura ConsensusLog as enum --- .gitlab-ci.yml | 4 +- Cargo.lock | 51 +- Cargo.toml | 1 - core/basic-authorship/src/basic_authorship.rs | 4 +- core/client/db/src/lib.rs | 24 +- core/client/db/src/light.rs | 12 +- core/client/src/client.rs | 6 +- core/client/src/in_mem.rs | 12 +- core/client/src/light/call_executor.rs | 22 +- core/client/src/light/fetcher.rs | 14 +- core/client/src/runtime_api.rs | 2 +- core/consensus/aura/Cargo.toml | 2 - core/consensus/aura/primitives/Cargo.toml | 6 + core/consensus/aura/primitives/src/lib.rs | 14 +- core/consensus/aura/src/digest.rs | 32 +- core/consensus/aura/src/lib.rs | 105 ++-- core/consensus/authorities/Cargo.toml | 29 - core/consensus/authorities/src/lib.rs | 31 - core/consensus/babe/Cargo.toml | 2 - core/consensus/babe/primitives/Cargo.toml | 3 + core/consensus/babe/primitives/src/lib.rs | 12 +- core/consensus/babe/src/digest.rs | 53 +- core/consensus/babe/src/lib.rs | 88 ++- core/consensus/common/src/block_import.rs | 2 - core/consensus/common/src/import_queue.rs | 34 +- core/consensus/common/src/lib.rs | 13 +- core/consensus/common/src/offline_tracker.rs | 23 +- core/consensus/rhd/Cargo.toml | 1 - core/executor/src/wasm_executor.rs | 219 +++++-- core/executor/wasm/src/lib.rs | 16 +- core/finality-grandpa/primitives/Cargo.toml | 2 + core/finality-grandpa/primitives/src/lib.rs | 35 +- core/finality-grandpa/src/authorities.rs | 18 +- core/finality-grandpa/src/aux_schema.rs | 3 +- .../finality-grandpa/src/communication/mod.rs | 4 +- core/finality-grandpa/src/environment.rs | 3 +- core/finality-grandpa/src/finality_proof.rs | 4 +- core/finality-grandpa/src/justification.rs | 5 +- core/finality-grandpa/src/lib.rs | 6 +- core/finality-grandpa/src/light_import.rs | 18 +- core/finality-grandpa/src/observer.rs | 3 +- core/finality-grandpa/src/tests.rs | 5 +- core/finality-grandpa/src/until_imported.rs | 2 +- core/network/Cargo.toml | 2 + core/network/src/test/mod.rs | 21 +- core/primitives/benches/benches.rs | 4 +- core/primitives/src/storage.rs | 12 - core/rpc/src/state/tests.rs | 8 +- core/service/src/lib.rs | 6 +- core/sr-io/with_std.rs | 9 +- core/sr-io/without_std.rs | 67 ++- core/sr-primitives/src/generic/digest.rs | 387 ++++++------- core/sr-primitives/src/generic/header.rs | 32 +- core/sr-primitives/src/generic/mod.rs | 2 +- core/sr-primitives/src/generic/tests.rs | 29 +- core/sr-primitives/src/lib.rs | 286 +-------- core/sr-primitives/src/testing.rs | 51 +- core/sr-primitives/src/traits.rs | 137 +++-- core/state-machine/src/proving_backend.rs | 4 +- .../state-machine/src/trie_backend_essence.rs | 5 +- core/test-client/Cargo.toml | 1 - core/test-runtime/Cargo.toml | 2 - core/test-runtime/src/genesismap.rs | 9 +- core/test-runtime/src/lib.rs | 38 +- core/test-runtime/src/system.rs | 105 ++-- core/test-runtime/wasm/Cargo.lock | 14 +- core/trie/src/lib.rs | 9 +- node-template/runtime/Cargo.toml | 3 - node-template/runtime/src/lib.rs | 52 +- node-template/runtime/src/template.rs | 4 +- node-template/runtime/wasm/Cargo.lock | 31 +- node-template/src/chain_spec.rs | 13 +- node/cli/Cargo.toml | 1 + node/cli/src/chain_spec.rs | 112 ++-- node/cli/src/service.rs | 8 +- node/executor/Cargo.toml | 1 - node/executor/src/lib.rs | 154 +++-- node/primitives/src/lib.rs | 13 +- node/runtime/Cargo.toml | 4 - node/runtime/src/lib.rs | 105 ++-- node/runtime/wasm/Cargo.lock | 33 +- srml/assets/src/lib.rs | 10 +- srml/aura/Cargo.toml | 6 +- srml/aura/src/lib.rs | 62 +- srml/aura/src/mock.rs | 20 +- srml/babe/Cargo.toml | 3 - srml/babe/src/lib.rs | 58 +- srml/balances/src/lib.rs | 2 - srml/balances/src/mock.rs | 4 +- srml/balances/src/tests.rs | 70 ++- srml/consensus/Cargo.toml | 31 - srml/consensus/src/lib.rs | 438 -------------- srml/consensus/src/mock.rs | 63 -- srml/consensus/src/tests.rs | 131 ----- srml/contract/Cargo.toml | 1 - srml/contract/src/lib.rs | 3 +- srml/contract/src/tests.rs | 12 +- srml/council/src/lib.rs | 2 - srml/council/src/motions.rs | 71 ++- srml/democracy/src/lib.rs | 4 +- srml/example/src/lib.rs | 48 +- srml/executive/src/lib.rs | 84 ++- srml/finality-tracker/src/lib.rs | 16 +- srml/grandpa/Cargo.toml | 2 - srml/grandpa/src/lib.rs | 267 +++------ srml/grandpa/src/mock.rs | 28 +- srml/grandpa/src/tests.rs | 80 +-- srml/indices/src/mock.rs | 4 +- srml/session/Cargo.toml | 3 - srml/session/src/lib.rs | 541 +++++++++--------- srml/staking/Cargo.toml | 1 - srml/staking/src/lib.rs | 506 ++++++++-------- srml/staking/src/mock.rs | 120 ++-- srml/staking/src/phragmen.rs | 3 +- srml/staking/src/tests.rs | 401 ++++++------- srml/support/procedural/src/lib.rs | 3 +- srml/support/procedural/src/storage/impls.rs | 40 +- srml/support/src/dispatch.rs | 1 + srml/support/src/lib.rs | 11 +- srml/support/src/runtime.rs | 110 +--- srml/support/src/storage/hashed/mod.rs | 89 ++- .../support/src/storage/unhashed/generator.rs | 16 +- srml/support/test/tests/instance.rs | 88 +-- srml/system/benches/bench.rs | 4 +- srml/system/src/lib.rs | 102 ++-- srml/timestamp/src/lib.rs | 4 +- srml/treasury/src/lib.rs | 4 +- subkey/src/main.rs | 3 +- 128 files changed, 2632 insertions(+), 3657 deletions(-) delete mode 100644 core/consensus/authorities/Cargo.toml delete mode 100644 core/consensus/authorities/src/lib.rs delete mode 100644 srml/consensus/Cargo.toml delete mode 100644 srml/consensus/src/lib.rs delete mode 100644 srml/consensus/src/mock.rs delete mode 100644 srml/consensus/src/tests.rs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2487f7e078..0f0f0489f7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -109,7 +109,7 @@ cargo-check-subkey: - cd ./subkey - time cargo check --release # makes sense to save artifacts for building it - sccache -s - + test-linux-stable: &test-linux stage: test @@ -135,7 +135,7 @@ test-linux-stable-int: - $DEPLOY_TAG script: - ./scripts/build.sh --locked - - time RUST_LOG=sync=trace,consensus=trace,client=trace,state-db=trace,db=trace,forks=trace,state_db=trace,storage_cache=trace + - time RUST_LOG=sync=trace,consensus=trace,client=trace,state-db=trace,db=trace,forks=trace,state_db=trace,storage_cache=trace cargo test -p node-cli --release --verbose --locked -- --ignored --test-threads=1 - sccache -s allow_failure: true diff --git a/Cargo.lock b/Cargo.lock index a2b315a559..70780e409c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2152,6 +2152,7 @@ dependencies = [ "substrate-cli 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-finality-grandpa 2.0.0", "substrate-inherents 2.0.0", @@ -2177,7 +2178,6 @@ dependencies = [ "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", @@ -2238,7 +2238,6 @@ dependencies = [ "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", @@ -2255,7 +2254,6 @@ dependencies = [ "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", @@ -2302,7 +2300,6 @@ dependencies = [ "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", @@ -2311,7 +2308,6 @@ dependencies = [ "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", ] @@ -3444,12 +3440,12 @@ dependencies = [ "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-aura-primitives 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", ] @@ -3466,9 +3462,7 @@ dependencies = [ "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", @@ -3493,21 +3487,6 @@ dependencies = [ "substrate-primitives 2.0.0", ] -[[package]] -name = "srml-consensus" -version = "2.0.0" -dependencies = [ - "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.92 (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-support 2.0.0", - "srml-system 2.0.0", - "substrate-inherents 2.0.0", - "substrate-primitives 2.0.0", -] - [[package]] name = "srml-contract" version = "2.0.0" @@ -3524,7 +3503,6 @@ dependencies = [ "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", @@ -3624,7 +3602,6 @@ dependencies = [ "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", @@ -3671,7 +3648,6 @@ dependencies = [ "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", @@ -3690,7 +3666,6 @@ dependencies = [ "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", @@ -4052,11 +4027,9 @@ dependencies = [ "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", @@ -4074,21 +4047,10 @@ dependencies = [ [[package]] name = "substrate-consensus-aura-primitives" version = "2.0.0" -dependencies = [ - "sr-primitives 2.0.0", - "substrate-client 2.0.0", -] - -[[package]] -name = "substrate-consensus-authorities" -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", ] @@ -4110,10 +4072,8 @@ dependencies = [ "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", @@ -4135,8 +4095,10 @@ version = "2.0.0" dependencies = [ "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-consensus-slots 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -4173,7 +4135,6 @@ dependencies = [ "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", @@ -4259,6 +4220,7 @@ name = "substrate-finality-grandpa-primitives" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -4331,6 +4293,8 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-peerset 2.0.0", "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "substrate-test-runtime 2.0.0", "substrate-test-runtime-client 2.0.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4610,7 +4574,6 @@ dependencies = [ "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", diff --git a/Cargo.toml b/Cargo.toml index 0f681dc766..2f4139c7af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,7 +64,6 @@ members = [ "srml/assets", "srml/aura", "srml/balances", - "srml/consensus", "srml/contract", "srml/council", "srml/democracy", diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 166a89447e..56a959ccbc 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -31,7 +31,7 @@ use consensus_common::{self, evaluation}; use primitives::{H256, Blake2Hasher, ExecutionContext}; use runtime_primitives::traits::{ Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, - AuthorityIdFor, DigestFor, + DigestFor, }; use runtime_primitives::generic::BlockId; use runtime_primitives::ApplyError; @@ -134,7 +134,6 @@ impl consensus_common::Environment<::Block> for Propose fn init( &self, parent_header: &<::Block as BlockT>::Header, - _: &[AuthorityIdFor<::Block>], ) -> Result { let parent_hash = parent_header.hash(); @@ -320,7 +319,6 @@ mod tests { let mut proposer = proposer_factory.init( &client.header(&BlockId::number(0)).unwrap().unwrap(), - &[] ).unwrap(); // when diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index b487770fb3..b44953a80f 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -46,12 +46,13 @@ use trie::{MemoryDB, PrefixedMemoryDB, prefixed_key}; 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::{ + generic::{BlockId, DigestItem}, Justification, StorageOverlay, ChildrenStorageOverlay, + BuildStorage +}; use runtime_primitives::traits::{ - Block as BlockT, Header as HeaderT, NumberFor, Zero, One, Digest, DigestItem, - SaturatedConversion + Block as BlockT, Header as HeaderT, NumberFor, Zero, One, SaturatedConversion }; -use runtime_primitives::BuildStorage; use state_machine::backend::Backend as StateBackend; use executor::RuntimeInfo; use state_machine::{CodeExecutor, DBValue}; @@ -428,7 +429,11 @@ where Block: BlockT, Ok(()) } - fn reset_storage(&mut self, 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::Error::GenesisInvalid.into()); @@ -542,7 +547,13 @@ impl> DbChangesTrieStorage { } /// Prune obsolete changes tries. - pub fn prune(&self, config: &ChangesTrieConfiguration, tx: &mut DBTransaction, block_hash: Block::Hash, block_num: NumberFor) { + pub fn prune( + &self, + config: &ChangesTrieConfiguration, + tx: &mut DBTransaction, + block_hash: Block::Hash, + block_num: NumberFor, + ) { // never prune on archive nodes let min_blocks_to_keep = match self.min_blocks_to_keep { Some(min_blocks_to_keep) => min_blocks_to_keep, @@ -1429,7 +1440,6 @@ mod tests { changes: Vec<(Vec, Vec)>, extrinsics_root: H256, ) -> H256 { - use runtime_primitives::generic::DigestItem; use runtime_primitives::testing::Digest; let (changes_root, changes_trie_update) = prepare_changes(changes); diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index b3398bfdff..0abce00528 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -31,11 +31,8 @@ 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, NumberFor, Digest, DigestItem, -}; +use runtime_primitives::generic::{DigestItem, BlockId}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor}; use consensus_common::well_known_cache_keys; use crate::cache::{DbCacheSync, DbCache, ComplexBlockId, EntryType as CacheEntryType}; use crate::utils::{self, meta_keys, Meta, db_err, read_db, block_id_to_lookup_key, read_meta}; @@ -574,11 +571,10 @@ pub(crate) mod tests { use client::cht; use runtime_primitives::generic::DigestItem; use runtime_primitives::testing::{H256 as Hash, Header, Block as RawBlock, ExtrinsicWrapper}; - use runtime_primitives::traits::AuthorityIdFor; use super::*; type Block = RawBlock>; - type AuthorityId = AuthorityIdFor; + type AuthorityId = primitives::ed25519::Public; pub fn default_header(parent: &Hash, number: u64) -> Header { Header { @@ -871,7 +867,7 @@ pub(crate) mod tests { fn authorities_are_cached() { let db = LightStorage::new_test(); - fn run_checks(db: &LightStorage, max: u64, checks: &[(u64, Option>>)]) { + fn run_checks(db: &LightStorage, max: u64, checks: &[(u64, Option>)]) { for (at, expected) in checks.iter().take_while(|(at, _)| *at <= max) { let actual = get_authorities(db.cache(), BlockId::Number(*at)); assert_eq!(*expected, actual); diff --git a/core/client/src/client.rs b/core/client/src/client.rs index ea1dfe6a45..b8969ed49e 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -36,9 +36,10 @@ use consensus::{ }; use runtime_primitives::traits::{ Block as BlockT, Header as HeaderT, Zero, NumberFor, CurrentHeight, - BlockNumberToHash, ApiRef, ProvideRuntimeApi, Digest, DigestItem, + BlockNumberToHash, ApiRef, ProvideRuntimeApi, SaturatedConversion, One, DigestFor, }; +use runtime_primitives::generic::DigestItem; use runtime_primitives::BuildStorage; use crate::runtime_api::{ CallRuntimeAt, ConstructRuntimeApi, Core as CoreApi, ProofRecorder, @@ -1760,8 +1761,7 @@ pub(crate) mod tests { use std::collections::HashMap; use super::*; use primitives::blake2_256; - use runtime_primitives::traits::DigestItem as DigestItemT; - use runtime_primitives::generic::DigestItem; + use runtime_primitives::DigestItem; use consensus::{BlockOrigin, SelectChain}; use test_client::{ prelude::*, diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index 54e1ac027b..d0283147fa 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -20,11 +20,8 @@ use std::collections::HashMap; use std::sync::Arc; use parking_lot::{RwLock, Mutex}; use primitives::{ChangesTrieConfiguration, storage::well_known_keys}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ - Block as BlockT, Header as HeaderT, Zero, - NumberFor, Digest, DigestItem -}; +use runtime_primitives::generic::{BlockId, DigestItem}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor}; use runtime_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::backend::{Backend as StateBackend, InMemory}; use state_machine::{self, InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId}; @@ -631,10 +628,9 @@ where self.states.write().insert(hash, operation.new_state.unwrap_or_else(|| old_state.clone())); - let changes_trie_root = header.digest().log(DigestItem::as_changes_trie_root).cloned(); - if let Some(changes_trie_root) = changes_trie_root { + let maybe_changes_trie_root = header.digest().log(DigestItem::as_changes_trie_root).cloned(); + if let Some(changes_trie_root) = maybe_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(), changes_trie_root, diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index a95b73a960..4dba803921 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -552,7 +552,25 @@ mod tests { let local_executor = RemoteCallExecutor::new(Arc::new(backend.blockchain().clone()), Arc::new(OkCallFetcher::new(vec![1]))); let remote_executor = RemoteCallExecutor::new(Arc::new(backend.blockchain().clone()), Arc::new(OkCallFetcher::new(vec![2]))); let remote_or_local = RemoteOrLocalCallExecutor::new(backend, remote_executor, local_executor); - assert_eq!(remote_or_local.call(&BlockId::Number(0), "test_method", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new()).unwrap(), vec![1]); - assert_eq!(remote_or_local.call(&BlockId::Number(1), "test_method", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new()).unwrap(), vec![2]); + assert_eq!( + remote_or_local.call( + &BlockId::Number(0), + "test_method", + &[], + ExecutionStrategy::NativeElseWasm, + NeverOffchainExt::new(), + ).unwrap(), + vec![1], + ); + assert_eq!( + remote_or_local.call( + &BlockId::Number(1), + "test_method", + &[], + ExecutionStrategy::NativeElseWasm, + NeverOffchainExt::new(), + ).unwrap(), + vec![2], + ); } } diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index bacfb45a7e..c77ebcd0fd 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -501,7 +501,7 @@ pub mod tests { RemoteCallRequest, RemoteHeaderRequest}; use crate::light::blockchain::tests::{DummyStorage, DummyBlockchain}; use primitives::{blake2_256, Blake2Hasher, H256}; - use primitives::storage::{StorageKey, well_known_keys}; + use primitives::storage::{well_known_keys, StorageKey}; use runtime_primitives::generic::BlockId; use state_machine::Backend; use super::*; @@ -564,10 +564,10 @@ pub mod tests { remote_block_header.state_root = remote_client.state_at(&remote_block_id).unwrap().storage_root(::std::iter::empty()).0.into(); // 'fetch' read proof from remote node - let authorities_len = remote_client.storage(&remote_block_id, &StorageKey(well_known_keys::AUTHORITY_COUNT.to_vec())) + let heap_pages = remote_client.storage(&remote_block_id, &StorageKey(well_known_keys::HEAP_PAGES.to_vec())) .unwrap() .and_then(|v| Decode::decode(&mut &v.0[..])).unwrap(); - let remote_read_proof = remote_client.read_proof(&remote_block_id, well_known_keys::AUTHORITY_COUNT).unwrap(); + let remote_read_proof = remote_client.read_proof(&remote_block_id, well_known_keys::HEAP_PAGES).unwrap(); // check remote read proof locally let local_storage = InMemoryBlockchain::::new(); @@ -580,7 +580,7 @@ pub mod tests { ).unwrap(); let local_executor = test_client::LocalExecutor::new(None); let local_checker = LightDataChecker::new(Arc::new(DummyBlockchain::new(DummyStorage::new())), local_executor); - (local_checker, remote_block_header, remote_read_proof, authorities_len) + (local_checker, remote_block_header, remote_read_proof, heap_pages) } fn prepare_for_header_proof_check(insert_cht: bool) -> (TestChecker, Hash, Header, Vec>) { @@ -619,13 +619,13 @@ pub mod tests { #[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(); + let (local_checker, remote_block_header, remote_read_proof, heap_pages) = prepare_for_read_proof_check(); assert_eq!((&local_checker as &dyn FetchChecker).check_read_proof(&RemoteReadRequest::

{ block: remote_block_header.hash(), header: remote_block_header, - key: well_known_keys::AUTHORITY_COUNT.to_vec(), + key: well_known_keys::HEAP_PAGES.to_vec(), retry_count: None, - }, remote_read_proof).unwrap().unwrap()[0], authorities_len as u8); + }, remote_read_proof).unwrap().unwrap()[0], heap_pages as u8); } #[test] diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index 4f2f841461..d14907f162 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -25,7 +25,7 @@ pub use primitives::NativeOrEncoded; #[doc(hidden)] pub use runtime_primitives::{ traits::{ - AuthorityIdFor, Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, + Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, Header as HeaderT, ApiRef, RuntimeApiInfo, Hash as HashT, }, generic::BlockId, transaction_validity::TransactionValidity, diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index c8711d0289..400f209a9b 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -14,12 +14,10 @@ runtime_io = { package = "sr-io", path = "../../sr-io" } 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-timer = "0.2.11" diff --git a/core/consensus/aura/primitives/Cargo.toml b/core/consensus/aura/primitives/Cargo.toml index a5e24e6fbe..74f678a6c0 100644 --- a/core/consensus/aura/primitives/Cargo.toml +++ b/core/consensus/aura/primitives/Cargo.toml @@ -6,12 +6,18 @@ description = "Primitives for Aura consensus" edition = "2018" [dependencies] +parity-codec = { version = "3.5", default-features = false } substrate-client = { path = "../../../client", default-features = false } +substrate-primitives = { path = "../../../primitives", default-features = false } +rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } [features] default = ["std"] std = [ + "rstd/std", + "parity-codec/std", "runtime_primitives/std", "substrate-client/std", + "substrate-primitives/std", ] diff --git a/core/consensus/aura/primitives/src/lib.rs b/core/consensus/aura/primitives/src/lib.rs index 47b6ec7c14..9bdf39d293 100644 --- a/core/consensus/aura/primitives/src/lib.rs +++ b/core/consensus/aura/primitives/src/lib.rs @@ -18,20 +18,32 @@ #![cfg_attr(not(feature = "std"), no_std)] +use parity_codec::{Encode, Decode, Codec}; use substrate_client::decl_runtime_apis; +use rstd::vec::Vec; use runtime_primitives::ConsensusEngineId; /// The `ConsensusEngineId` of AuRa. pub const AURA_ENGINE_ID: ConsensusEngineId = [b'a', b'u', b'r', b'a']; +/// An consensus log item for Aura. +#[derive(Decode, Encode)] +pub enum ConsensusLog { + /// The authorities have changed. + AuthoritiesChange(Vec), +} + decl_runtime_apis! { /// API necessary for block authorship with aura. - pub trait AuraApi { + pub trait AuraApi { /// Return the slot duration in seconds for Aura. /// 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() -> u64; + + // Return the current set of authorities. + fn authorities() -> Vec; } } diff --git a/core/consensus/aura/src/digest.rs b/core/consensus/aura/src/digest.rs index fe85c5807e..1fe79324f4 100644 --- a/core/consensus/aura/src/digest.rs +++ b/core/consensus/aura/src/digest.rs @@ -18,20 +18,22 @@ //! //! This implements the digests for AuRa, to allow the private //! `CompatibleDigestItem` trait to appear in public interfaces. + use primitives::Pair; use aura_primitives::AURA_ENGINE_ID; -use runtime_primitives::generic::DigestItem; -use parity_codec::{Encode, Decode}; +use runtime_primitives::generic::{DigestItem, OpaqueDigestItemId}; +use parity_codec::{Encode, Codec}; +use std::fmt::Debug; type Signature

=

::Signature; /// A digest item which is usable with aura consensus. -pub trait CompatibleDigestItem: Sized { +pub trait CompatibleDigestItem: Sized { /// Construct a digest item which contains a signature on the hash. - fn aura_seal(signature: Signature) -> Self; + fn aura_seal(signature: Signature

) -> Self; /// If this item is an Aura seal, return the signature. - fn as_aura_seal(&self) -> Option<&Signature>; + fn as_aura_seal(&self) -> Option>; /// Construct a digest item which contains the slot number fn aura_pre_digest(slot_num: u64) -> Self; @@ -40,18 +42,17 @@ pub trait CompatibleDigestItem: Sized { fn as_aura_pre_digest(&self) -> Option; } -impl CompatibleDigestItem

for DigestItem - where P: Pair, P::Signature: Clone + Encode + Decode, +impl CompatibleDigestItem

for DigestItem where + P: Pair, + Signature

: Codec, + Hash: Debug + Send + Sync + Eq + Clone + Codec + 'static { fn aura_seal(signature: Signature

) -> Self { - DigestItem::Seal(AURA_ENGINE_ID, signature) + DigestItem::Seal(AURA_ENGINE_ID, signature.encode()) } - fn as_aura_seal(&self) -> Option<&Signature

> { - match self { - DigestItem::Seal(AURA_ENGINE_ID, ref sig) => Some(sig), - _ => None, - } + fn as_aura_seal(&self) -> Option> { + self.try_to(OpaqueDigestItemId::Seal(&AURA_ENGINE_ID)) } fn aura_pre_digest(slot_num: u64) -> Self { @@ -59,9 +60,6 @@ impl CompatibleDigestItem

for DigestItem Option { - match self { - DigestItem::PreRuntime(AURA_ENGINE_ID, ref buffer) => Decode::decode(&mut &buffer[..]), - _ => None, - } + self.try_to(OpaqueDigestItemId::PreRuntime(&AURA_ENGINE_ID)) } } diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 32d49614c4..dc8a5ca2e4 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -25,13 +25,15 @@ //! //! Blocks from future steps will be either deferred or rejected depending on how //! far in the future they are. +//! +//! NOTE: Aura itself is designed to be generic over the crypto used. #![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, +use parity_codec::{Encode, Decode, Codec}; +use consensus_common::{self, BlockImport, Environment, Proposer, ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, - SelectChain, well_known_cache_keys + SelectChain, well_known_cache_keys::{self, Id as CacheKeyId} }; use consensus_common::import_queue::{ Verifier, BasicQueue, SharedBlockImport, SharedJustificationImport, SharedFinalityProofImport, @@ -45,15 +47,11 @@ use client::{ backend::AuxStore, }; -use runtime_primitives::{generic::{self, BlockId}, Justification}; -use runtime_primitives::traits::{ - Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, - Zero, Member, -}; +use runtime_primitives::{generic::{self, BlockId, OpaqueDigestItemId}, Justification}; +use runtime_primitives::traits::{Block, Header, DigestItemFor, ProvideRuntimeApi, Zero, Member}; use primitives::Pair; use inherents::{InherentDataProviders, InherentData}; -use authorities::AuthoritiesApi; use futures::{Future, IntoFuture, future}; use tokio_timer::Timeout; @@ -82,9 +80,12 @@ 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 + pub fn get_or_compute(client: &C) -> CResult where - C: AuxStore, C: ProvideRuntimeApi, C::Api: AuraApi, + A: Codec, + B: Block, + C: AuxStore + ProvideRuntimeApi, + C::Api: AuraApi, { slots::SlotDuration::get_or_compute(client, |a, b| a.slot_duration(b)).map(Self) } @@ -138,19 +139,14 @@ pub fn start_aura( ) -> Result, consensus_common::Error> where B: Block, C: ProvideRuntimeApi + ProvideCache + AuxStore + Send + Sync, - C::Api: AuthoritiesApi, + C::Api: AuraApi>, SC: SelectChain, - generic::DigestItem: DigestItem, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, P: Pair + Send + Sync + 'static, P::Public: Hash + Member + Encode + Decode, P::Signature: Hash + Member + Encode + Decode, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, - H: Header< - Digest=generic::Digest>, - Hash=B::Hash, - >, + H: Header, E: Environment, I: BlockImport + Send + Sync + 'static, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, @@ -189,20 +185,16 @@ struct AuraWorker { impl SlotWorker for AuraWorker where B: Block, C: ProvideRuntimeApi + ProvideCache + Sync, - C::Api: AuthoritiesApi, + C::Api: AuraApi>, E: Environment, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, - H: Header< - Digest=generic::Digest>, - Hash=B::Hash, - >, + H: Header, I: BlockImport + Send + Sync + 'static, P: Pair + Send + Sync + 'static, P::Public: Member + Encode + Decode + Hash, P::Signature: Member + Encode + Decode + Hash + Debug, SO: SyncOracle + Send + Clone, - DigestItemFor: CompatibleDigestItem

+ DigestItem, Hash=B::Hash>, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { type OnSlot = Box + Send>; @@ -257,7 +249,7 @@ impl SlotWorker for AuraWorker w ); // we are the slot author. make a block and sign it. - let proposer = match env.init(&chain_head, &authorities) { + let proposer = match env.init(&chain_head) { Ok(p) => p, Err(e) => { warn!("Unable to author block in slot {:?}: {:?}", slot_num, e); @@ -506,13 +498,12 @@ impl AuraVerifier #[forbid(deprecated)] impl Verifier for AuraVerifier where - C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore, - C::Api: BlockBuilderApi, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, + C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore + ProvideCache, + C::Api: BlockBuilderApi + AuraApi>, + DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, P::Public: Send + Sync + Hash + Eq + Clone + Decode + Encode + Debug + AsRef + 'static, P::Signature: Encode + Decode, - Self: Authorities, { fn verify( &self, @@ -520,13 +511,13 @@ impl Verifier for AuraVerifier where header: B::Header, justification: Option, mut body: Option>, - ) -> Result<(ImportBlock, Option>>), String> { + ) -> Result<(ImportBlock, Option)>>), String> { let mut inherent_data = self.inherent_data_providers.create_inherent_data().map_err(String::from)?; let (timestamp_now, slot_now) = AuraSlotCompatible::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)) + let authorities = authorities(self.client.as_ref(), &BlockId::Hash(parent_hash)) .map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?; // we add one to allow for some small drift. @@ -569,9 +560,14 @@ impl Verifier for AuraVerifier where trace!(target: "aura", "Checked {:?}; importing.", pre_header); telemetry!(CONSENSUS_TRACE; "aura.checked_and_importing"; "pre_header" => ?pre_header); - let new_authorities = pre_header.digest() - .log(DigestItem::as_authorities_change) - .map(|digest| digest.to_vec()); + // `Consensus` is the Aura-specific authorities change log. + let maybe_keys = pre_header.digest() + .convert_first(|l| l.try_to::>>( + OpaqueDigestItemId::Consensus(&AURA_ENGINE_ID) + )) + .map(|ConsensusLog::AuthoritiesChange(a)| + vec![(well_known_cache_keys::AUTHORITIES, a.encode())] + ); let import_block = ImportBlock { origin, @@ -584,7 +580,7 @@ impl Verifier for AuraVerifier where fork_choice: ForkChoiceStrategy::LongestChain, }; - Ok((import_block, new_authorities)) + Ok((import_block, maybe_keys)) } CheckedHeader::Deferred(a, b) => { debug!(target: "aura", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); @@ -597,22 +593,11 @@ impl Verifier for AuraVerifier where } } -impl Authorities for AuraVerifier where +fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where + A: Codec, 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 initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where - B: Block, - C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, + C::Api: AuraApi, { // no cache => no initialization let cache = match client.cache() { @@ -622,7 +607,7 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> // check if we already have initialized the cache let genesis_id = BlockId::Number(Zero::zero()); - let genesis_authorities: Option>> = cache + 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() { @@ -642,10 +627,11 @@ fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> } #[allow(deprecated)] -fn authorities(client: &C, at: &BlockId) -> Result>, ConsensusError> where +fn authorities(client: &C, at: &BlockId) -> Result, ConsensusError> where + A: Codec, B: Block, C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, + C::Api: AuraApi, { client .cache() @@ -653,7 +639,7 @@ fn authorities(client: &C, at: &BlockId) -> Result( ) -> Result, consensus_common::Error> where B: Block, C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore, - C::Api: BlockBuilderApi + AuthoritiesApi, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, + C::Api: BlockBuilderApi + AuraApi>, + DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode + AsRef, P::Signature: Encode + Decode, @@ -730,7 +716,12 @@ mod tests { type Error = client::error::Error; - type TestClient = client::Client; + type TestClient = client::Client< + test_client::Backend, + test_client::Executor, + TestBlock, + test_client::runtime::RuntimeApi + >; struct DummyFactory(Arc); struct DummyProposer(u64, Arc); @@ -739,7 +730,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &::Header, _authorities: &[AuthorityId]) + fn init(&self, parent_header: &::Header) -> Result { Ok(DummyProposer(parent_header.number + 1, self.0.clone())) diff --git a/core/consensus/authorities/Cargo.toml b/core/consensus/authorities/Cargo.toml deleted file mode 100644 index c4249f39d4..0000000000 --- a/core/consensus/authorities/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "substrate-consensus-authorities" -version = "2.0.0" -authors = ["Parity Technologies "] -description = "Primitives for Aura consensus" -edition = "2018" - -[dependencies] -parity-codec = { version = "3.3", default-features = false } -substrate-client = { path = "../../client", default-features = false } -primitives = { package = "substrate-primitives", path = "../../primitives", default-features = false } -runtime_support = { package = "srml-support", path = "../../../srml/support", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives", default-features = false } -sr-version = { path = "../../sr-version", default-features = false } -runtime_io = { package = "sr-io", path = "../../sr-io", default-features = false } -rstd = { package = "sr-std", path = "../../sr-std", default-features = false } - -[features] -default = ["std"] -std = [ - "parity-codec/std", - "substrate-client/std", - "primitives/std", - "runtime_support/std", - "runtime_primitives/std", - "sr-version/std", - "runtime_io/std", - "rstd/std" -] diff --git a/core/consensus/authorities/src/lib.rs b/core/consensus/authorities/src/lib.rs deleted file mode 100644 index a5ad974f5b..0000000000 --- a/core/consensus/authorities/src/lib.rs +++ /dev/null @@ -1,31 +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 . - -//! Authorities API. - -#![cfg_attr(not(feature = "std"), no_std)] - -use substrate_client::decl_runtime_apis; -use runtime_primitives::traits::AuthorityIdFor; -use rstd::vec::Vec; - -decl_runtime_apis! { - /// Authorities API. - pub trait AuthoritiesApi { - /// Returns the authorities at the given block. - fn authorities() -> Vec>; - } -} diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 1eaf05e4a0..a20b7de001 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -14,12 +14,10 @@ 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" diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index 67700c8ee0..fd45f6470a 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -7,13 +7,16 @@ edition = "2018" [dependencies] substrate-client = { path = "../../../client", default-features = false } +rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } +substrate-primitives = { path = "../../../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 = [ + "rstd/std", "runtime_primitives/std", "substrate-client/std", "parity-codec/std", diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index 0e49c45198..cd056544e6 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -18,13 +18,18 @@ #![deny(warnings, unsafe_code, missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +use parity_codec::{Encode, Decode}; +use rstd::vec::Vec; use runtime_primitives::ConsensusEngineId; +use substrate_primitives::sr25519::Public; use substrate_client::decl_runtime_apis; -use parity_codec::{Encode, Decode}; +/// A Babe authority identifier. Necessarily equivalent to the schnorrkel public key used in +/// the main Babe module. If that ever changes, then this must, too. +pub type AuthorityId = Public; /// The `ConsensusEngineId` of BABE. -pub const BABE_ENGINE_ID: ConsensusEngineId = [b'b', b'a', b'b', b'e']; +pub const BABE_ENGINE_ID: ConsensusEngineId = *b"BABE"; /// Configuration data used by the BABE consensus engine. #[derive(Copy, Clone, Hash, PartialEq, Eq, Debug, Encode, Decode)] @@ -69,5 +74,8 @@ decl_runtime_apis! { /// /// Dynamic configuration may be supported in the future. fn startup_data() -> BabeConfiguration; + + /// Get the current authorites for Babe. + fn authorities() -> Vec; } } diff --git a/core/consensus/babe/src/digest.rs b/core/consensus/babe/src/digest.rs index b26a1508b5..7356001cf7 100644 --- a/core/consensus/babe/src/digest.rs +++ b/core/consensus/babe/src/digest.rs @@ -15,12 +15,12 @@ // along with Substrate. If not, see . //! Private mplementation details of BABE digests. + use primitives::sr25519::{Public, Signature}; use babe_primitives::BABE_ENGINE_ID; -use runtime_primitives::generic::DigestItem; +use runtime_primitives::{DigestItem, generic::OpaqueDigestItemId}; use std::fmt::Debug; -use parity_codec::{Decode, Encode, Input}; -use log::info; +use parity_codec::{Decode, Encode, Codec, Input}; use schnorrkel::{ vrf::{VRFProof, VRFOutput, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}, PUBLIC_KEY_LENGTH, @@ -89,26 +89,15 @@ pub trait CompatibleDigestItem: Sized { fn as_babe_seal(&self) -> Option; } -impl CompatibleDigestItem for DigestItem> +impl CompatibleDigestItem for DigestItem where + Hash: Debug + Send + Sync + Eq + Clone + Codec + 'static { fn babe_pre_digest(digest: BabePreDigest) -> Self { DigestItem::PreRuntime(BABE_ENGINE_ID, digest.encode()) } fn as_babe_pre_digest(&self) -> Option { - match self { - DigestItem::PreRuntime(BABE_ENGINE_ID, seal) => { - let decoded = Decode::decode(&mut &seal[..]); - if decoded.is_none() { - info!(target: "babe", "Failed to decode {:?}", seal) - } - decoded - } - _ => { - info!(target: "babe", "Invalid consensus: {:?}!", self); - None - } - } + self.try_to(OpaqueDigestItemId::PreRuntime(&BABE_ENGINE_ID)) } fn babe_seal(signature: Signature) -> Self { @@ -116,34 +105,6 @@ impl CompatibleDigestItem for DigestItem> } fn as_babe_seal(&self) -> Option { - match self { - DigestItem::Seal(BABE_ENGINE_ID, signature) => Decode::decode(&mut &signature[..]), - _ => None, - } + self.try_to(OpaqueDigestItemId::Seal(&BABE_ENGINE_ID)) } } - -impl CompatibleDigestItem for DigestItem -{ - fn babe_pre_digest(digest: BabePreDigest) -> Self { - DigestItem::PreRuntime(BABE_ENGINE_ID, digest.encode()) - } - - fn as_babe_pre_digest(&self) -> Option { - match self { - DigestItem::PreRuntime(BABE_ENGINE_ID, seal) => Decode::decode(&mut &seal[..]), - _ => None, - } - } - - fn babe_seal(signature: Signature) -> Self { - DigestItem::Seal(BABE_ENGINE_ID, signature) - } - - fn as_babe_seal(&self) -> Option { - match self { - DigestItem::Seal(BABE_ENGINE_ID, signature) => Some(signature.clone()), - _ => None, - } - } -} \ No newline at end of file diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 3e98817e1d..8a81612183 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -31,18 +31,16 @@ use digest::CompatibleDigestItem; pub use digest::{BabePreDigest, BABE_VRF_PREFIX}; pub use babe_primitives::*; pub use consensus_common::SyncOracle; -use runtime_primitives::{generic, generic::BlockId, Justification}; +use consensus_common::well_known_cache_keys::Id as CacheKeyId; +use runtime_primitives::{generic, generic::{BlockId, OpaqueDigestItemId}, Justification}; use runtime_primitives::traits::{ - Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, + Block, Header, DigestItemFor, ProvideRuntimeApi, SimpleBitOps, }; use std::{sync::Arc, u64, fmt::{Debug, Display}}; use runtime_support::serde::{Serialize, Deserialize}; use parity_codec::{Decode, Encode}; -use primitives::{ - crypto::Pair, - sr25519::{Public, Signature, self}, -}; +use primitives::{crypto::Pair, sr25519}; use merlin::Transcript; use inherents::{InherentDataProviders, InherentData}; use substrate_telemetry::{ @@ -58,9 +56,8 @@ use schnorrkel::{ VRFProof, VRFProofBatchable, VRFInOut, }, }; -use authorities::AuthoritiesApi; use consensus_common::{ - self, Authorities, BlockImport, Environment, Proposer, + self, BlockImport, Environment, Proposer, ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, }; use srml_babe::{ @@ -83,6 +80,7 @@ use log::{error, warn, debug, info, trace}; use slots::{SlotWorker, SlotData, SlotInfo, SlotCompatible, slot_now}; +pub use babe_primitives::AuthorityId; /// A slot duration. Create with `get_or_compute`. // FIXME: Once Rust has higher-kinded types, the duplication between this @@ -181,16 +179,11 @@ pub fn start_babe(BabeParams { > where B: Block, C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, + C::Api: BabeApi, SC: SelectChain, - generic::DigestItem: DigestItem, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, - DigestItemFor: CompatibleDigestItem + DigestItem, - H: Header< - Digest=generic::Digest>, - Hash=B::Hash, - >, + H: Header, E: Environment, I: BlockImport + Send + Sync + 'static, Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, @@ -228,17 +221,14 @@ struct BabeWorker { impl SlotWorker for BabeWorker where B: Block, C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, + C::Api: BabeApi, E: Environment, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, Hash: Debug + Eq + Copy + SimpleBitOps + Encode + Decode + Serialize + for<'de> Deserialize<'de> + Debug + Default + AsRef<[u8]> + AsMut<[u8]> + std::hash::Hash + Display + Send + Sync + 'static, - H: Header< - Digest=generic::Digest>, - Hash=B::Hash, - >, + H: Header, I: BlockImport + Send + Sync + 'static, SO: SyncOracle + Send + Clone, Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, @@ -304,7 +294,7 @@ impl SlotWorker for BabeWorker w ); // we are the slot author. make a block and sign it. - let proposer = match env.init(&chain_head, &authorities) { + let proposer = match env.init(&chain_head) { Ok(p) => p, Err(e) => { warn!(target: "babe", "Unable to author block in slot {:?}: {:?}", slot_num, e); @@ -450,7 +440,7 @@ fn check_header( slot_now: u64, mut header: B::Header, hash: B::Hash, - authorities: &[Public], + authorities: &[AuthorityId], threshold: u64, ) -> Result, DigestItemFor)>, String> where DigestItemFor: CompatibleDigestItem, @@ -553,10 +543,9 @@ impl BabeVerifier { } impl Verifier for BabeVerifier where - C: ProvideRuntimeApi + Send + Sync + AuxStore, - C::Api: BlockBuilderApi, - DigestItemFor: CompatibleDigestItem + DigestItem, - Self: Authorities, + C: ProvideRuntimeApi + Send + Sync + AuxStore + ProvideCache, + C::Api: BlockBuilderApi + BabeApi, + DigestItemFor: CompatibleDigestItem, { fn verify( &self, @@ -564,7 +553,7 @@ impl Verifier for BabeVerifier where header: B::Header, justification: Option, mut body: Option>, - ) -> Result<(ImportBlock, Option>), String> { + ) -> Result<(ImportBlock, Option)>>), String> { trace!( target: "babe", "Verifying origin: {:?} header: {:?} justification: {:?} body: {:?}", @@ -583,7 +572,7 @@ impl Verifier for BabeVerifier where .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)) + let authorities = authorities(self.client.as_ref(), &BlockId::Hash(parent_hash)) .map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?; // we add one to allow for some small drift. @@ -625,9 +614,12 @@ impl Verifier for BabeVerifier where "babe.checked_and_importing"; "pre_header" => ?pre_header); - let new_authorities = pre_header.digest() - .log(DigestItem::as_authorities_change) - .map(|digest| digest.to_vec()); + // `Consensus` is the Babe-specific authorities change log. + // It's an encoded `Vec`, the same format as is stored in the cache, + // so no need to decode/re-encode. + let maybe_keys = pre_header.digest() + .log(|l| l.try_as_raw(OpaqueDigestItemId::Consensus(&BABE_ENGINE_ID))) + .map(|blob| vec![(well_known_cache_keys::AUTHORITIES, blob.to_vec())]); let import_block = ImportBlock { origin, @@ -641,7 +633,7 @@ impl Verifier for BabeVerifier where }; // FIXME #1019 extract authorities - Ok((import_block, new_authorities)) + Ok((import_block, maybe_keys)) } CheckedHeader::Deferred(a, b) => { debug!(target: "babe", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); @@ -654,33 +646,21 @@ impl Verifier for BabeVerifier where } } -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>, + Vec, ConsensusError, > where B: Block, C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, + C::Api: BabeApi, { 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() + if client.runtime_api().has_api::>(at).unwrap_or(false) { + BabeApi::authorities(&*client.runtime_api(), at).ok() } else { panic!("We don’t support deprecated code with new consensus algorithms, \ therefore this is unreachable; qed") @@ -740,7 +720,7 @@ fn claim_slot( slot_number: u64, genesis_hash: &[u8], epoch: u64, - authorities: &[sr25519::Public], + authorities: &[AuthorityId], key: &sr25519::Pair, threshold: u64, ) -> Option<(VRFInOut, VRFProof, VRFProofBatchable)> { @@ -784,7 +764,7 @@ mod tests { use futures::stream::Stream; use log::debug; use std::time::Duration; - type Item = generic::DigestItem; + type Item = generic::DigestItem; use test_client::AuthorityKeyring; type Error = client::error::Error; @@ -803,7 +783,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &::Header, _authorities: &[Public]) + fn init(&self, parent_header: &::Header) -> Result { Ok(DummyProposer(parent_header.number + 1, self.0.clone())) @@ -977,7 +957,7 @@ mod tests { fn wrong_consensus_engine_id_rejected() { drop(env_logger::try_init()); let sig = sr25519::Pair::generate().0.sign(b""); - let bad_seal: Item = DigestItem::Seal([0; 4], sig); + let bad_seal: Item = DigestItem::Seal([0; 4], sig.0.to_vec()); assert!(bad_seal.as_babe_pre_digest().is_none()); assert!(bad_seal.as_babe_seal().is_none()) } @@ -985,7 +965,7 @@ mod tests { #[test] fn malformed_pre_digest_rejected() { drop(env_logger::try_init()); - let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, Signature([0; 64])); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, [0; 64].to_vec()); assert!(bad_seal.as_babe_pre_digest().is_none()); } @@ -993,7 +973,7 @@ mod tests { fn sig_is_not_pre_digest() { drop(env_logger::try_init()); let sig = sr25519::Pair::generate().0.sign(b""); - let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig.0.to_vec()); assert!(bad_seal.as_babe_pre_digest().is_none()); assert!(bad_seal.as_babe_seal().is_some()) } diff --git a/core/consensus/common/src/block_import.rs b/core/consensus/common/src/block_import.rs index 8ce6019131..363ba18713 100644 --- a/core/consensus/common/src/block_import.rs +++ b/core/consensus/common/src/block_import.rs @@ -154,8 +154,6 @@ impl ImportBlock { /// Get a handle to full header (with post-digests applied). pub fn post_header(&self) -> Cow { - use runtime_primitives::traits::Digest; - if self.post_digests.is_empty() { Cow::Borrowed(&self.header) } else { diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index 118bc641b2..c2ffcd4239 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -25,24 +25,16 @@ //! 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 std::{sync::Arc, thread, collections::HashMap}; use crossbeam_channel::{self as channel, Receiver, Sender}; -use parity_codec::Encode; use parking_lot::Mutex; - -use std::sync::Arc; -use std::thread; - -use runtime_primitives::traits::{ - AuthorityIdFor, Block as BlockT, Header as HeaderT, NumberFor, Digest, -}; -use runtime_primitives::Justification; - -use crate::error::Error as ConsensusError; -use parity_codec::alloc::collections::hash_map::HashMap; +use runtime_primitives::{Justification, traits::{ + Block as BlockT, Header as HeaderT, NumberFor, +}}; +use crate::{error::Error as ConsensusError, well_known_cache_keys::Id as CacheKeyId, block_import::{ + BlockImport, BlockOrigin, ImportBlock, ImportedAux, ImportResult, JustificationImport, + FinalityProofImport, FinalityProofRequestBuilder, +}}; /// Reputation change for peers which send us a block with an incomplete header. const INCOMPLETE_HEADER_REPUTATION_CHANGE: i32 = -(1 << 20); @@ -94,7 +86,7 @@ pub trait Verifier: Send + Sync { header: B::Header, justification: Option, body: Option>, - ) -> Result<(ImportBlock, Option>>), String>; + ) -> Result<(ImportBlock, Option)>>), String>; } /// Blocks import queue API. @@ -906,7 +898,7 @@ pub fn import_single_block>( 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) + let (import_block, maybe_keys) = verifier.verify(block_origin, header, justification, block.body) .map_err(|msg| { if let Some(ref peer) = peer { trace!(target: "sync", "Verifying {}({}) from {} failed: {}", number, hash, peer, msg); @@ -917,8 +909,8 @@ pub fn import_single_block>( })?; let mut cache = HashMap::new(); - if let Some(authorities) = new_authorities { - cache.insert(crate::well_known_cache_keys::AUTHORITIES, authorities.encode()); + if let Some(keys) = maybe_keys { + cache.extend(keys.into_iter()); } import_error(import_handle.import_block(import_block, cache)) @@ -979,7 +971,7 @@ mod tests { header: B::Header, justification: Option, body: Option>, - ) -> Result<(ImportBlock, Option>>), String> { + ) -> Result<(ImportBlock, Option)>>), String> { Ok((ImportBlock { origin, header, diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index 6d43b6624a..e29c4b2089 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -32,8 +32,7 @@ use std::sync::Arc; use std::time::Duration; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{AuthorityIdFor, Block, DigestFor}; +use runtime_primitives::traits::{Block, DigestFor}; use futures::prelude::*; pub use inherents::InherentData; @@ -54,14 +53,6 @@ pub use block_import::{ }; pub use select_chain::SelectChain; -/// Trait for getting the authorities at a given block. -pub trait Authorities { - type Error: std::error::Error + Send + 'static; - - /// Get the authorities at the given block. - fn authorities(&self, at: &BlockId) -> Result>, Self::Error>; -} - /// Environment producer for a Consensus instance. Creates proposer instance and communication streams. pub trait Environment { /// The proposer type this creates. @@ -71,7 +62,7 @@ pub trait Environment { /// Initialize the proposal logic on top of a specific header. Provide /// the authorities at that header. - fn init(&self, parent_header: &B::Header, authorities: &[AuthorityIdFor]) + fn init(&self, parent_header: &B::Header) -> Result; } diff --git a/core/consensus/common/src/offline_tracker.rs b/core/consensus/common/src/offline_tracker.rs index 3c6755d941..f5adbdc0e0 100644 --- a/core/consensus/common/src/offline_tracker.rs +++ b/core/consensus/common/src/offline_tracker.rs @@ -112,25 +112,24 @@ impl OfflineTracker { #[cfg(test)] mod tests { use super::*; - use primitives::ed25519::Public as AuthorityId; #[test] fn validator_offline() { - let mut tracker = OfflineTracker::::new(); - let v = AuthorityId::from_raw([0; 32]); - let v2 = AuthorityId::from_raw([1; 32]); - let v3 = AuthorityId::from_raw([2; 32]); - tracker.note_round_end(v.clone(), true); - tracker.note_round_end(v2.clone(), true); - tracker.note_round_end(v3.clone(), true); + let mut tracker = OfflineTracker::::new(); + let v1 = 1; + let v2 = 2; + let v3 = 3; + tracker.note_round_end(v1, true); + tracker.note_round_end(v2, true); + tracker.note_round_end(v3, true); let slash_time = REPORT_TIME + Duration::from_secs(5); - tracker.observed.get_mut(&v).unwrap().offline_since -= slash_time; + tracker.observed.get_mut(&v1).unwrap().offline_since -= slash_time; tracker.observed.get_mut(&v2).unwrap().offline_since -= slash_time; - assert_eq!(tracker.reports(&[v.clone(), v2.clone(), v3.clone()]), vec![0, 1]); + assert_eq!(tracker.reports(&[v1, v2, v3]), vec![0, 1]); - tracker.note_new_block(&[v.clone(), v3.clone()]); - assert_eq!(tracker.reports(&[v, v2, v3]), vec![0]); + tracker.note_new_block(&[v1, v3]); + assert_eq!(tracker.reports(&[v1, v2, v3]), vec![0]); } } diff --git a/core/consensus/rhd/Cargo.toml b/core/consensus/rhd/Cargo.toml index ee1efb8d06..d9632bac87 100644 --- a/core/consensus/rhd/Cargo.toml +++ b/core/consensus/rhd/Cargo.toml @@ -15,7 +15,6 @@ client = { package = "substrate-client", path = "../../client" } transaction_pool = { package = "substrate-transaction-pool", path = "../../transaction-pool" } runtime_support = { package = "srml-support", path = "../../../srml/support" } srml-system = { path = "../../../srml/system" } -srml-consensus = { path = "../../../srml/consensus" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 08bda16f4f..22a871bf2f 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -112,7 +112,9 @@ trait ReadPrimitive { impl ReadPrimitive for MemoryInstance { fn read_primitive(&self, offset: u32) -> ::std::result::Result { use byteorder::{LittleEndian, ByteOrder}; - Ok(LittleEndian::read_u32(&self.get(offset, 4).map_err(|_| UserError("Invalid attempt to read_primitive"))?)) + let result = self.get(offset, 4) + .map_err(|_| UserError("Invalid attempt to read_primitive"))?; + Ok(LittleEndian::read_u32(&result)) } } @@ -164,20 +166,44 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(()) }, ext_set_storage(key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32) => { - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_set_storage"))?; - let value = this.memory.get(value_data, value_len as usize).map_err(|_| UserError("Invalid attempt to determine value in ext_set_storage"))?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| UserError("Invalid attempt to determine key in ext_set_storage"))?; + let value = this.memory.get(value_data, value_len as usize) + .map_err(|_| UserError("Invalid attempt to determine value in ext_set_storage"))?; if let Some(_preimage) = this.hash_lookup.get(&key) { - debug_trace!(target: "wasm-trace", "*** Setting storage: %{} -> {} [k={}]", ::primitives::hexdisplay::ascii_format(&_preimage), HexDisplay::from(&value), HexDisplay::from(&key)); + debug_trace!( + target: "wasm-trace", + "*** Setting storage: %{} -> {} [k={}]", + ::primitives::hexdisplay::ascii_format(&_preimage), + HexDisplay::from(&value), + HexDisplay::from(&key), + ); } else { - debug_trace!(target: "wasm-trace", "*** Setting storage: {} -> {} [k={}]", ::primitives::hexdisplay::ascii_format(&key), HexDisplay::from(&value), HexDisplay::from(&key)); + debug_trace!( + target: "wasm-trace", + "*** Setting storage: {} -> {} [k={}]", + ::primitives::hexdisplay::ascii_format(&key), + HexDisplay::from(&value), + HexDisplay::from(&key), + ); } this.ext.set_storage(key, value); Ok(()) }, - 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) => { - 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_set_child_storage"))?; - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_set_child_storage"))?; - let value = this.memory.get(value_data, value_len as usize).map_err(|_| UserError("Invalid attempt to determine value in ext_set_child_storage"))?; + 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 + ) => { + 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_set_child_storage"))?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| UserError("Invalid attempt to determine key in ext_set_child_storage"))?; + let value = this.memory.get(value_data, value_len as usize) + .map_err(|_| UserError("Invalid attempt to determine value in ext_set_child_storage"))?; if let Some(_preimage) = this.hash_lookup.get(&key) { debug_trace!( target: "wasm-trace", "*** Setting child storage: {} -> %{} -> {} [k={}]", @@ -202,12 +228,18 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.ext.set_child_storage(storage_key, key, value); Ok(()) }, - ext_clear_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) => { + ext_clear_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32 + ) => { 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_clear_child_storage"))?; - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_clear_child_storage"))?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| UserError("Invalid attempt to determine key in ext_clear_child_storage"))?; debug_trace!(target: "wasm-trace", "*** Clearing child storage: {} -> {} [k={}]", ::primitives::hexdisplay::ascii_format(&storage_key), if let Some(_preimage) = this.hash_lookup.get(&key) { @@ -224,7 +256,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(()) }, ext_clear_storage(key_data: *const u8, key_len: u32) => { - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_clear_storage"))?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| UserError("Invalid attempt to determine key in ext_clear_storage"))?; debug_trace!(target: "wasm-trace", "*** Clearing storage: {} [k={}]", if let Some(_preimage) = this.hash_lookup.get(&key) { format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage)) @@ -235,15 +268,22 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(()) }, ext_exists_storage(key_data: *const u8, key_len: u32) -> u32 => { - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_exists_storage"))?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| UserError("Invalid attempt to determine key in ext_exists_storage"))?; Ok(if this.ext.exists_storage(&key) { 1 } else { 0 }) }, - ext_exists_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) -> u32 => { + ext_exists_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32 + ) -> u32 => { 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_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"))?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| UserError("Invalid attempt to determine key in ext_exists_child_storage"))?; let storage_key = ChildStorageKey::from_vec(storage_key) .ok_or_else(|| UserError("ext_exists_child_storage: child storage key is not valid") @@ -251,7 +291,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, 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"))?; + let prefix = this.memory.get(prefix_data, prefix_len as usize) + .map_err(|_| UserError("Invalid attempt to determine prefix in ext_clear_prefix"))?; this.ext.clear_prefix(&prefix); Ok(()) }, @@ -291,7 +332,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, if let Some(value) = maybe_value { 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_get_allocated_storage"))?; + this.memory.set(offset, &value) + .map_err(|_| UserError("Invalid attempt to set memory in ext_get_allocated_storage"))?; this.memory.write_primitive(written_out, value.len() as u32) .map_err(|_| UserError("Invalid attempt to write written_out in ext_get_allocated_storage"))?; Ok(offset) @@ -302,7 +344,13 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, } }, // return 0 and place u32::max_value() into written_out if no value exists for the key. - 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 => { + 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 => { let storage_key = this.memory.get( storage_key_data, storage_key_len as usize @@ -337,7 +385,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, if let Some(value) = maybe_value { 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_get_allocated_child_storage"))?; + this.memory.set(offset, &value) + .map_err(|_| UserError("Invalid attempt to set memory in ext_get_allocated_child_storage"))?; this.memory.write_primitive(written_out, value.len() as u32) .map_err(|_| UserError("Invalid attempt to write written_out in ext_get_allocated_child_storage"))?; Ok(offset) @@ -348,8 +397,15 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, } }, // return u32::max_value() if no value exists for the key. - ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32 => { - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_get_storage_into"))?; + ext_get_storage_into( + key_data: *const u8, + key_len: u32, + value_data: *mut u8, + value_len: u32, + value_offset: u32 + ) -> u32 => { + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| UserError("Invalid attempt to get key in ext_get_storage_into"))?; let maybe_value = this.ext.storage(&key); debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {} [k={}]", if let Some(_preimage) = this.hash_lookup.get(&key) { @@ -368,14 +424,23 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, if let Some(value) = maybe_value { let value = &value[value_offset as usize..]; let written = ::std::cmp::min(value_len as usize, value.len()); - this.memory.set(value_data, &value[..written]).map_err(|_| UserError("Invalid attempt to set value in ext_get_storage_into"))?; + this.memory.set(value_data, &value[..written]) + .map_err(|_| UserError("Invalid attempt to set value in ext_get_storage_into"))?; Ok(written as u32) } else { Ok(u32::max_value()) } }, // return u32::max_value() if no value exists for the key. - 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 => { + 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 => { let storage_key = this.memory.get( storage_key_data, storage_key_len as usize @@ -410,7 +475,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, if let Some(value) = maybe_value { let value = &value[value_offset as usize..]; let written = ::std::cmp::min(value_len as usize, value.len()); - this.memory.set(value_data, &value[..written]).map_err(|_| UserError("Invalid attempt to set value in ext_get_child_storage_into"))?; + this.memory.set(value_data, &value[..written]) + .map_err(|_| UserError("Invalid attempt to set value in ext_get_child_storage_into"))?; Ok(written as u32) } else { Ok(u32::max_value()) @@ -418,11 +484,17 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, }, ext_storage_root(result: *mut u8) => { let r = this.ext.storage_root(); - this.memory.set(result, r.as_ref()).map_err(|_| UserError("Invalid attempt to set memory in ext_storage_root"))?; + this.memory.set(result, r.as_ref()) + .map_err(|_| UserError("Invalid attempt to set memory in ext_storage_root"))?; Ok(()) }, - 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"))?; + 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 storage_key = ChildStorageKey::from_slice(&*storage_key) .ok_or_else(|| UserError("ext_child_storage_root: child storage key is not valid") @@ -430,7 +502,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, 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.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) @@ -446,13 +519,19 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let r = this.ext.storage_changes_root(parent_hash) .map_err(|_| UserError("Invaid parent_hash passed to ext_storage_changes_root"))?; if let Some(r) = r { - this.memory.set(result, &r[..]).map_err(|_| UserError("Invalid attempt to set memory in ext_storage_changes_root"))?; + this.memory.set(result, &r[..]) + .map_err(|_| UserError("Invalid attempt to set memory in ext_storage_changes_root"))?; Ok(1) } else { Ok(0) } }, - ext_blake2_256_enumerated_trie_root(values_data: *const u8, lens_data: *const u32, lens_len: u32, result: *mut u8) => { + ext_blake2_256_enumerated_trie_root( + values_data: *const u8, + lens_data: *const u32, + lens_len: u32, + result: *mut u8 + ) => { let values = (0..lens_len) .map(|i| this.memory.read_primitive(lens_data + i * 4)) .collect::<::std::result::Result, UserError>>()? @@ -464,7 +543,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, ) .collect::<::std::result::Result, UserError>>()?; let r = ordered_trie_root::(values.into_iter()); - this.memory.set(result, &r[..]).map_err(|_| UserError("Invalid attempt to set memory in ext_blake2_256_enumerated_trie_root"))?; + this.memory.set(result, &r[..]) + .map_err(|_| UserError("Invalid attempt to set memory in ext_blake2_256_enumerated_trie_root"))?; Ok(()) }, ext_chain_id() -> u64 => { @@ -477,7 +557,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, 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 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) = str::from_utf8(&key) { @@ -491,7 +572,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, hashed_key }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_twox_64"))?; + 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) => { @@ -501,7 +583,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, 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_128"))?; + let key = this.memory.get(data, len as usize) + .map_err(|_| UserError("Invalid attempt to get key in ext_twox_128"))?; let hashed_key = twox_128(&key); debug_trace!(target: "xxhash", "XXhash: {} -> {}", &if let Ok(_skey) = str::from_utf8(&key) { @@ -515,16 +598,20 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, hashed_key }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_twox_128"))?; + this.memory.set(out, &result) + .map_err(|_| UserError("Invalid attempt to set result in ext_twox_128"))?; Ok(()) }, ext_twox_256(data: *const u8, len: u32, out: *mut u8) => { let result: [u8; 32] = if len == 0 { twox_256(&[0u8; 0]) } else { - twox_256(&this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get data in ext_twox_256"))?) + let mem = this.memory.get(data, len as usize) + .map_err(|_| UserError("Invalid attempt to get data in ext_twox_256"))?; + twox_256(&mem) }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_twox_256"))?; + 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) => { @@ -533,39 +620,50 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, 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 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"))?; + 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]) } else { - blake2_256(&this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get data in ext_blake2_256"))?) + let mem = this.memory.get(data, len as usize) + .map_err(|_| UserError("Invalid attempt to get data in ext_blake2_256"))?; + blake2_256(&mem) }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_blake2_256"))?; + this.memory.set(out, &result) + .map_err(|_| UserError("Invalid attempt to set result in ext_blake2_256"))?; Ok(()) }, ext_keccak_256(data: *const u8, len: u32, out: *mut u8) => { let result: [u8; 32] = if len == 0 { tiny_keccak::keccak256(&[0u8; 0]) } else { - tiny_keccak::keccak256(&this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get data in ext_keccak_256"))?) + let mem = this.memory.get(data, len as usize) + .map_err(|_| UserError("Invalid attempt to get data in ext_keccak_256"))?; + tiny_keccak::keccak256(&mem) }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_keccak_256"))?; + this.memory.set(out, &result) + .map_err(|_| UserError("Invalid attempt to set result in ext_keccak_256"))?; Ok(()) }, ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => { let mut sig = [0u8; 64]; - this.memory.get_into(sig_data, &mut sig[..]).map_err(|_| UserError("Invalid attempt to get signature in ext_ed25519_verify"))?; + this.memory.get_into(sig_data, &mut sig[..]) + .map_err(|_| UserError("Invalid attempt to get signature in ext_ed25519_verify"))?; let mut pubkey = [0u8; 32]; - this.memory.get_into(pubkey_data, &mut pubkey[..]).map_err(|_| UserError("Invalid attempt to get pubkey in ext_ed25519_verify"))?; - let msg = this.memory.get(msg_data, msg_len as usize).map_err(|_| UserError("Invalid attempt to get message in ext_ed25519_verify"))?; + this.memory.get_into(pubkey_data, &mut pubkey[..]) + .map_err(|_| UserError("Invalid attempt to get pubkey in ext_ed25519_verify"))?; + let msg = this.memory.get(msg_data, msg_len as usize) + .map_err(|_| UserError("Invalid attempt to get message in ext_ed25519_verify"))?; Ok(if ed25519::Pair::verify_weak(&sig, &msg, &pubkey) { 0 @@ -575,10 +673,13 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, }, ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => { let mut sig = [0u8; 64]; - this.memory.get_into(sig_data, &mut sig[..]).map_err(|_| UserError("Invalid attempt to get signature in ext_sr25519_verify"))?; + this.memory.get_into(sig_data, &mut sig[..]) + .map_err(|_| UserError("Invalid attempt to get signature in ext_sr25519_verify"))?; let mut pubkey = [0u8; 32]; - this.memory.get_into(pubkey_data, &mut pubkey[..]).map_err(|_| UserError("Invalid attempt to get pubkey in ext_sr25519_verify"))?; - let msg = this.memory.get(msg_data, msg_len as usize).map_err(|_| UserError("Invalid attempt to get message in ext_sr25519_verify"))?; + this.memory.get_into(pubkey_data, &mut pubkey[..]) + .map_err(|_| UserError("Invalid attempt to get pubkey in ext_sr25519_verify"))?; + let msg = this.memory.get(msg_data, msg_len as usize) + .map_err(|_| UserError("Invalid attempt to get message in ext_sr25519_verify"))?; Ok(if sr25519::Pair::verify_weak(&sig, &msg, &pubkey) { 0 @@ -588,7 +689,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, }, ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32 => { let mut sig = [0u8; 65]; - this.memory.get_into(sig_data, &mut sig[..]).map_err(|_| UserError("Invalid attempt to get signature in ext_secp256k1_ecdsa_recover"))?; + this.memory.get_into(sig_data, &mut sig[..]) + .map_err(|_| UserError("Invalid attempt to get signature in ext_secp256k1_ecdsa_recover"))?; let rs = match secp256k1::Signature::parse_slice(&sig[0..64]) { Ok(rs) => rs, _ => return Ok(1), @@ -600,14 +702,16 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let mut msg = [0u8; 32]; - this.memory.get_into(msg_data, &mut msg[..]).map_err(|_| UserError("Invalid attempt to get message in ext_secp256k1_ecdsa_recover"))?; + this.memory.get_into(msg_data, &mut msg[..]) + .map_err(|_| UserError("Invalid attempt to get message in ext_secp256k1_ecdsa_recover"))?; let pubkey = match secp256k1::recover(&secp256k1::Message::parse(&msg), &rs, &v) { Ok(pk) => pk, _ => return Ok(3), }; - this.memory.set(pubkey_data, &pubkey.serialize()[1..65]).map_err(|_| UserError("Invalid attempt to set pubkey in ext_secp256k1_ecdsa_recover"))?; + this.memory.set(pubkey_data, &pubkey.serialize()[1..65]) + .map_err(|_| UserError("Invalid attempt to set pubkey in ext_secp256k1_ecdsa_recover"))?; Ok(0) }, @@ -986,7 +1090,16 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.sandbox_store.instance_teardown(instance_idx)?; Ok(()) }, - ext_sandbox_invoke(instance_idx: u32, export_ptr: *const u8, export_len: usize, args_ptr: *const u8, args_len: usize, return_val_ptr: *const u8, return_val_len: usize, state: usize) -> u32 => { + ext_sandbox_invoke( + instance_idx: u32, + export_ptr: *const u8, + export_len: usize, + args_ptr: *const u8, + args_len: usize, + return_val_ptr: *const u8, + return_val_len: usize, + state: usize + ) -> u32 => { use parity_codec::{Decode, Encode}; trace!(target: "sr-sandbox", "invoke, instance_idx={}", instance_idx); diff --git a/core/executor/wasm/src/lib.rs b/core/executor/wasm/src/lib.rs index 193ff5c9c0..41f071ca9f 100644 --- a/core/executor/wasm/src/lib.rs +++ b/core/executor/wasm/src/lib.rs @@ -91,7 +91,13 @@ impl_stubs!( [sr25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec() }, test_enumerated_trie_root => |_| { - enumerated_trie_root::(&[&b"zero"[..], &b"one"[..], &b"two"[..]]).as_ref().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(); @@ -108,13 +114,15 @@ impl_stubs!( [ok as u8].to_vec() }, test_sandbox_return_val => |code: &[u8]| { - let result = execute_sandboxed( + let ok = match execute_sandboxed( code, &[ sandbox::TypedValue::I32(0x1336), ] - ); - let ok = if let Ok(sandbox::ReturnValue::Value(sandbox::TypedValue::I32(0x1337))) = result { true } else { false }; + ) { + Ok(sandbox::ReturnValue::Value(sandbox::TypedValue::I32(0x1337))) => true, + _ => false, + }; [ok as u8].to_vec() }, test_sandbox_instantiate => |code: &[u8]| { diff --git a/core/finality-grandpa/primitives/Cargo.toml b/core/finality-grandpa/primitives/Cargo.toml index e51ed754eb..6a36d74b01 100644 --- a/core/finality-grandpa/primitives/Cargo.toml +++ b/core/finality-grandpa/primitives/Cargo.toml @@ -10,6 +10,7 @@ substrate-primitives = { path = "../../primitives", default-features = false } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } sr-primitives = { path = "../../sr-primitives", default-features = false } rstd = { package = "sr-std", path = "../../sr-std", default-features = false } +serde = { version = "1.0", optional = true, features = ["derive"] } [features] default = ["std"] @@ -19,4 +20,5 @@ std = [ "parity-codec/std", "sr-primitives/std", "rstd/std", + "serde", ] diff --git a/core/finality-grandpa/primitives/src/lib.rs b/core/finality-grandpa/primitives/src/lib.rs index 869b5e68fd..aded32efa3 100644 --- a/core/finality-grandpa/primitives/src/lib.rs +++ b/core/finality-grandpa/primitives/src/lib.rs @@ -21,17 +21,32 @@ #[cfg(not(feature = "std"))] extern crate alloc; +#[cfg(feature = "std")] +use serde::Serialize; use parity_codec::{Encode, Decode}; -use substrate_primitives::ed25519; -use sr_primitives::traits::{DigestFor, NumberFor}; +use sr_primitives::{ConsensusEngineId, traits::{DigestFor, NumberFor}}; use client::decl_runtime_apis; use rstd::vec::Vec; -use ed25519::Public as AuthorityId; +/// The grandpa crypto scheme defined via the keypair type. +#[cfg(feature = "std")] +pub type AuthorityPair = substrate_primitives::ed25519::Pair; + +/// Identity of a Grandpa authority. +pub type AuthorityId = substrate_primitives::ed25519::Public; + +/// Signature for a Grandpa authority. +pub type AuthoritySignature = substrate_primitives::ed25519::Signature; + +/// The `ConsensusEngineId` of GRANDPA. +pub const GRANDPA_ENGINE_ID: ConsensusEngineId = *b"FRNK"; + +/// The weight of an authority. +pub type AuthorityWeight = u64; /// A scheduled change of authority set. -#[cfg_attr(feature = "std", derive(Debug, PartialEq))] -#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[derive(Clone, Eq, PartialEq, Encode, Decode)] pub struct ScheduledChange { /// The new authorities after the change, along with their respective weights. pub next_authorities: Vec<(AuthorityId, u64)>, @@ -44,14 +59,6 @@ pub const PENDING_CHANGE_CALL: &str = "grandpa_pending_change"; /// WASM function call to get current GRANDPA authorities. pub const AUTHORITIES_CALL: &str = "grandpa_authorities"; -/// Well-known storage keys for GRANDPA. -pub mod well_known_keys { - /// The key for the authorities and weights vector in storage. - pub const AUTHORITY_PREFIX: &[u8] = b":grandpa:auth:"; - /// The key for the authorities count. - pub const AUTHORITY_COUNT: &[u8] = b":grandpa:auth:len"; -} - decl_runtime_apis! { /// APIs for integrating the GRANDPA finality gadget into runtimes. /// This should be implemented on the runtime side. @@ -107,6 +114,6 @@ decl_runtime_apis! { /// When called at block B, it will return the set of authorities that should be /// used to finalize descendants of this block (B+1, B+2, ...). The block B itself /// is finalized by the authorities from block B-1. - fn grandpa_authorities() -> Vec<(AuthorityId, u64)>; + fn grandpa_authorities() -> Vec<(AuthorityId, AuthorityWeight)>; } } diff --git a/core/finality-grandpa/src/authorities.rs b/core/finality-grandpa/src/authorities.rs index 5379cfe4ef..8b329d4116 100644 --- a/core/finality-grandpa/src/authorities.rs +++ b/core/finality-grandpa/src/authorities.rs @@ -18,19 +18,17 @@ use fork_tree::ForkTree; use parking_lot::RwLock; -use substrate_primitives::ed25519; use grandpa::voter_set::VoterSet; use parity_codec::{Encode, Decode}; use log::{debug, info}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; +use fg_primitives::AuthorityId; use std::cmp::Ord; use std::fmt::Debug; use std::ops::Add; use std::sync::Arc; -use ed25519::Public as AuthorityId; - /// A shared authority set. pub(crate) struct SharedAuthoritySet { inner: Arc>>, @@ -522,8 +520,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId([1; 32]), 5)]; - let set_b = vec![(AuthorityId([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; + let set_b = vec![(AuthorityId::from_raw([2; 32]), 5)]; // two competing changes at the same height on different forks let change_a = PendingChange { @@ -587,8 +585,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId([1; 32]), 5)]; - let set_c = vec![(AuthorityId([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; + let set_c = vec![(AuthorityId::from_raw([2; 32]), 5)]; // two competing changes at the same height on different forks let change_a = PendingChange { @@ -653,7 +651,7 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId([1; 32]), 5)]; + let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; let change_a = PendingChange { next_authorities: set_a.clone(), @@ -719,8 +717,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId([1; 32]), 5)]; - let set_b = vec![(AuthorityId([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; + let set_b = vec![(AuthorityId::from_raw([2; 32]), 5)]; let change_a = PendingChange { next_authorities: set_a.clone(), diff --git a/core/finality-grandpa/src/aux_schema.rs b/core/finality-grandpa/src/aux_schema.rs index 824c65b9e6..f3939f4650 100644 --- a/core/finality-grandpa/src/aux_schema.rs +++ b/core/finality-grandpa/src/aux_schema.rs @@ -26,14 +26,13 @@ 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 fg_primitives::AuthorityId; use crate::authorities::{AuthoritySet, SharedAuthoritySet, PendingChange, DelayKind}; use crate::consensus_changes::{SharedConsensusChanges, ConsensusChanges}; use crate::environment::{CompletedRound, CompletedRounds, HasVoted, SharedVoterSetState, VoterSetState}; use crate::NewAuthoritySet; -use substrate_primitives::ed25519::Public as AuthorityId; - const VERSION_KEY: &[u8] = b"grandpa_schema_version"; const SET_STATE_KEY: &[u8] = b"grandpa_completed_round"; const AUTHORITY_SET_KEY: &[u8] = b"grandpa_voters"; diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index 58d9cd6421..0633fcec1f 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -37,7 +37,6 @@ use log::{debug, trace}; 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}; use network::{consensus_gossip as network_gossip, NetworkService}; use network_gossip::ConsensusMessage; @@ -55,8 +54,7 @@ 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']; +pub use fg_primitives::GRANDPA_ENGINE_ID; // cost scalars for reporting peers. mod cost { diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 690c1011a7..763301dc97 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -50,8 +50,7 @@ use crate::authorities::{AuthoritySet, SharedAuthoritySet}; use crate::consensus_changes::SharedConsensusChanges; use crate::justification::GrandpaJustification; use crate::until_imported::UntilVoteTargetImported; - -use ed25519::Public as AuthorityId; +use fg_primitives::AuthorityId; /// Data about a completed round. #[derive(Debug, Clone, Decode, Encode, PartialEq)] diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index 875a60e8e0..e9cc08c695 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -49,9 +49,9 @@ use runtime_primitives::{Justification, generic::BlockId}; use runtime_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, One, }; -use substrate_primitives::{ed25519, H256, Blake2Hasher}; -use ed25519::Public as AuthorityId; +use substrate_primitives::{H256, Blake2Hasher}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; +use fg_primitives::AuthorityId; use crate::justification::GrandpaJustification; diff --git a/core/finality-grandpa/src/justification.rs b/core/finality-grandpa/src/justification.rs index fc7f833c75..99aedbae05 100644 --- a/core/finality-grandpa/src/justification.rs +++ b/core/finality-grandpa/src/justification.rs @@ -25,13 +25,12 @@ use grandpa::voter_set::VoterSet; use grandpa::{Error as GrandpaError}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{NumberFor, Block as BlockT, Header as HeaderT}; -use substrate_primitives::{H256, ed25519, Blake2Hasher}; +use substrate_primitives::{H256, Blake2Hasher}; +use fg_primitives::AuthorityId; use crate::{Commit, Error}; use crate::communication; -use ed25519::Public as AuthorityId; - /// A GRANDPA justification for block finality, it includes a commit message and /// an ancestry proof including all headers routing all precommit target blocks /// to the commit target block. Due to the current voting strategy the precommit diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 7e3f19940b..02cdd2cfd1 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -82,8 +82,6 @@ use std::fmt; use std::sync::Arc; use std::time::Duration; -pub use fg_primitives::ScheduledChange; - mod authorities; mod aux_schema; mod communication; @@ -111,8 +109,10 @@ use import::GrandpaBlockImport; use until_imported::UntilCommitBlocksImported; use communication::NetworkBridge; use service::TelemetryOnConnect; +use fg_primitives::AuthoritySignature; -use ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; +// Re-export these two because it's just so damn convenient. +pub use fg_primitives::{AuthorityId, ScheduledChange}; #[cfg(test)] mod tests; diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs index c70f91d0f3..4fb93ae303 100644 --- a/core/finality-grandpa/src/light_import.rs +++ b/core/finality-grandpa/src/light_import.rs @@ -35,9 +35,9 @@ use runtime_primitives::Justification; use runtime_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, ProvideRuntimeApi, DigestFor, }; -use fg_primitives::GrandpaApi; +use fg_primitives::{GrandpaApi, AuthorityId}; use runtime_primitives::generic::BlockId; -use substrate_primitives::{H256, Blake2Hasher, ed25519::Public as AuthorityId}; +use substrate_primitives::{H256, Blake2Hasher}; use crate::aux_schema::load_decode; use crate::consensus_changes::ConsensusChanges; @@ -610,7 +610,7 @@ pub mod tests { let client = test_client::new_light(); let mut import_data = LightImportData { last_finalized: Default::default(), - authority_set: LightAuthoritySet::genesis(vec![(AuthorityId([1; 32]), 1)]), + authority_set: LightAuthoritySet::genesis(vec![(AuthorityId::from_raw([1; 32]), 1)]), consensus_changes: ConsensusChanges::empty(), }; let block = ImportBlock { @@ -661,7 +661,7 @@ pub mod tests { #[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()); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_raw([2; 32])].encode()); assert_eq!(import_block(cache, None), ImportResult::Imported(ImportedAux { clear_justification_requests: false, needs_justification: false, @@ -674,7 +674,7 @@ pub mod tests { 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()); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_raw([2; 32])].encode()); assert_eq!( import_block(cache, Some(justification)), ImportResult::Imported(ImportedAux { @@ -690,7 +690,7 @@ pub mod tests { #[test] fn aux_data_updated_on_start() { let aux_store = InMemoryAuxStore::::new(); - let api = Arc::new(TestApi::new(vec![(AuthorityId([1; 32]), 1)])); + let api = Arc::new(TestApi::new(vec![(AuthorityId::from_raw([1; 32]), 1)])); // when aux store is empty initially assert!(aux_store.get_aux(LIGHT_AUTHORITY_SET_KEY).unwrap().is_none()); @@ -705,7 +705,7 @@ pub mod tests { #[test] fn aux_data_loaded_on_restart() { let aux_store = InMemoryAuxStore::::new(); - let api = Arc::new(TestApi::new(vec![(AuthorityId([1; 32]), 1)])); + let api = Arc::new(TestApi::new(vec![(AuthorityId::from_raw([1; 32]), 1)])); // when aux store is non-empty initially let mut consensus_changes = ConsensusChanges::::empty(); @@ -714,7 +714,7 @@ pub mod tests { &[ ( LIGHT_AUTHORITY_SET_KEY, - LightAuthoritySet::genesis(vec![(AuthorityId([42; 32]), 2)]).encode().as_slice(), + LightAuthoritySet::genesis(vec![(AuthorityId::from_raw([42; 32]), 2)]).encode().as_slice(), ), ( LIGHT_CONSENSUS_CHANGES_KEY, @@ -726,7 +726,7 @@ pub mod tests { // 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.authority_set.authorities(), vec![(AuthorityId::from_raw([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 index 9ed1cc8c62..4738fd3ed6 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -27,7 +27,7 @@ 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 substrate_primitives::{H256, Blake2Hasher}; use crate::{ AuthoritySignature, global_communication, CommandOrError, Config, environment, @@ -37,6 +37,7 @@ use crate::authorities::SharedAuthoritySet; use crate::communication::NetworkBridge; use crate::consensus_changes::SharedConsensusChanges; use crate::environment::{CompletedRound, CompletedRounds, HasVoted}; +use fg_primitives::AuthorityId; struct ObserverChain<'a, Block: BlockT, B, E, RA>(&'a Client); diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 18342e3a1e..95ed722d3f 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -39,7 +39,8 @@ 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, ed25519::Public as AuthorityId}; +use substrate_primitives::{NativeOrEncoded, ExecutionContext}; +use fg_primitives::AuthorityId; use authorities::AuthoritySet; use finality_proof::{FinalityProofProvider, AuthoritySetForFinalityProver, AuthoritySetForFinalityChecker}; @@ -443,7 +444,7 @@ const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50); fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(substrate_primitives::ed25519::Public, u64)> { keys.iter() - .map(|key| AuthorityId(key.to_raw_public())) + .map(|key| AuthorityId::from_raw(key.to_raw_public())) .map(|id| (id, 1)) .collect() } diff --git a/core/finality-grandpa/src/until_imported.rs b/core/finality-grandpa/src/until_imported.rs index 2efb827d37..7c981050dd 100644 --- a/core/finality-grandpa/src/until_imported.rs +++ b/core/finality-grandpa/src/until_imported.rs @@ -28,12 +28,12 @@ use futures::prelude::*; use futures::stream::Fuse; use parking_lot::Mutex; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; -use substrate_primitives::ed25519::Public as AuthorityId; use tokio::timer::Interval; use std::collections::{HashMap, VecDeque}; use std::sync::{atomic::{AtomicUsize, Ordering}, Arc}; use std::time::{Duration, Instant}; +use fg_primitives::AuthorityId; const LOG_PENDING_INTERVAL: Duration = Duration::from_secs(15); diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 85fef9c3c7..832a9dda88 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -37,6 +37,7 @@ tokio-timer = "0.2.11" tokio = { version = "0.1.11", optional = true } unsigned-varint = { version = "0.2.1", features = ["codec"] } keyring = { package = "substrate-keyring", path = "../../core/keyring", optional = true } +test_client = { package = "substrate-test-client", path = "../../core/test-client", optional = true } test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client", optional = true } erased-serde = "0.3.9" void = "1.0" @@ -46,6 +47,7 @@ zeroize = "0.6.0" env_logger = { version = "0.6" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } +test_runtime = { package = "substrate-test-runtime", path = "../../core/test-runtime" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common", features = ["test-helpers"] } tempdir = "0.3" tokio = "0.1.11" diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 1f41c43e07..216944acc2 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -37,17 +37,17 @@ use consensus::import_queue::{ Link, SharedBlockImport, SharedJustificationImport, Verifier, SharedFinalityProofImport, SharedFinalityProofRequestBuilder, }; -use consensus::{Error as ConsensusError}; +use consensus::{Error as ConsensusError, well_known_cache_keys::{self, Id as CacheKeyId}}; use consensus::{BlockOrigin, ForkChoiceStrategy, ImportBlock, JustificationImport}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient, TopicNotification}; use futures::{prelude::*, sync::{mpsc, oneshot}}; use crate::message::Message; use libp2p::PeerId; use parking_lot::{Mutex, RwLock}; -use primitives::{H256, sr25519::Public as AuthorityId, Blake2Hasher}; +use primitives::{H256, Blake2Hasher}; use crate::protocol::{Context, Protocol, ProtocolConfig, ProtocolStatus, CustomMessageOutcome, NetworkOut}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{AuthorityIdFor, Block as BlockT, Digest, DigestItem, Header, NumberFor}; +use runtime_primitives::generic::{BlockId, OpaqueDigestItemId}; +use runtime_primitives::traits::{Block as BlockT, Header, NumberFor}; use runtime_primitives::{Justification, ConsensusEngineId}; use crate::service::{NetworkLink, NetworkMsg, ProtocolMsg, TransactionPool}; use crate::specialization::NetworkSpecialization; @@ -56,6 +56,8 @@ use test_client::{self, AccountKeyring}; pub use test_client::runtime::{Block, Extrinsic, Hash, Transfer}; pub use test_client::TestClient; +type AuthorityId = primitives::sr25519::Public; + #[cfg(any(test, feature = "test-helpers"))] /// A Verifier that accepts all blocks and passes them on with the configured /// finality to be imported. @@ -70,9 +72,12 @@ impl Verifier for PassThroughVerifier { header: B::Header, justification: Option, body: Option> - ) -> Result<(ImportBlock, Option>>), String> { - let new_authorities = header.digest().log(DigestItem::as_authorities_change) - .map(|auth| auth.iter().cloned().collect()); + ) -> Result<(ImportBlock, Option)>>), String> { + let maybe_keys = header.digest() + .log(|l| l.try_as_raw(OpaqueDigestItemId::Consensus(b"aura")) + .or_else(|| l.try_as_raw(OpaqueDigestItemId::Consensus(b"babe"))) + ) + .map(|blob| vec![(well_known_cache_keys::AUTHORITIES, blob.to_vec())]); Ok((ImportBlock { origin, @@ -83,7 +88,7 @@ impl Verifier for PassThroughVerifier { post_digests: vec![], auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, - }, new_authorities)) + }, maybe_keys)) } } diff --git a/core/primitives/benches/benches.rs b/core/primitives/benches/benches.rs index 4a003257e2..4a0e08978f 100644 --- a/core/primitives/benches/benches.rs +++ b/core/primitives/benches/benches.rs @@ -71,7 +71,7 @@ fn bench_ed25519(c: &mut Criterion) { let msg = (0..msg_size) .map(|_| rand::random::()) .collect::>(); - let key = substrate_primitives::ed25519::Pair::generate(); + let key = substrate_primitives::ed25519::Pair::generate().0; b.iter(|| key.sign(&msg)) }, vec![32, 1024, 1024 * 1024]); @@ -79,7 +79,7 @@ fn bench_ed25519(c: &mut Criterion) { let msg = (0..msg_size) .map(|_| rand::random::()) .collect::>(); - let key = substrate_primitives::ed25519::Pair::generate(); + let key = substrate_primitives::ed25519::Pair::generate().0; let sig = key.sign(&msg); let public = key.public(); b.iter(|| substrate_primitives::ed25519::Pair::verify(&sig, &msg, &public)) diff --git a/core/primitives/src/storage.rs b/core/primitives/src/storage.rs index bf3c19573d..8fdb7bdcc4 100644 --- a/core/primitives/src/storage.rs +++ b/core/primitives/src/storage.rs @@ -58,18 +58,6 @@ pub mod well_known_keys { /// The type of this value is encoded `u64`. pub const HEAP_PAGES: &'static [u8] = b":heappages"; - /// Number of authorities. - /// - /// The type of this value is encoded `u32`. Required by substrate. - pub const AUTHORITY_COUNT: &'static [u8] = b":auth:len"; - - /// Prefix under which authorities are storied. - /// - /// The full key for N-th authority is generated as: - /// - /// `(n as u32).to_keyed_vec(AUTHORITY_PREFIX)`. - pub const AUTHORITY_PREFIX: &'static [u8] = b":auth:"; - /// Current extrinsic index (u32) is stored under this key. pub const EXTRINSIC_INDEX: &'static [u8] = b":extrinsic_index"; diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 498b58b40b..1c8f1ef9d8 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -254,9 +254,14 @@ fn should_return_runtime_version() { let client = Arc::new(test_client::new()); let api = State::new(client.clone(), Subscriptions::new(core.executor())); + let result = "{\"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]]}"; 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],["0xcbca25e39f142387",1],["0xf78b278be53f454c",1],["0x7801759919ee83e5",1]]}"# + result, ); } @@ -281,4 +286,3 @@ 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/service/src/lib.rs b/core/service/src/lib.rs index d1e0067a62..1a3c00e4e7 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -629,12 +629,12 @@ impl network::TransactionPool, ComponentBlock< /// # use client::{self, LongestChain}; /// # use primitives::{Pair as PairT, ed25519}; /// # use consensus_common::import_queue::{BasicQueue, Verifier}; -/// # use consensus_common::{BlockOrigin, ImportBlock}; +/// # use consensus_common::{BlockOrigin, ImportBlock, well_known_cache_keys::Id as CacheKeyId}; /// # 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 runtime_primitives::traits::Block as BlockT; /// # use grandpa; /// # construct_simple_protocol! { /// # pub struct NodeProtocol where Block = Block { } @@ -647,7 +647,7 @@ impl network::TransactionPool, ComponentBlock< /// # header: B::Header, /// # justification: Option, /// # body: Option>, -/// # ) -> Result<(ImportBlock, Option>>), String> { +/// # ) -> Result<(ImportBlock, Option)>>), String> { /// # unimplemented!(); /// # } /// # } diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 0ba833bd9f..34bfc22b9d 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -216,9 +216,12 @@ impl CryptoApi for () { } 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 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) diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 84e717ffae..b1dc10d1b8 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -232,7 +232,13 @@ pub mod ext { /// - `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; + 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. @@ -241,26 +247,44 @@ pub mod ext { /// /// - `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, result: *mut u8) -> u32; + fn ext_storage_changes_root( + parent_hash_data: *const u8, parent_hash_len: u32, 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); + 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); + 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; + 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. @@ -300,13 +324,22 @@ pub mod ext { /// # 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; + 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); + 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 @@ -320,11 +353,25 @@ pub mod ext { /// 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; + 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; + 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; + fn ext_secp256k1_ecdsa_recover( + msg_data: *const u8, + sig_data: *const u8, + pubkey_data: *mut u8 + ) -> u32; //================================ // Offchain-worker Context diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index c0724bb134..5edb370e50 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -22,191 +22,87 @@ use serde::Serialize; use rstd::prelude::*; use crate::ConsensusEngineId; -use crate::codec::{Decode, Encode, Codec, Input}; -use crate::traits::{self, Member, DigestItem as DigestItemT, MaybeHash}; +use crate::codec::{Decode, Encode, Input}; /// Generic header digest. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub struct Digest { +pub struct Digest { /// A list of logs in the digest. - pub logs: Vec, + pub logs: Vec>, } -impl Default for Digest { +impl Default for Digest { fn default() -> Self { Digest { logs: Vec::new(), } } } -impl traits::Digest for Digest where - Item: DigestItemT + Codec -{ - type Hash = Item::Hash; - type Item = Item; - - fn logs(&self) -> &[Self::Item] { +impl Digest { + /// Get reference to all digest items. + pub fn logs(&self) -> &[DigestItem] { &self.logs } - fn push(&mut self, item: Self::Item) { + /// Push new digest item. + pub fn push(&mut self, item: DigestItem) { self.logs.push(item); } - fn pop(&mut self) -> Option { + /// Pop a digest item. + pub fn pop(&mut self) -> Option> { self.logs.pop() } -} -// Macro black magic. -macro_rules! gen_digest_type { - ( - $( #[doc = $main_docs:tt] )* - pub enum $main:ident $(<$($main_params: tt),+>)? { } - $( - $( #[doc = $doc_attr:tt] )* - pub enum $n:ident $(<$($t: tt),+>)? { - $( - $( #[doc = $variant_doc:tt] )* - $variant:ident(($($interior: ty),*), $q: tt), - )* - } - )+ - ) => { - $( #[doc = $main_docs] )* - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Debug))] - pub enum $main $(<$($main_params),+>)? { - $( - $( - $( #[doc = $variant_doc] )* - $variant($($interior),*), - )* - )* - } - - gen_digest_type! { - @internal - $main : $main $(<$($main_params),+>)? => $( - $( #[doc = $doc_attr] )* - pub enum $n $(<$($t),+>)? { - $( - $( #[doc = $variant_doc] )* - $variant(($($interior),*), $q), - )* - } - )+ - } - }; - ( - @internal - $main_id:tt : $main:ty => $( - $( #[doc = $doc_attr:tt] )* - pub enum $n:ident $(<$($t: tt),+>)? { - $( - $( #[doc = $variant_doc:tt] )* - $variant:ident(($($interior: ty),*), $q: tt), - )* - } - )+ - ) => { - $( - $( #[doc = $doc_attr] )* - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Debug))] - pub enum $n $(<$($t),+>)? { - $( - $( #[doc = $variant_doc] )* - $variant($($interior),*), - )* - } + /// Get reference to the first digest item that matches the passed predicate. + pub fn log) -> Option<&T>>(&self, predicate: F) -> Option<&T> { + self.logs().iter() + .filter_map(predicate) + .next() + } - impl From<$n $(<$($t),*>)?> - for $main { - fn from(digest: $n $(<$($t),+>)?) -> Self { - match digest { - $( - $n::$variant $q => $main_id::$variant $q, - )* - } - } - } - )* - }; + /// Get a conversion of the first digest item that successfully converts using the function. + pub fn convert_first) -> Option>(&self, predicate: F) -> Option { + self.logs().iter() + .filter_map(predicate) + .next() + } } -gen_digest_type! { - /// Digest item that is able to encode/decode 'system' digest items and - /// provide opaque access to other items. + +/// Digest item that is able to encode/decode 'system' digest items and +/// provide opaque access to other items. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum DigestItem { + /// System digest item that contains the root of changes trie at given + /// block. It is created for every block iff runtime supports changes + /// trie creation. + ChangesTrieRoot(Hash), + + /// A pre-runtime digest. /// - /// For all variants that include a `ConsensusEngineId`, consensus engine - /// implementations **MUST** ignore digests that have a `ConsensusEngineId` - /// that is not theirs. Node implementations **MUST** reject digests that - /// have a `ConsensusEngineId` that corresponds to a consensus engine not in - /// use. Node implementations **MUST** reject blocks as malformed if they - /// reject any of the block’s digest. If the runtime supports this, the - /// node that issued the block **SHOULD** be reported as having committed - /// severe misbehavior and punished accordingly. The invalid block, or its - /// hash, **SHOULD** constitute adequate proof of such misbehavior. - pub enum DigestItem {} - - /// A digest item that can be produced by consensus engines. Consensus - /// engine implementations **MUST NOT** push digests not in this variant. - /// This **SHOULD** be detected at compile time. If it is not, the behavior - /// of the blockchain is undefined. - pub enum ConsensusDigest { - /// Put a Seal on it. This **MUST** come after all other `DigestItem` - /// variants. There **MUST** be exactly one `Seal` per consensus engine, - /// and its `ConsensusEngineId` **MUST** be that of the consensus engine - /// that produced it. Runtimes will not see this variant. - Seal((ConsensusEngineId, SealSignature), (a, b)), - /// An inherent digest. - /// - /// These are messages from the consensus engine to the runtime, - /// although the consensus engine can (and should) read them itself to - /// avoid code and state duplication. It is erroneous for a runtime to - /// produce these, but this is checked at compile time. Runtimes can - /// (and should) trust these, as with any other inherent. Consensus - /// engines MUST verify them. - PreRuntime((ConsensusEngineId, Vec), (a, b)), - } + /// These are messages from the consensus engine to the runtime, although + /// the consensus engine can (and should) read them itself to avoid + /// code and state duplication. It is erroneous for a runtime to produce + /// these, but this is not (yet) checked. + PreRuntime(ConsensusEngineId, Vec), - /// A digest item that can be produced by runtimes. Runtime mplementations - /// **MUST NOT** push digests not in this variant. This **SHOULD** be - /// detected at compile time. If it is not, the behavior of the blockchain - /// is undefined. - pub enum RuntimeDigest { - /// A message from the runtime to the consensus engine. This MUST NOT be - /// generated by the native code of any consensus engine, but this is - /// caught at compile time. The `ConsensusEngineId` is that of the - /// consensus engine for which this digest is intended. Consensus - /// engines MUST ignore digests with `ConsensusEngineId`s other than - /// their own. - Consensus((ConsensusEngineId, Vec), (a, b)), - /// Any 'non-system' digest item, opaque to the native code. Runtimes - /// MUST verify these, and reject any they did not produce. These MUST - /// NOT be produced by native code. - Other((Vec), (a)), - } + /// A message from the runtime to the consensus engine. This should *never* + /// be generated by the native code of any consensus engine, but this is not + /// checked (yet). + Consensus(ConsensusEngineId, Vec), - /// A digest item that is reserved for the SRML. Only the SRML is allowed to - /// push these digests. Consensus engines and third-party runtime code - /// **MUST NOT** push digests in this variant. This **SHOULD** be detected - /// at compile time. If it is not, the behavior of the blockchain is - /// undefined. - pub enum SystemDigest { - /// System digest item announcing that authorities set has been changed - /// in the block. Contains the new set of authorities. - AuthoritiesChange((Vec), (a)), - /// System digest item that contains the root of changes trie at given - /// block. It is created for every block iff runtime supports changes - /// trie creation. - ChangesTrieRoot((Hash), (a)), - } + /// Put a Seal on it. This is only used by native code, and is never seen + /// by runtimes. + Seal(ConsensusEngineId, Vec), + + /// Some other thing. Unsupported and experimental. + Other(Vec), } #[cfg(feature = "std")] -impl ::serde::Serialize for DigestItem { +impl ::serde::Serialize for DigestItem { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { self.using_encoded(|bytes| { ::substrate_primitives::bytes::serialize(bytes, seq) @@ -214,23 +110,13 @@ impl ::serde::Serializ } } - /// A 'referencing view' for digest item. Does not own its contents. Used by /// final runtime implementations for encoding/decoding its log items. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -pub enum DigestItemRef<'a, Hash: 'a, AuthorityId: 'a, SealSignature: 'a> { - /// Reference to `DigestItem::AuthoritiesChange`. - AuthoritiesChange(&'a [AuthorityId]), +pub enum DigestItemRef<'a, Hash: 'a> { /// Reference to `DigestItem::ChangesTrieRoot`. ChangesTrieRoot(&'a Hash), - /// A message from the runtime to the consensus engine. This should *never* - /// be generated by the native code of any consensus engine, but this is not - /// checked (yet). - Consensus(&'a ConsensusEngineId, &'a Vec), - /// Put a Seal on it. This is only used by native code, and is never seen - /// by runtimes. - Seal(&'a ConsensusEngineId, &'a SealSignature), /// A pre-runtime digest. /// /// These are messages from the consensus engine to the runtime, although @@ -238,6 +124,13 @@ pub enum DigestItemRef<'a, Hash: 'a, AuthorityId: 'a, SealSignature: 'a> { /// code and state duplication. It is erroneous for a runtime to produce /// these, but this is not (yet) checked. PreRuntime(&'a ConsensusEngineId, &'a Vec), + /// A message from the runtime to the consensus engine. This should *never* + /// be generated by the native code of any consensus engine, but this is not + /// checked (yet). + Consensus(&'a ConsensusEngineId, &'a Vec), + /// Put a Seal on it. This is only used by native code, and is never seen + /// by runtimes. + Seal(&'a ConsensusEngineId, &'a Vec), /// Any 'non-system' digest item, opaque to the native code. Other(&'a Vec), } @@ -248,86 +141,105 @@ pub enum DigestItemRef<'a, Hash: 'a, AuthorityId: 'a, SealSignature: 'a> { /// trait for `DigestItemRef`. #[repr(u32)] #[derive(Encode, Decode)] -enum DigestItemType { - Other = 0, - AuthoritiesChange = 1, +pub enum DigestItemType { ChangesTrieRoot = 2, + PreRuntime = 6, Consensus = 4, Seal = 5, - PreRuntime = 6, + Other = 0, } -impl DigestItem { - /// Returns Some if `self` is a `DigestItem::Other`. - pub fn as_other(&self) -> Option<&Vec> { - match *self { - DigestItem::Other(ref v) => Some(v), - _ => None, - } - } +/// Type of a digest item that contains raw data; this also names the consensus engine ID where +/// applicable. Used to identify one or more digest items of interest. +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] +pub enum OpaqueDigestItemId<'a> { + /// Type corresponding to DigestItem::PreRuntime. + PreRuntime(&'a ConsensusEngineId), + /// Type corresponding to DigestItem::Consensus. + Consensus(&'a ConsensusEngineId), + /// Type corresponding to DigestItem::Seal. + Seal(&'a ConsensusEngineId), + /// Some other (non-prescribed) type. + Other, +} +impl DigestItem { /// Returns a 'referencing view' for this digest item. - fn dref<'a>(&'a self) -> DigestItemRef<'a, Hash, AuthorityId, SealSignature> { + pub fn dref<'a>(&'a self) -> DigestItemRef<'a, Hash> { match *self { - DigestItem::AuthoritiesChange(ref v) => DigestItemRef::AuthoritiesChange(v), DigestItem::ChangesTrieRoot(ref v) => DigestItemRef::ChangesTrieRoot(v), + DigestItem::PreRuntime(ref v, ref s) => DigestItemRef::PreRuntime(v, s), DigestItem::Consensus(ref v, ref s) => DigestItemRef::Consensus(v, s), DigestItem::Seal(ref v, ref s) => DigestItemRef::Seal(v, s), - DigestItem::PreRuntime(ref v, ref s) => DigestItemRef::PreRuntime(v, s), DigestItem::Other(ref v) => DigestItemRef::Other(v), } } -} -impl< - Hash: Codec + Member, - AuthorityId: Codec + Member + MaybeHash, - SealSignature: Codec + Member, -> traits::DigestItem for DigestItem { - type Hash = Hash; - type AuthorityId = AuthorityId; + /// Returns `Some` if the entry is the `ChangesTrieRoot` entry. + pub fn as_changes_trie_root(&self) -> Option<&Hash> { + self.dref().as_changes_trie_root() + } - fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]> { - self.dref().as_authorities_change() + /// Returns `Some` if this entry is the `PreRuntime` entry. + pub fn as_pre_runtime(&self) -> Option<(ConsensusEngineId, &[u8])> { + self.dref().as_pre_runtime() } - fn as_changes_trie_root(&self) -> Option<&Self::Hash> { - self.dref().as_changes_trie_root() + /// Returns `Some` if this entry is the `Consensus` entry. + pub fn as_consensus(&self) -> Option<(ConsensusEngineId, &[u8])> { + self.dref().as_consensus() } - fn as_pre_runtime(&self) -> Option<(ConsensusEngineId, &[u8])> { - self.dref().as_pre_runtime() + /// Returns `Some` if this entry is the `Seal` entry. + pub fn as_seal(&self) -> Option<(ConsensusEngineId, &[u8])> { + self.dref().as_seal() + } + + /// Returns Some if `self` is a `DigestItem::Other`. + pub fn as_other(&self) -> Option<&[u8]> { + match *self { + DigestItem::Other(ref v) => Some(&v[..]), + _ => None, + } + } + + /// Returns the opaque data contained in the item if `Some` if this entry has the id given. + pub fn try_as_raw(&self, id: OpaqueDigestItemId) -> Option<&[u8]> { + self.dref().try_as_raw(id) + } + + /// Returns the data contained in the item if `Some` if this entry has the id given, decoded + /// to the type provided `T`. + pub fn try_to(&self, id: OpaqueDigestItemId) -> Option { + self.dref().try_to::(id) } } -impl Encode for DigestItem { +impl Encode for DigestItem { fn encode(&self) -> Vec { self.dref().encode() } } -impl Decode for DigestItem { +impl Decode for DigestItem { #[allow(deprecated)] fn decode(input: &mut I) -> Option { let item_type: DigestItemType = Decode::decode(input)?; match item_type { - DigestItemType::AuthoritiesChange => Some(DigestItem::AuthoritiesChange( - Decode::decode(input)?, - )), DigestItemType::ChangesTrieRoot => Some(DigestItem::ChangesTrieRoot( Decode::decode(input)?, )), + DigestItemType::PreRuntime => { + let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; + Some(DigestItem::PreRuntime(vals.0, vals.1)) + }, DigestItemType::Consensus => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; Some(DigestItem::Consensus(vals.0, vals.1)) } DigestItemType::Seal => { - let vals: (ConsensusEngineId, SealSignature) = Decode::decode(input)?; - Some(DigestItem::Seal(vals.0, vals.1)) - }, - DigestItemType::PreRuntime => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; - Some(DigestItem::PreRuntime(vals.0, vals.1)) + Some(DigestItem::Seal(vals.0, vals.1)) }, DigestItemType::Other => Some(DigestItem::Other( Decode::decode(input)?, @@ -336,15 +248,7 @@ impl Decode for Digest } } -impl<'a, Hash: Codec + Member, AuthorityId: Codec + Member, SealSignature: Codec + Member> DigestItemRef<'a, Hash, AuthorityId, SealSignature> { - /// Cast this digest item into `AuthoritiesChange`. - pub fn as_authorities_change(&self) -> Option<&'a [AuthorityId]> { - match *self { - DigestItemRef::AuthoritiesChange(ref authorities) => Some(authorities), - _ => None, - } - } - +impl<'a, Hash> DigestItemRef<'a, Hash> { /// Cast this digest item into `ChangesTrieRoot`. pub fn as_changes_trie_root(&self) -> Option<&'a Hash> { match *self { @@ -360,17 +264,56 @@ impl<'a, Hash: Codec + Member, AuthorityId: Codec + Member, SealSignature: Codec _ => None, } } + + /// Cast this digest item into `Consensus` + pub fn as_consensus(&self) -> Option<(ConsensusEngineId, &'a [u8])> { + match *self { + DigestItemRef::Consensus(consensus_engine_id, ref data) => Some((*consensus_engine_id, data)), + _ => None, + } + } + + /// Cast this digest item into `Seal` + pub fn as_seal(&self) -> Option<(ConsensusEngineId, &'a [u8])> { + match *self { + DigestItemRef::Seal(consensus_engine_id, ref data) => Some((*consensus_engine_id, data)), + _ => None, + } + } + + /// Cast this digest item into `PreRuntime` + pub fn as_other(&self) -> Option<&'a [u8]> { + match *self { + DigestItemRef::Other(ref data) => Some(data), + _ => None, + } + } + + /// Try to match this digest item to the given opaque item identifier; if it matches, then + /// return the opaque data it contains. + pub fn try_as_raw(&self, id: OpaqueDigestItemId) -> Option<&'a [u8]> { + match (id, self) { + (OpaqueDigestItemId::Consensus(w), &DigestItemRef::Consensus(v, s)) | + (OpaqueDigestItemId::Seal(w), &DigestItemRef::Seal(v, s)) | + (OpaqueDigestItemId::PreRuntime(w), &DigestItemRef::PreRuntime(v, s)) + if v == w => Some(&s[..]), + (OpaqueDigestItemId::Other, &DigestItemRef::Other(s)) => Some(&s[..]), + _ => None, + } + } + + /// Try to match this digest item to the given opaque item identifier; if it matches, then + /// try to cast to the given datatype; if that works, return it. + pub fn try_to(&self, id: OpaqueDigestItemId) -> Option { + self.try_as_raw(id).and_then(|mut x| Decode::decode(&mut x)) + } } -impl<'a, Hash: Encode, AuthorityId: Encode, SealSignature: Encode> Encode for DigestItemRef<'a, Hash, AuthorityId, SealSignature> { +impl<'a, Hash: Encode> Encode for DigestItemRef<'a, Hash> { fn encode(&self) -> Vec { let mut v = Vec::new(); match *self { - DigestItemRef::AuthoritiesChange(authorities) => { - DigestItemType::AuthoritiesChange.encode_to(&mut v); - authorities.encode_to(&mut v); - }, DigestItemRef::ChangesTrieRoot(changes_trie_root) => { DigestItemType::ChangesTrieRoot.encode_to(&mut v); changes_trie_root.encode_to(&mut v); @@ -400,22 +343,20 @@ impl<'a, Hash: Encode, AuthorityId: Encode, SealSignature: Encode> Encode for Di #[cfg(test)] mod tests { use super::*; - use substrate_primitives::hash::H512 as Signature; #[test] fn should_serialize_digest() { let digest = Digest { logs: vec![ - DigestItem::AuthoritiesChange(vec![1]), DigestItem::ChangesTrieRoot(4), DigestItem::Other(vec![1, 2, 3]), - DigestItem::Seal(Default::default(), Signature::default()) + DigestItem::Seal(*b"test", vec![1, 2, 3]) ], }; assert_eq!( ::serde_json::to_string(&digest).unwrap(), - "{\"logs\":[\"0x010401000000\",\"0x0204000000\",\"0x000c010203\",\"0x050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"]}", + r#"{"logs":["0x0204000000","0x000c010203","0x05746573740c010203"]}"# ); } } diff --git a/core/sr-primitives/src/generic/header.rs b/core/sr-primitives/src/generic/header.rs index fa94d97c64..887aedc818 100644 --- a/core/sr-primitives/src/generic/header.rs +++ b/core/sr-primitives/src/generic/header.rs @@ -21,9 +21,10 @@ use serde::Serialize; #[cfg(feature = "std")] use log::debug; 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}; +use crate::traits::{ + self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, Hash as HashT, MaybeSerializeDebug, + MaybeSerializeDebugButNotDeserialize +}; use crate::generic::Digest; /// Abstraction over a block header for a substrate chain. @@ -31,7 +32,7 @@ use crate::generic::Digest; #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header, Hash: HashT, DigestItem> { +pub struct Header, Hash: HashT> { /// The parent hash. pub parent_hash: ::Output, /// The block number. @@ -42,7 +43,7 @@ pub struct Header, Hash: HashT, DigestItem> { /// The merkle root of the extrinsics. pub extrinsics_root: ::Output, /// A chain-specific digest of data useful for light clients or referencing auxiliary data. - pub digest: Digest, + pub digest: Digest<::Output>, } #[cfg(feature = "std")] @@ -54,11 +55,10 @@ pub fn serialize_number>(val: &T, s: S) -> Result Decode for Header where +impl Decode for Header where Number: HasCompact + Copy + Into, Hash: HashT, Hash::Output: Decode, - DigestItem: DigestItemT + Decode, { fn decode(input: &mut I) -> Option { Some(Header { @@ -71,11 +71,10 @@ impl Decode for Header where } } -impl Encode for Header where +impl Encode for Header where Number: HasCompact + Copy + Into, Hash: HashT, Hash::Output: Encode, - DigestItem: DigestItemT + Encode, { fn encode_to(&self, dest: &mut T) { dest.push(&self.parent_hash); @@ -86,16 +85,14 @@ impl Encode for Header where } } -impl traits::Header for Header where +impl traits::Header for Header where Number: Member + MaybeSerializeDebug + ::rstd::hash::Hash + MaybeDisplay + SimpleArithmetic + Codec + Copy + Into, Hash: HashT, - DigestItem: DigestItemT + Codec, Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeSerializeDebugButNotDeserialize + MaybeDisplay + SimpleBitOps + Codec, { type Number = Number; type Hash = ::Output; type Hashing = Hash; - type Digest = Digest; fn number(&self) -> &Self::Number { &self.number } fn set_number(&mut self, num: Self::Number) { self.number = num } @@ -109,23 +106,23 @@ impl traits::Header for Header &Self::Hash { &self.parent_hash } fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } - fn digest(&self) -> &Self::Digest { &self.digest } + fn digest(&self) -> &Digest { &self.digest } #[cfg(feature = "std")] - fn digest_mut(&mut self) -> &mut Self::Digest { + fn digest_mut(&mut self) -> &mut Digest { debug!(target: "header", "Retrieving mutable reference to digest"); &mut self.digest } #[cfg(not(feature = "std"))] - fn digest_mut(&mut self) -> &mut Self::Digest { &mut self.digest } + fn digest_mut(&mut self) -> &mut Digest { &mut self.digest } fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, - digest: Self::Digest, + digest: Digest, ) -> Self { Header { number, @@ -137,10 +134,9 @@ impl traits::Header for Header Header where +impl Header where Number: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec + Into, Hash: HashT, - DigestItem: DigestItemT + Codec, Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, { /// Convenience helper for computing the hash of the header without having diff --git a/core/sr-primitives/src/generic/mod.rs b/core/sr-primitives/src/generic/mod.rs index d9c53c5fd4..a4e4106780 100644 --- a/core/sr-primitives/src/generic/mod.rs +++ b/core/sr-primitives/src/generic/mod.rs @@ -37,7 +37,7 @@ pub use self::checked_extrinsic::CheckedExtrinsic; pub use self::header::Header; pub use self::block::{Block, SignedBlock, BlockId}; pub use self::digest::{ - Digest, DigestItem, DigestItemRef, ConsensusDigest, RuntimeDigest, SystemDigest, + Digest, DigestItem, DigestItemRef, OpaqueDigestItemId }; use crate::codec::Encode; diff --git a/core/sr-primitives/src/generic/tests.rs b/core/sr-primitives/src/generic/tests.rs index b42c05ea4c..fe2ec2fe56 100644 --- a/core/sr-primitives/src/generic/tests.rs +++ b/core/sr-primitives/src/generic/tests.rs @@ -17,31 +17,34 @@ //! Tests for the generic implementations of Extrinsic/Header/Block. use crate::codec::{Decode, Encode}; -use substrate_primitives::{H256, H512}; +use substrate_primitives::H256; use super::DigestItem; #[test] fn system_digest_item_encoding() { - let item = DigestItem::AuthoritiesChange::(vec![10, 20, 30]); + let item = DigestItem::ChangesTrieRoot::(H256::default()); let encoded = item.encode(); assert_eq!(encoded, vec![ - // type = DigestItemType::AuthoritiesChange - 1, - // number of items in authorities set - 12, - // authorities - 10, 0, 0, 0, - 20, 0, 0, 0, - 30, 0, 0, 0, + // type = DigestItemType::ChangesTrieRoot + 2, + // trie root + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, ]); - let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); + let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); assert_eq!(item, decoded); } #[test] fn non_system_digest_item_encoding() { - let item = DigestItem::Other::(vec![10, 20, 30]); + let item = DigestItem::Other::(vec![10, 20, 30]); let encoded = item.encode(); assert_eq!(encoded, vec![ // type = DigestItemType::Other @@ -52,6 +55,6 @@ fn non_system_digest_item_encoding() { 10, 20, 30, ]); - let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); + let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); assert_eq!(item, decoded); } diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 56525991ae..80948798e0 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -45,6 +45,9 @@ use traits::{SaturatedConversion, UniqueSaturatedInto}; pub mod generic; pub mod transaction_validity; +/// Re-export these since they're only "kind of" generic. +pub use generic::{DigestItem, Digest}; + /// A message indicating an invalid signature in extrinsic. pub const BAD_SIGNATURE: &str = "bad signature in extrinsic"; @@ -614,216 +617,6 @@ macro_rules! impl_outer_config { } } -// NOTE [`PreRuntime` and `Consensus` are special] -// -// We MUST treat `PreRuntime` and `Consensus` variants specially, as they: -// -// * have more parameters (both in `generic::DigestItem` and in runtimes) -// * have a `PhantomData` parameter in the runtime, but not in `generic::DigestItem` - -#[macro_export] -#[doc(hidden)] -macro_rules! __parse_pattern_2 { - (PreRuntime $module:ident $internal:ident $v1:ident $v2:ident) => { - $internal::$module($module::RawLog::PreRuntime(ref $v1, ref $v2, $crate::rstd::marker::PhantomData)) - }; - (Consensus $module:ident $internal:ident $v1:ident $v2:ident) => { - $internal::$module($module::RawLog::Consensus(ref $v1, ref $v2, $crate::rstd::marker::PhantomData)) - }; - ($name:ident $module:ident $internal:ident $v1:ident $v2:ident) => { - $internal::$module($module::RawLog::$name(ref $v1)) - }; -} - -#[macro_export] -#[doc(hidden)] -macro_rules! __parse_pattern { - (PreRuntime $engine_id:pat, $binder:pat) => { - $crate::generic::DigestItem::PreRuntime($engine_id, $binder) - }; - (Consensus $engine_id:pat, $binder:pat) => { - $crate::generic::DigestItem::Consensus($engine_id, $binder) - }; - ($name:ident $engine_id:pat, $binder:pat) => { - $crate::generic::DigestItem::$name($binder) - }; -} - -#[macro_export] -#[doc(hidden)] -macro_rules! __parse_expr { - (PreRuntime $engine_id:expr, $module:ident $internal:ident $binder:expr) => { - $internal::$module($module::RawLog::PreRuntime($engine_id, $binder, Default::default())) - }; - (Consensus $engine_id:expr, $module:ident $internal:ident $binder:expr) => { - $internal::$module($module::RawLog::Consensus($engine_id, $binder, Default::default())) - }; - ($name:ident $engine_id:expr, $module:ident $internal:ident $binder:expr) => { - $internal::$module($module::RawLog::$name($binder)) - }; -} - -#[macro_export] -#[doc(hidden)] -macro_rules! __parse_expr_2 { - (PreRuntime $module:ident $internal:ident $v1:ident $v2:ident) => { - $crate::generic::DigestItemRef::PreRuntime($v1, $v2) - }; - (Consensus $module:ident $internal:ident $v1:ident $v2:ident) => { - $crate::generic::DigestItemRef::Consensus($v1, $v2) - }; - ($name:ident $module:ident $internal:ident $v1:ident $v2:ident) => { - $crate::generic::DigestItemRef::$name($v1) - }; -} - -/// Generates enum that contains all possible log entries for the runtime. -/// Every individual module of the runtime that is mentioned, must -/// expose a `Log` and `RawLog` enums. -/// -/// Generated enum is binary-compatible with and could be interpreted -/// as `generic::DigestItem`. -/// -/// Runtime requirements: -/// 1) binary representation of all supported 'system' log items should stay -/// the same. Otherwise, the native code will be unable to read log items -/// generated by previous runtime versions -/// 2) the support of 'system' log items should never be dropped by runtime. -/// Otherwise, native code will lost its ability to read items of this type -/// even if they were generated by the versions which have supported these -/// items. -#[macro_export] -macro_rules! impl_outer_log { - ( - $(#[$attr:meta])* - pub enum $name:ident ($internal:ident: DigestItem<$( $genarg:ty ),*>) for $trait:ident { - $( $module:ident $(<$instance:path>)? ( $( $sitem:tt ),* ) ),* - } - ) => { - /// 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::Serialize))] - $(#[$attr])* - #[allow(non_camel_case_types)] - pub struct $name($internal); - - /// 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::Serialize))] - $(#[$attr])* - #[allow(non_camel_case_types)] - pub enum InternalLog { - $( - $module($module::Log <$trait $(, $instance)?>), - )* - } - - impl $name { - /// Try to convert `$name` into `generic::DigestItemRef`. Returns Some when - /// `self` is a 'system' log && it has been marked as 'system' in macro call. - /// Otherwise, None is returned. - #[allow(unreachable_patterns)] - fn dref<'a>(&'a self) -> Option<$crate::generic::DigestItemRef<'a, $($genarg),*>> { - match self.0 { - $($( - $crate::__parse_pattern_2!($sitem $module $internal a b) => - Some($crate::__parse_expr_2!($sitem $module $internal a b)), - )*)* - _ => None, - } - } - } - - impl $crate::traits::DigestItem for $name { - type Hash = <$crate::generic::DigestItem<$($genarg),*> as $crate::traits::DigestItem>::Hash; - type AuthorityId = <$crate::generic::DigestItem<$($genarg),*> as $crate::traits::DigestItem>::AuthorityId; - - fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]> { - self.dref().and_then(|dref| dref.as_authorities_change()) - } - - fn as_changes_trie_root(&self) -> Option<&Self::Hash> { - self.dref().and_then(|dref| dref.as_changes_trie_root()) - } - - fn as_pre_runtime(&self) -> Option<($crate::ConsensusEngineId, &[u8])> { - self.dref().and_then(|dref| dref.as_pre_runtime()) - } - } - - impl From<$crate::generic::DigestItem<$($genarg),*>> for $name { - /// Converts `generic::DigestItem` into `$name`. If - /// `generic::DigestItem` represents a system item which is - /// supported by the runtime, it is returned. Otherwise we expect a - /// `Other`, `PreDigest`, or `Consensus` log item. Trying to convert - /// from anything else will lead to panic at runtime, since the - /// runtime does not supports this 'system' log item. - #[allow(unreachable_patterns)] - fn from(gen: $crate::generic::DigestItem<$($genarg),*>) -> Self { - match gen { - $($( - $crate::__parse_pattern!($sitem b, a) => - $name($crate::__parse_expr!($sitem b, $module $internal a)), - )*)* - _ => { - if let Some(s) = gen.as_other() - .and_then(|value| $crate::codec::Decode::decode(&mut &value[..])) - .map($name) - { - s - } else { - panic!("we only reach here if the runtime did not handle a digest; \ - runtimes are required to handle all digests they receive; qed" - ) - } - } - } - } - } - - impl $crate::codec::Decode for $name { - /// `generic::DigestItem` binary compatible decode. - fn decode(input: &mut I) -> Option { - let gen: $crate::generic::DigestItem<$($genarg),*> = - $crate::codec::Decode::decode(input)?; - Some($name::from(gen)) - } - } - - impl $crate::codec::Encode for $name { - /// `generic::DigestItem` binary compatible encode. - fn encode(&self) -> Vec { - match self.dref() { - Some(dref) => dref.encode(), - None => { - let gen: $crate::generic::DigestItem<$($genarg),*> = - $crate::generic::DigestItem::Other(self.0.encode()); - gen.encode() - }, - } - } - } - - $( - impl From<$module::Log<$trait $(, $instance)?>> for $name { - /// Converts single module log item into `$name`. - fn from(x: $module::Log<$trait $(, $instance)? >) -> Self { - $name(x.into()) - } - } - - impl From<$module::Log<$trait $(, $instance)?>> for InternalLog { - /// Converts single module log item into `$internal`. - fn from(x: $module::Log<$trait $(, $instance)?>) -> Self { - InternalLog::$module(x) - } - } - )* - }; -} - /// Simple blob to hold an extrinsic without committing to its format and ensure it is serialized /// correctly. #[derive(PartialEq, Eq, Clone, Default, Encode, Decode)] @@ -851,45 +644,7 @@ impl traits::Extrinsic for OpaqueExtrinsic { #[cfg(test)] mod tests { - use substrate_primitives::hash::{H256, H512}; use crate::codec::{Encode, Decode}; - use crate::traits::DigestItem; - - pub trait RuntimeT { - type AuthorityId; - } - - pub struct Runtime; - - impl RuntimeT for Runtime { - type AuthorityId = u64; - } - - mod a { - use super::RuntimeT; - use crate::codec::{Encode, Decode}; - use serde::Serialize; - pub type Log = RawLog<::AuthorityId>; - - #[derive(Serialize, Debug, Encode, Decode, PartialEq, Eq, Clone)] - pub enum RawLog { A1(AuthorityId), AuthoritiesChange(Vec), A3(AuthorityId) } - } - - mod b { - use super::RuntimeT; - use crate::codec::{Encode, Decode}; - use serde::Serialize; - pub type Log = RawLog<::AuthorityId>; - - #[derive(Serialize, Debug, Encode, Decode, PartialEq, Eq, Clone)] - pub enum RawLog { B1(AuthorityId), B2(AuthorityId) } - } - - impl_outer_log! { - pub enum Log(InternalLog: DigestItem) for Runtime { - a(AuthoritiesChange), b() - } - } macro_rules! per_thing_mul_upper_test { ($num_type:tt, $per:tt) => { @@ -909,41 +664,6 @@ mod tests { } } - #[test] - fn impl_outer_log_works() { - // encode/decode regular item - let b1: Log = b::RawLog::B1::(777).into(); - let encoded_b1 = b1.encode(); - let decoded_b1: Log = Decode::decode(&mut &encoded_b1[..]).unwrap(); - assert_eq!(b1, decoded_b1); - - // encode/decode system item - let auth_change: Log = a::RawLog::AuthoritiesChange::(vec![100, 200, 300]).into(); - let encoded_auth_change = auth_change.encode(); - let decoded_auth_change: Log = Decode::decode(&mut &encoded_auth_change[..]).unwrap(); - assert_eq!(auth_change, decoded_auth_change); - - // interpret regular item using `generic::DigestItem` - let generic_b1: super::generic::DigestItem = Decode::decode(&mut &encoded_b1[..]).unwrap(); - match generic_b1 { - super::generic::DigestItem::Other(_) => (), - _ => panic!("unexpected generic_b1: {:?}", generic_b1), - } - - // interpret system item using `generic::DigestItem` - let generic_auth_change: super::generic::DigestItem = Decode::decode(&mut &encoded_auth_change[..]).unwrap(); - match generic_auth_change { - super::generic::DigestItem::AuthoritiesChange::(authorities) => assert_eq!(authorities, vec![100, 200, 300]), - _ => panic!("unexpected generic_auth_change: {:?}", generic_auth_change), - } - - // check that as-style methods are working with system items - assert!(auth_change.as_authorities_change().is_some()); - - // check that as-style methods are not working with regular items - assert!(b1.as_authorities_change().is_none()); - } - #[test] fn opaque_extrinsic_serialization() { let ex = super::OpaqueExtrinsic(vec![1, 2, 3, 4]); diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index f9061d99dc..35f3ec476f 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -19,12 +19,12 @@ use serde::{Serialize, Serializer, Deserialize, de::Error as DeError, Deserializer}; use std::{fmt::Debug, ops::Deref, fmt}; use crate::codec::{Codec, Encode, Decode}; -use crate::traits::{self, Checkable, Applyable, BlakeTwo256, Convert}; +use crate::traits::{self, Checkable, Applyable, BlakeTwo256, OpaqueKeys}; +use crate::generic; use crate::weights::{Weighable, Weight}; -use crate::generic::DigestItem as GenDigestItem; pub use substrate_primitives::H256; use substrate_primitives::U256; -use substrate_primitives::sr25519::{Public as AuthorityId, Signature as AuthoritySignature}; +use substrate_primitives::ed25519::{Public as AuthorityId}; /// Authority Id #[derive(Default, PartialEq, Eq, Clone, Encode, Decode, Debug)] @@ -37,39 +37,19 @@ impl Into for UintAuthorityId { } } -/// Converter between u64 and the AuthorityId wrapper type. -pub struct ConvertUintAuthorityId; -impl Convert> for ConvertUintAuthorityId { - fn convert(a: u64) -> Option { - Some(UintAuthorityId(a)) - } +impl OpaqueKeys for UintAuthorityId { + fn count() -> usize { 1 } + // Unsafe, i know, but it's test code and it's just there because it's really convenient to + // keep `UintAuthorityId` as a u64 under the hood. + fn get_raw(&self, _: usize) -> &[u8] { unsafe { &std::mem::transmute::<_, &[u8; 8]>(&self.0)[..] } } + fn get(&self, _: usize) -> Option { self.0.using_encoded(|mut x| T::decode(&mut x)) } } + /// Digest item -pub type DigestItem = GenDigestItem; +pub type DigestItem = generic::DigestItem; /// Header Digest -#[derive(Default, PartialEq, Eq, Clone, Serialize, Debug, Encode, Decode)] -pub struct Digest { - /// Generated logs - pub logs: Vec, -} - -impl traits::Digest for Digest { - type Hash = H256; - type Item = DigestItem; - - fn logs(&self) -> &[Self::Item] { - &self.logs - } - - fn push(&mut self, item: Self::Item) { - self.logs.push(item); - } - - fn pop(&mut self) -> Option { - self.logs.pop() - } -} +pub type Digest = generic::Digest; /// Block Header #[derive(PartialEq, Eq, Clone, Serialize, Debug, Encode, Decode)] @@ -92,7 +72,6 @@ impl traits::Header for Header { type Number = u64; type Hashing = BlakeTwo256; type Hash = H256; - type Digest = Digest; fn number(&self) -> &Self::Number { &self.number } fn set_number(&mut self, num: Self::Number) { self.number = num } @@ -106,15 +85,15 @@ impl traits::Header for Header { fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } - fn digest(&self) -> &Self::Digest { &self.digest } - fn digest_mut(&mut self) -> &mut Self::Digest { &mut self.digest } + fn digest(&self) -> &Digest { &self.digest } + fn digest_mut(&mut self) -> &mut Digest { &mut self.digest } fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, - digest: Self::Digest, + digest: Digest, ) -> Self { Header { number, diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index f412ede0af..a34af862de 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -22,8 +22,9 @@ use runtime_io; #[cfg(feature = "std")] use std::fmt::{Debug, Display}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize, de::DeserializeOwned}; use substrate_primitives::{self, Hasher, Blake2Hasher}; -use crate::codec::{Codec, Encode, HasCompact}; +use crate::codec::{Codec, Encode, Decode, HasCompact}; use crate::transaction_validity::TransactionValidity; +use crate::generic::{Digest, DigestItem}; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{ Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, @@ -406,7 +407,8 @@ tuple_impl!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stupid bug in the Rust compiler believes derived // traits must be fulfilled by all type parameters. /// The hash type produced. - type Output: Member + MaybeSerializeDebug + rstd::hash::Hash + AsRef<[u8]> + AsMut<[u8]> + Copy + Default; + type Output: Member + MaybeSerializeDebug + rstd::hash::Hash + AsRef<[u8]> + AsMut<[u8]> + Copy + + Default + Encode + Decode; /// The associated hash_db Hasher type. type Hasher: Hasher; @@ -502,7 +504,7 @@ impl CheckEqual for substrate_primitives::H256 { } } -impl CheckEqual for I where I: DigestItem { +impl CheckEqual for super::generic::DigestItem where H: Encode { #[cfg(feature = "std")] fn check_equal(&self, other: &Self) { if self != other { @@ -609,8 +611,6 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebugButNotDe type Hash: Member + MaybeSerializeDebug + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; /// Hashing algorithm type Hashing: Hash; - /// Digest type - type Digest: Digest + Codec; /// Creates new header. fn new( @@ -618,7 +618,7 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebugButNotDe extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, - digest: Self::Digest + digest: Digest, ) -> Self; /// Returns a reference to the header number. @@ -642,9 +642,9 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebugButNotDe fn set_parent_hash(&mut self, hash: Self::Hash); /// Returns a reference to the digest. - fn digest(&self) -> &Self::Digest; + fn digest(&self) -> &Digest; /// Get a mutable reference to the digest. - fn digest_mut(&mut self) -> &mut Self::Digest; + fn digest_mut(&mut self) -> &mut Digest; /// Returns the hash of the header. fn hash(&self) -> Self::Hash { @@ -690,11 +690,9 @@ pub type HashFor = <::Header as Header>::Hashing; /// Extract the number type for a block. pub type NumberFor = <::Header as Header>::Number; /// Extract the digest type for a block. -pub type DigestFor = <::Header as Header>::Digest; +pub type DigestFor = Digest<<::Header as Header>::Hash>; /// Extract the digest item type for a block. -pub type DigestItemFor = as Digest>::Item; -/// Extract the authority ID type for a block. -pub type AuthorityIdFor = as DigestItem>::AuthorityId; +pub type DigestItemFor = DigestItem<<::Header as Header>::Hash>; /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. @@ -749,49 +747,6 @@ pub trait Applyable: Sized + Send + Sync { fn deconstruct(self) -> (Self::Call, Option); } -/// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are -/// each `Codec`. -pub trait Digest: Member + MaybeSerializeDebugButNotDeserialize + Default { - /// Hash of the items. - type Hash: Member; - /// Digest item type. - type Item: DigestItem; - - /// Get reference to all digest items. - fn logs(&self) -> &[Self::Item]; - /// Push new digest item. - fn push(&mut self, item: Self::Item); - /// Pop a digest item. - fn pop(&mut self) -> Option; - - /// Get reference to the first digest item that matches the passed predicate. - fn log Option<&T>>(&self, predicate: F) -> Option<&T> { - self.logs().iter() - .filter_map(predicate) - .next() - } -} - -/// Single digest item. Could be any type that implements `Member` and provides methods -/// for casting member to 'system' log items, known to substrate. -/// -/// If the runtime does not supports some 'system' items, use `()` as a stub. -pub trait DigestItem: Codec + Member + MaybeSerializeDebugButNotDeserialize { - /// `ChangesTrieRoot` payload. - type Hash: Member; - /// `AuthorityChange` payload. - type AuthorityId: Member + MaybeHash + crate::codec::Encode + crate::codec::Decode; - - /// Returns `Some` if the entry is the `AuthoritiesChange` entry. - fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]>; - - /// Returns `Some` if the entry is the `ChangesTrieRoot` entry. - fn as_changes_trie_root(&self) -> Option<&Self::Hash>; - - /// Returns `Some` if this entry is the `PreRuntime` entry. - fn as_pre_runtime(&self) -> Option<(super::ConsensusEngineId, &[u8])>; -} - /// Auxiliary wrapper that holds an api instance and binds it to the given lifetime. pub struct ApiRef<'a, T>(T, rstd::marker::PhantomData<&'a ()>); @@ -861,3 +816,75 @@ pub trait ValidateUnsigned { /// Changes made to storage should be discarded by caller. fn validate_unsigned(call: &Self::Call) -> TransactionValidity; } + +/// Opaque datatype that may be destructured into a series of raw byte slices (which represent +/// individual keys). +pub trait OpaqueKeys { + /// Return the number of encoded keys. + fn count() -> usize { 0 } + /// Get the raw bytes of key with index `i`. + fn get_raw(&self, i: usize) -> &[u8]; + /// Get the decoded key with index `i`. + fn get(&self, i: usize) -> Option { T::decode(&mut self.get_raw(i)) } + /// Verify a proof of ownership for the keys. + fn ownership_proof_is_valid(&self, _proof: &[u8]) -> bool { true } +} + +/// Calls a given macro a number of times with a set of fixed params and an incrementing numeral. +/// e.g. +/// ```nocompile +/// count!(println ("{}",) foo, bar, baz); +/// // Will result in three `println!`s: "0", "1" and "2". +/// ``` +#[macro_export] +macro_rules! count { + ($f:ident ($($x:tt)*) ) => (); + ($f:ident ($($x:tt)*) $x1:tt) => { $f!($($x)* 0); }; + ($f:ident ($($x:tt)*) $x1:tt, $x2:tt) => { $f!($($x)* 0); $f!($($x)* 1); }; + ($f:ident ($($x:tt)*) $x1:tt, $x2:tt, $x3:tt) => { $f!($($x)* 0); $f!($($x)* 1); $f!($($x)* 2); }; + ($f:ident ($($x:tt)*) $x1:tt, $x2:tt, $x3:tt, $x4:tt) => { + $f!($($x)* 0); $f!($($x)* 1); $f!($($x)* 2); $f!($($x)* 3); + }; + ($f:ident ($($x:tt)*) $x1:tt, $x2:tt, $x3:tt, $x4:tt, $x5:tt) => { + $f!($($x)* 0); $f!($($x)* 1); $f!($($x)* 2); $f!($($x)* 3); $f!($($x)* 4); + }; +} + +#[macro_export] +/// Just implement `OpaqueKeys` for a given tuple-struct. +/// Would be much nicer for this to be converted to `derive` code. +macro_rules! impl_opaque_keys { + ( + pub struct $name:ident ( $( $t:ty ),* $(,)* ); + ) => { + impl_opaque_keys! { + pub struct $name ( $( $t ,)* ); + impl OpaqueKeys for _ {} + } + }; + ( + pub struct $name:ident ( $( $t:ty ),* $(,)* ); + impl OpaqueKeys for _ { + $($rest:tt)* + } + ) => { + #[derive(Default, Clone, PartialEq, Eq, Encode, Decode)] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] + pub struct $name($( pub $t ,)*); + impl $crate::traits::OpaqueKeys for $name { + fn count() -> usize { + let mut c = 0; + $( let _: $t; c += 1; )* + c + } + fn get_raw(&self, i: usize) -> &[u8] { + $crate::count!(impl_opaque_keys (!! self i) $($t),*); + &[] + } + $($rest)* + } + }; + ( !! $self:ident $param_i:ident $i:tt) => { + if $param_i == $i { return $self.$i.as_ref() } + } +} diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index 60178ff899..19f779e067 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -228,7 +228,9 @@ mod tests { use primitives::{Blake2Hasher}; use crate::ChildStorageKey; - fn test_proving<'a>(trie_backend: &'a TrieBackend, Blake2Hasher>) -> ProvingBackend<'a, PrefixedMemoryDB, Blake2Hasher> { + fn test_proving<'a>( + trie_backend: &'a TrieBackend,Blake2Hasher>, + ) -> ProvingBackend<'a, PrefixedMemoryDB, Blake2Hasher> { ProvingBackend::new(trie_backend) } diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index fc30f94f05..cad150d1bc 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -21,7 +21,10 @@ use std::ops::Deref; use std::sync::Arc; use log::{debug, warn}; use hash_db::{self, Hasher}; -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 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::backend::Consolidate; /// Patricia trie-based storage trait. diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index b459e02fbc..0bb8367c14 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -16,4 +16,3 @@ parity-codec = "3.5.1" primitives = { package = "substrate-primitives", path = "../primitives" } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } - diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index b0815c513b..64725177fc 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -25,7 +25,6 @@ memory-db = { version = "0.12", default-features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../offchain/primitives", default-features = false} executive = { package = "srml-executive", path = "../../srml/executive", default-features = false } cfg-if = "0.1.6" -consensus_authorities = { package = "substrate-consensus-authorities", path = "../../core/consensus/authorities", default-features = false } [dev-dependencies] substrate-executor = { path = "../executor" } @@ -57,7 +56,6 @@ 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 cf7682102f..f14ddf6989 100644 --- a/core/test-runtime/src/genesismap.rs +++ b/core/test-runtime/src/genesismap.rs @@ -18,11 +18,10 @@ use std::collections::HashMap; use runtime_io::{blake2_256, twox_128}; -use super::AccountId; +use super::{AuthorityId, AccountId}; use parity_codec::{Encode, KeyedVec, Joiner}; use primitives::{ChangesTrieConfiguration, map, storage::well_known_keys}; use runtime_primitives::traits::Block; -use primitives::sr25519::Public as AuthorityId; /// Configuration of a general Substrate test genesis block. pub struct GenesisConfig { @@ -58,16 +57,12 @@ impl GenesisConfig { #[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))), ].into_iter()) - .chain(self.authorities.iter() - .enumerate() - .map(|(i, account)| ((i as u32).to_keyed_vec(well_known_keys::AUTHORITY_PREFIX), vec![].and(account))) - ) .collect(); if let Some(ref changes_trie_config) = self.changes_trie_config { map.insert(well_known_keys::CHANGES_TRIE_CONFIG.to_vec(), changes_trie_config.encode()); } + map.insert(twox_128(&b"sys:auth"[..])[..].to_vec(), self.authorities.encode()); map } } diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index 2e8981c524..ce9758da4e 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -39,7 +39,7 @@ use runtime_primitives::{ transaction_validity::TransactionValidity, traits::{ BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT, - GetNodeBlockType, GetRuntimeBlockType, AuthorityIdFor, Verify, + GetNodeBlockType, GetRuntimeBlockType, Verify }, }; use runtime_version::RuntimeVersion; @@ -49,6 +49,12 @@ use primitives::{sr25519, OpaqueMetadata}; use runtime_version::NativeVersion; use inherents::{CheckInherentsResult, InherentData}; use cfg_if::cfg_if; +pub use consensus_babe::AuthorityId; + +// Ensure Babe and Aura use the same crypto to simplify things a bit. +pub type AuraId = AuthorityId; +// Ensure Babe and Aura use the same crypto to simplify things a bit. +pub type BabeId = AuthorityId; /// Test runtime version. pub const VERSION: RuntimeVersion = RuntimeVersion { @@ -146,10 +152,6 @@ impl Extrinsic { } } -/// 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. @@ -161,13 +163,13 @@ pub type BlockNumber = u64; /// Index of a transaction. pub type Index = u64; /// The item of a block digest. -pub type DigestItem = runtime_primitives::generic::DigestItem; +pub type DigestItem = runtime_primitives::generic::DigestItem; /// The digest of a block. -pub type Digest = runtime_primitives::generic::Digest; +pub type Digest = runtime_primitives::generic::Digest; /// A test block. pub type Block = runtime_primitives::generic::Block; /// A test block's header. -pub type Header = runtime_primitives::generic::Header; +pub type Header = runtime_primitives::generic::Header; /// Run whatever tests we have. pub fn run_tests(mut input: &[u8]) -> Vec { @@ -455,8 +457,9 @@ cfg_if! { } } - impl consensus_aura::AuraApi for Runtime { + impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } + fn authorities() -> Vec { system::authorities() } } impl consensus_babe::BabeApi for Runtime { @@ -467,6 +470,7 @@ cfg_if! { threshold: std::u64::MAX, } } + fn authorities() -> Vec { system::authorities() } } impl offchain_primitives::OffchainWorkerApi for Runtime { @@ -475,12 +479,6 @@ cfg_if! { runtime_io::submit_transaction(&ex).unwrap(); } } - - impl consensus_authorities::AuthoritiesApi for Runtime { - fn authorities() -> Vec> { - system::authorities() - } - } } } else { impl_runtime_apis! { @@ -603,8 +601,9 @@ cfg_if! { } } - impl consensus_aura::AuraApi for Runtime { + impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } + fn authorities() -> Vec { system::authorities() } } impl consensus_babe::BabeApi for Runtime { @@ -615,6 +614,7 @@ cfg_if! { threshold: core::u64::MAX, } } + fn authorities() -> Vec { system::authorities() } } impl offchain_primitives::OffchainWorkerApi for Runtime { @@ -623,12 +623,6 @@ cfg_if! { runtime_io::submit_transaction(&ex).unwrap() } } - - impl consensus_authorities::AuthoritiesApi for Runtime { - fn authorities() -> Vec> { - system::authorities() - } - } } } } diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 57a5cb9ea2..d150a573e8 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -21,13 +21,14 @@ use rstd::prelude::*; 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, Header as _}; +use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Header as _}; use runtime_primitives::generic; use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult, transaction_validity::TransactionValidity}; use parity_codec::{KeyedVec, Encode}; -use super::{AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest}; +use super::{ + AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest, AuthorityId +}; use primitives::{Blake2Hasher, storage::well_known_keys}; -use primitives::sr25519::Public as AuthorityId; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; @@ -39,6 +40,7 @@ storage_items! { ParentHash: b"sys:pha" => required Hash; NewAuthorities: b"sys:new_auth" => Vec; StorageDigest: b"sys:digest" => Digest; + Authorities get(authorities): b"sys:auth" => default Vec; } pub fn balance_of_key(who: AccountId) -> Vec { @@ -53,17 +55,6 @@ pub fn nonce_of(who: AccountId) -> u64 { storage::hashed::get_or(&blake2_256, &who.to_keyed_vec(NONCE_OF), 0) } -/// Get authorities at given block. -pub fn authorities() -> Vec { - let len: u32 = storage::unhashed::get(well_known_keys::AUTHORITY_COUNT) - .expect("There are always authorities in test-runtime"); - (0..len) - .map(|i| storage::unhashed::get(&i.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)) - .expect("Authority is properly encoded in test-runtime") - ) - .collect() -} - pub fn initialize_block(header: &Header) { // populate environment. ::put(&header.number); @@ -80,37 +71,25 @@ pub fn take_block_number() -> Option { Number::take() } +#[derive(Copy, Clone)] +enum Mode { + Verify, + Overwrite, +} + /// Actually execute all transitioning for `block`. pub fn polish_block(block: &mut Block) { - let header = &mut block.header; - - // check transaction trie root represents the transactions. - let txs = block.extrinsics.iter().map(Encode::encode).collect::>(); - let txs = txs.iter().map(Vec::as_slice).collect::>(); - let txs_root = enumerated_trie_root::(&txs).into(); - info_expect_equal_hash(&txs_root, &header.extrinsics_root); - header.extrinsics_root = txs_root; - - // execute transactions - block.extrinsics.iter().enumerate().for_each(|(i, e)| { - storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &(i as u32)); - execute_transaction_backend(e).unwrap_or_else(|_| panic!("Invalid transaction")); - storage::unhashed::kill(well_known_keys::EXTRINSIC_INDEX); - }); - - header.state_root = storage_root().into(); - - // check digest - let digest = &mut header.digest; - if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into()) { - digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); - } - if let Some(new_authorities) = ::take() { - digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); - } + execute_block_with_state_root_handler(block, Mode::Overwrite); } pub fn execute_block(mut block: Block) { + execute_block_with_state_root_handler(&mut block, Mode::Verify); +} + +fn execute_block_with_state_root_handler( + block: &mut Block, + mode: Mode, +) { let header = &mut block.header; // check transaction trie root represents the transactions. @@ -118,19 +97,27 @@ pub fn execute_block(mut block: Block) { let txs = txs.iter().map(Vec::as_slice).collect::>(); let txs_root = enumerated_trie_root::(&txs).into(); info_expect_equal_hash(&txs_root, &header.extrinsics_root); - assert!(txs_root == header.extrinsics_root, "Transaction trie root must be valid."); + if let Mode::Overwrite = mode { + header.extrinsics_root = txs_root; + } else { + assert!(txs_root == header.extrinsics_root, "Transaction trie root must be valid."); + } // execute transactions - block.extrinsics.into_iter().enumerate().for_each(|(i, e)| { + block.extrinsics.iter().enumerate().for_each(|(i, e)| { storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &(i as u32)); - execute_transaction_backend(&e).unwrap_or_else(|_| panic!("Invalid transaction")); + execute_transaction_backend(e).unwrap_or_else(|_| panic!("Invalid transaction")); storage::unhashed::kill(well_known_keys::EXTRINSIC_INDEX); }); - // check storage root. - let storage_root = storage_root().into(); - info_expect_equal_hash(&storage_root, &header.state_root); - assert!(storage_root == header.state_root, "Storage root must match that calculated."); + if let Mode::Overwrite = mode { + header.state_root = storage_root().into(); + } else { + // check storage root. + let storage_root = storage_root().into(); + info_expect_equal_hash(&storage_root, &header.state_root); + assert!(storage_root == header.state_root, "Storage root must match that calculated."); + } // check digest let digest = &mut header.digest; @@ -138,7 +125,8 @@ pub fn execute_block(mut block: Block) { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); } if let Some(new_authorities) = ::take() { - digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); + digest.push(generic::DigestItem::Consensus(*b"aura", new_authorities.encode())); + digest.push(generic::DigestItem::Consensus(*b"babe", new_authorities.encode())); } } @@ -224,7 +212,8 @@ pub fn finalize_block() -> Header { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root)); } if let Some(new_authorities) = ::take() { - digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); + digest.push(generic::DigestItem::Consensus(*b"aura", new_authorities.encode())); + digest.push(generic::DigestItem::Consensus(*b"babe", new_authorities.encode())); } Header { @@ -309,25 +298,27 @@ fn info_expect_equal_hash(given: &Hash, expected: &Hash) { mod tests { use super::*; - use runtime_io::{with_externalities, twox_128, blake2_256, TestExternalities}; - use parity_codec::{Joiner, KeyedVec}; + use runtime_io::{with_externalities, TestExternalities}; use substrate_test_runtime_client::{AuthorityKeyring, AccountKeyring}; use crate::{Header, Transfer}; use primitives::{Blake2Hasher, map}; - use primitives::storage::well_known_keys; use substrate_executor::WasmExecutor; const WASM_CODE: &'static [u8] = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm"); fn new_test_ext() -> TestExternalities { + let authorities = vec![ + AuthorityKeyring::Alice.to_raw_public(), + AuthorityKeyring::Bob.to_raw_public(), + AuthorityKeyring::Charlie.to_raw_public() + ]; TestExternalities::new(map![ twox_128(b"latest").to_vec() => vec![69u8; 32], - twox_128(well_known_keys::AUTHORITY_COUNT).to_vec() => vec![].and(&3u32), - 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(), - blake2_256(&AccountKeyring::Alice.to_raw_public().to_keyed_vec(b"balance:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(b"sys:auth").to_vec() => authorities.encode(), + 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 19c6b36ebc..833c31c3e4 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -2500,21 +2500,10 @@ dependencies = [ [[package]] name = "substrate-consensus-aura-primitives" version = "2.0.0" -dependencies = [ - "sr-primitives 2.0.0", - "substrate-client 2.0.0", -] - -[[package]] -name = "substrate-consensus-authorities" -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", ] @@ -2525,8 +2514,10 @@ version = "2.0.0" dependencies = [ "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-consensus-slots 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -2711,7 +2702,6 @@ dependencies = [ "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", diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index 6298f10bf4..ec6f50d6e3 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -379,7 +379,9 @@ mod tests { 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(); + let root2: Vec = trie_root::, Vec>( + std::iter::empty(), + ).as_ref().iter().cloned().collect(); assert_eq!(root1, root2); } @@ -455,7 +457,10 @@ mod tests { #[test] fn single_long_leaf_is_equivalent() { - let input: Vec<(&[u8], &[u8])> = vec![(&[0xaa][..], &b"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"[..]), (&[0xba][..], &[0x11][..])]; + let input: Vec<(&[u8], &[u8])> = vec![ + (&[0xaa][..], &b"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"[..]), + (&[0xba][..], &[0x11][..]), + ]; check_equivalent(&input); check_iteration(&input); } diff --git a/node-template/runtime/Cargo.toml b/node-template/runtime/Cargo.toml index bc784071ba..90cc85317a 100644 --- a/node-template/runtime/Cargo.toml +++ b/node-template/runtime/Cargo.toml @@ -14,7 +14,6 @@ version = { package = "sr-version", path = "../../core/sr-version", default_feat support = { package = "srml-support", path = "../../srml/support", default_features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default_features = false } balances = { package = "srml-balances", path = "../../srml/balances", default_features = false } -consensus = { package = "srml-consensus", path = "../../srml/consensus", default_features = false } aura = { package = "srml-aura", path = "../../srml/aura", default_features = false } executive = { package = "srml-executive", path = "../../srml/executive", default_features = false } indices = { package = "srml-indices", path = "../../srml/indices", default_features = false } @@ -25,7 +24,6 @@ runtime-primitives = { package = "sr-primitives", path = "../../core/sr-primitiv client = { package = "substrate-client", path = "../../core/client", default_features = false } consensus-aura = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives", default_features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../../core/offchain/primitives", default-features = false } -consensus_authorities = { package = "substrate-consensus-authorities", path = "../../core/consensus/authorities", default-features = false } [features] default = ["std"] @@ -49,5 +47,4 @@ std = [ "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 6193fd8e71..9b99e7f08f 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -26,18 +26,17 @@ use version::NativeVersion; // A few exports that help ease life for downstream crates. #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildStorage; -pub use consensus::Call as ConsensusCall; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; pub use runtime_primitives::{Permill, Perbill}; pub use timestamp::BlockPeriod; pub use support::{StorageValue, construct_runtime}; -/// The type that is used for identifying authorities. -pub type AuthorityId = ::Signer; +/// Alias to the signature scheme used for Aura authority signatures. +pub type AuraSignature = ed25519::Signature; -/// The type used by authorities to prove their ID. -pub type AuthoritySignature = ed25519::Signature; +/// The Ed25519 pub key of an session that belongs to an Aura authority of the chain. +pub type AuraId = ed25519::Public; /// Alias to pubkey that identifies an account on the chain. pub type AccountId = ::Signer; @@ -80,13 +79,13 @@ pub mod opaque { } } /// Opaque block header type. - pub type Header = generic::Header>; + pub type Header = generic::Header; /// Opaque block type. pub type Block = generic::Block; /// Opaque block identifier type. pub type BlockId = generic::BlockId; /// Opaque session key type. - pub type SessionKey = AuthorityId; + pub type SessionKey = AuraId; } /// This runtime version. @@ -121,30 +120,17 @@ impl system::Trait for Runtime { type Hash = Hash; /// The hashing algorithm used. type Hashing = BlakeTwo256; - /// The header digest type. - type Digest = generic::Digest; /// The header type. - type Header = generic::Header; + type Header = generic::Header; /// The ubiquitous event type. type Event = Event; - /// The ubiquitous log type. - type Log = Log; /// The ubiquitous origin type. type Origin = Origin; } impl aura::Trait for Runtime { type HandleReport = (); -} - -impl consensus::Trait for Runtime { - /// The identifier we use to refer to authorities. - type SessionKey = AuthorityId; - // The aura module handles offline-reports internally - // rather than using an explicit report system. - type InherentOfflineReport = (); - /// The ubiquitous log type. - type Log = Log; + type AuthorityId = AuraId; } impl indices::Trait for Runtime { @@ -192,16 +178,15 @@ impl template::Trait for Runtime { } construct_runtime!( - pub enum Runtime with Log(InternalLog: DigestItem) where + pub enum Runtime where Block = Block, NodeBlock = opaque::Block, UncheckedExtrinsic = UncheckedExtrinsic { - System: system::{default, Log(ChangesTrieRoot)}, + System: system::{default, Config}, Timestamp: timestamp::{Module, Call, Storage, Config, Inherent}, - Consensus: consensus::{Module, Call, Storage, Config, Log(AuthoritiesChange), Inherent}, - Aura: aura::{Module, Log(PreRuntime)}, - Indices: indices, + Aura: aura::{Module, Config, Inherent(Timestamp)}, + Indices: indices::{default, Config}, Balances: balances, Sudo: sudo, // Used for the module template in `./template.rs` @@ -214,7 +199,7 @@ type Context = system::ChainContext; /// The address format for describing accounts. type Address = ::Source; /// Block header type as expected by this runtime. -pub type Header = generic::Header; +pub type Header = generic::Header; /// Block type as expected by this runtime. pub type Block = generic::Block; /// BlockId type as expected by this runtime. @@ -276,10 +261,13 @@ impl_runtime_apis! { } } - impl consensus_aura::AuraApi for Runtime { + impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { Aura::slot_duration() } + fn authorities() -> Vec { + Aura::authorities() + } } impl offchain_primitives::OffchainWorkerApi for Runtime { @@ -287,10 +275,4 @@ impl_runtime_apis! { Executive::offchain_worker(n) } } - - impl consensus_authorities::AuthoritiesApi for Runtime { - fn authorities() -> Vec { - Consensus::authorities() - } - } } diff --git a/node-template/runtime/src/template.rs b/node-template/runtime/src/template.rs index 636ee1ac09..c8b75f43f5 100644 --- a/node-template/runtime/src/template.rs +++ b/node-template/runtime/src/template.rs @@ -75,7 +75,7 @@ mod tests { use runtime_primitives::{ BuildStorage, traits::{BlakeTwo256, IdentityLookup}, - testing::{Digest, DigestItem, Header} + testing::Header, }; impl_outer_origin! { @@ -93,12 +93,10 @@ mod tests { type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = (); - type Log = DigestItem; } impl Trait for Test { type Event = (); diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index c94150dc5b..ae323203f6 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -1471,7 +1471,6 @@ dependencies = [ "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", @@ -1480,7 +1479,6 @@ dependencies = [ "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", ] @@ -2382,7 +2380,9 @@ dependencies = [ "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -2399,20 +2399,6 @@ dependencies = [ "substrate-keyring 2.0.0", ] -[[package]] -name = "srml-consensus" -version = "2.0.0" -dependencies = [ - "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", - "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 = "2.0.0" @@ -2461,7 +2447,6 @@ dependencies = [ "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "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", @@ -2477,7 +2462,6 @@ dependencies = [ "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", @@ -2653,21 +2637,10 @@ dependencies = [ [[package]] name = "substrate-consensus-aura-primitives" version = "2.0.0" -dependencies = [ - "sr-primitives 2.0.0", - "substrate-client 2.0.0", -] - -[[package]] -name = "substrate-consensus-authorities" -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", ] diff --git a/node-template/src/chain_spec.rs b/node-template/src/chain_spec.rs index 3cb8d21d5d..f14cf41464 100644 --- a/node-template/src/chain_spec.rs +++ b/node-template/src/chain_spec.rs @@ -1,12 +1,10 @@ use primitives::{ed25519, sr25519, Pair}; use node_template_runtime::{ - AccountId, GenesisConfig, ConsensusConfig, TimestampConfig, BalancesConfig, - SudoConfig, IndicesConfig, + AccountId, AuraId as AuthorityId, GenesisConfig, AuraConfig, TimestampConfig, BalancesConfig, + SudoConfig, IndicesConfig, SystemConfig }; use substrate_service; -use ed25519::Public as AuthorityId; - // Note this is the URL for the telemetry server //const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -92,11 +90,14 @@ impl Alternative { fn testnet_genesis(initial_authorities: Vec, endowed_accounts: Vec, root_key: AccountId) -> GenesisConfig { GenesisConfig { - consensus: Some(ConsensusConfig { + system: Some(SystemConfig { code: include_bytes!("../runtime/wasm/target/wasm32-unknown-unknown/release/node_template_runtime_wasm.compact.wasm").to_vec(), + changes_trie_config: Default::default(), + _genesis_phantom_data: Default::default(), + }), + aura: Some(AuraConfig { authorities: initial_authorities.clone(), }), - system: None, timestamp: Some(TimestampConfig { minimum_period: 5, // 10 second block time. }), diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index 24234fd271..14a5b5c32d 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -27,6 +27,7 @@ network = { package = "substrate-network", path = "../../core/network" } consensus = { package = "substrate-consensus-aura", path = "../../core/consensus/aura" } grandpa = { package = "substrate-finality-grandpa", path = "../../core/finality-grandpa" } sr-primitives = { path = "../../core/sr-primitives" } +aura_primitives = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives" } node-executor = { path = "../executor" } substrate-keystore = { path = "../../core/keystore" } substrate-telemetry = { package = "substrate-telemetry", path = "../../core/telemetry" } diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 242c5078f5..7f3c250d7c 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -16,15 +16,16 @@ //! Substrate chain configurations. -use primitives::{ed25519::Public as AuthorityId, ed25519, sr25519, Pair, crypto::UncheckedInto}; -use node_primitives::AccountId; -use node_runtime::{ConsensusConfig, CouncilSeatsConfig, DemocracyConfig, +use primitives::{ed25519, sr25519, Pair, crypto::UncheckedInto}; +use node_primitives::{AccountId, AuraId}; +use node_runtime::{CouncilSeatsConfig, AuraConfig, DemocracyConfig, SystemConfig, SessionConfig, StakingConfig, StakerStatus, TimestampConfig, BalancesConfig, TreasuryConfig, - SudoConfig, ContractConfig, GrandpaConfig, IndicesConfig, Permill, Perbill}; + SudoConfig, ContractConfig, GrandpaConfig, IndicesConfig, Permill, Perbill, SessionKeys}; pub use node_runtime::GenesisConfig; use substrate_service; use hex_literal::hex; use substrate_telemetry::TelemetryEndpoints; +use grandpa::AuthorityId as GrandpaId; const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -43,27 +44,48 @@ fn staging_testnet_config_genesis() -> GenesisConfig { // and // 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!["9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12"].unchecked_into(), // 5Fbsd6WXDGiLTxunqeK5BATNiocfCqu9bS1yArVjCgeBLkVy - hex!["781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276"].unchecked_into(), // 5EnCiV7wSHeNhjW3FSUwiJNkcc2SBkPLn5Nj93FmbLtBjQUq - hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC + let initial_authorities: Vec<(AccountId, AccountId, AuraId, GrandpaId)> = vec![( + // 5Fbsd6WXDGiLTxunqeK5BATNiocfCqu9bS1yArVjCgeBLkVy + hex!["9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12"].unchecked_into(), + // 5EnCiV7wSHeNhjW3FSUwiJNkcc2SBkPLn5Nj93FmbLtBjQUq + hex!["781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276"].unchecked_into(), + // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC + hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), + // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC + hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), ),( - hex!["68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78"].unchecked_into(), // 5ERawXCzCWkjVq3xz1W5KGNtVx2VdefvZ62Bw1FEuZW4Vny2 - hex!["c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e"].unchecked_into(), // 5Gc4vr42hH1uDZc93Nayk5G7i687bAQdHHc9unLuyeawHipF - hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE + // 5ERawXCzCWkjVq3xz1W5KGNtVx2VdefvZ62Bw1FEuZW4Vny2 + hex!["68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78"].unchecked_into(), + // 5Gc4vr42hH1uDZc93Nayk5G7i687bAQdHHc9unLuyeawHipF + hex!["c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e"].unchecked_into(), + // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE + hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), + // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE + hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), ),( - hex!["547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65"].unchecked_into(), // 5DyVtKWPidondEu8iHZgi6Ffv9yrJJ1NDNLom3X9cTDi98qp - hex!["9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526"].unchecked_into(), // 5FeD54vGVNpFX3PndHPXJ2MDakc462vBCD5mgtWRnWYCpZU9 - hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d + // 5DyVtKWPidondEu8iHZgi6Ffv9yrJJ1NDNLom3X9cTDi98qp + hex!["547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65"].unchecked_into(), + // 5FeD54vGVNpFX3PndHPXJ2MDakc462vBCD5mgtWRnWYCpZU9 + hex!["9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526"].unchecked_into(), + // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d + hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), + // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d + hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), ),( - hex!["f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663"].unchecked_into(), // 5HYZnKWe5FVZQ33ZRJK1rG3WaLMztxWrrNDb1JRwaHHVWyP9 - hex!["66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f"].unchecked_into(), // 5EPQdAQ39WQNLCRjWsCk5jErsCitHiY5ZmjfWzzbXDoAoYbn - hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 + // 5HYZnKWe5FVZQ33ZRJK1rG3WaLMztxWrrNDb1JRwaHHVWyP9 + hex!["f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663"].unchecked_into(), + // 5EPQdAQ39WQNLCRjWsCk5jErsCitHiY5ZmjfWzzbXDoAoYbn + hex!["66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f"].unchecked_into(), + // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 + hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), + // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 + hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), )]; // generated with secret: subkey inspect "$secret"/fir let endowed_accounts: Vec = vec![ - hex!["9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809"].unchecked_into(), // 5Ff3iXP75ruzroPWRP2FYBHWnmGGBSb63857BgnzCoXNxfPo + // 5Ff3iXP75ruzroPWRP2FYBHWnmGGBSb63857BgnzCoXNxfPo + hex!["9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809"].unchecked_into(), ]; const MILLICENTS: u128 = 1_000_000_000; @@ -79,11 +101,11 @@ fn staging_testnet_config_genesis() -> GenesisConfig { const STASH: u128 = 100 * DOLLARS; GenesisConfig { - consensus: Some(ConsensusConfig { + system: Some(SystemConfig { code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), // FIXME change once we have #1252 - authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + _genesis_phantom_data: Default::default(), + changes_trie_config: Default::default(), }), - system: None, balances: Some(BalancesConfig { transaction_base_fee: 1 * CENTS, transaction_byte_fee: 10 * MILLICENTS, @@ -103,8 +125,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { }), session: Some(SessionConfig { validators: initial_authorities.iter().map(|x| x.1.clone()).collect(), - session_length: 5 * MINUTES, - keys: initial_authorities.iter().map(|x| (x.1.clone(), x.2.clone())).collect::>(), + keys: initial_authorities.iter().map(|x| (x.1.clone(), SessionKeys(x.2.clone(),x.2.clone()))).collect::>(), }), staking: Some(StakingConfig { current_era: 0, @@ -112,8 +133,6 @@ fn staging_testnet_config_genesis() -> GenesisConfig { session_reward: Perbill::from_parts(2_065), current_session_reward: 0, validator_count: 7, - sessions_per_era: 12, - 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(), @@ -165,8 +184,12 @@ fn staging_testnet_config_genesis() -> GenesisConfig { sudo: Some(SudoConfig { key: endowed_accounts[0].clone(), }), + aura: Some(AuraConfig { + authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + }), grandpa: Some(GrandpaConfig { - authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), + _genesis_phantom_data: Default::default(), }), } } @@ -193,25 +216,33 @@ pub fn get_account_id_from_seed(seed: &str) -> AccountId { .public() } -/// Helper function to generate AuthorityId from seed -pub fn get_session_key_from_seed(seed: &str) -> AuthorityId { +/// Helper function to generate AuraId from seed +pub fn get_aura_id_from_seed(seed: &str) -> AuraId { + ed25519::Pair::from_string(&format!("//{}", seed), None) + .expect("static values are valid; qed") + .public() +} + +/// Helper function to generate GrandpaId from seed +pub fn get_grandpa_id_from_seed(seed: &str) -> GrandpaId { ed25519::Pair::from_string(&format!("//{}", seed), None) .expect("static values are valid; qed") .public() } /// Helper function to generate stash, controller and session key from seed -pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, AuthorityId) { +pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, AuraId, GrandpaId) { ( get_account_id_from_seed(&format!("{}//stash", seed)), get_account_id_from_seed(seed), - get_session_key_from_seed(seed) + get_aura_id_from_seed(seed), + get_grandpa_id_from_seed(seed) ) } /// Helper function to create GenesisConfig for testing pub fn testnet_genesis( - initial_authorities: Vec<(AccountId, AccountId, AuthorityId)>, + initial_authorities: Vec<(AccountId, AccountId, AuraId, GrandpaId)>, root_key: AccountId, endowed_accounts: Option>, enable_println: bool, @@ -260,11 +291,11 @@ pub fn testnet_genesis( contract_config.current_schedule.enable_println = enable_println; GenesisConfig { - consensus: Some(ConsensusConfig { + system: Some(SystemConfig { code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), - authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + _genesis_phantom_data: Default::default(), + changes_trie_config: Default::default(), }), - system: None, indices: Some(IndicesConfig { ids: endowed_accounts.clone(), }), @@ -279,15 +310,12 @@ pub fn testnet_genesis( }), session: Some(SessionConfig { validators: initial_authorities.iter().map(|x| x.1.clone()).collect(), - session_length: 10, - keys: initial_authorities.iter().map(|x| (x.1.clone(), x.2.clone())).collect::>(), + keys: initial_authorities.iter().map(|x| (x.1.clone(), SessionKeys(x.2.clone(), x.2.clone()))).collect::>(), }), staking: Some(StakingConfig { current_era: 0, minimum_validator_count: 1, validator_count: 2, - sessions_per_era: 5, - bonding_duration: 12, offline_slash: Perbill::zero(), session_reward: Perbill::zero(), current_session_reward: 0, @@ -298,7 +326,7 @@ pub fn testnet_genesis( democracy: Some(DemocracyConfig::default()), council_seats: Some(CouncilSeatsConfig { active_council: endowed_accounts.iter() - .filter(|&endowed| initial_authorities.iter().find(|&(_, controller, _)| controller == endowed).is_none()) + .filter(|&endowed| initial_authorities.iter().find(|&(_, controller, ..)| controller == endowed).is_none()) .map(|a| (a.clone(), 1000000)).collect(), candidacy_bond: 10, voter_bond: 2, @@ -325,8 +353,12 @@ pub fn testnet_genesis( sudo: Some(SudoConfig { key: root_key, }), + aura: Some(AuraConfig { + authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + }), grandpa: Some(GrandpaConfig { - authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), + _genesis_phantom_data: Default::default(), }), } } diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 4fe74e4f9a..058f58c9c2 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -224,9 +224,9 @@ mod tests { use parity_codec::{Compact, Encode, Decode}; use primitives::{ crypto::Pair as CryptoPair, ed25519::Pair, blake2_256, - sr25519::Public as AddressPublic, + sr25519::Public as AddressPublic, H256, }; - use sr_primitives::{generic::{BlockId, Era, Digest}, traits::{Block, Digest as DigestT}, OpaqueExtrinsic}; + use sr_primitives::{generic::{BlockId, Era, Digest}, traits::Block, OpaqueExtrinsic}; use timestamp; use finality_tracker; use keyring::{ed25519::Keyring as AuthorityKeyring, sr25519::Keyring as AccountKeyring}; @@ -299,9 +299,9 @@ mod tests { client: service.client(), transaction_pool: service.transaction_pool(), }); - let mut digest = Digest::::default(); + let mut digest = Digest::::default(); digest.push(>::aura_pre_digest(slot_num * 10 / 2)); - let proposer = proposer_factory.init(&parent_header, &[]).unwrap(); + let proposer = proposer_factory.init(&parent_header).unwrap(); let new_block = proposer.propose( inherent_data, digest, diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index ee126d19ea..4d5c69b281 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -25,7 +25,6 @@ balances = { package = "srml-balances", path = "../../srml/balances" } session = { package = "srml-session", path = "../../srml/session" } staking = { package = "srml-staking", path = "../../srml/staking" } system = { package = "srml-system", path = "../../srml/system" } -consensus = { package = "srml-consensus", path = "../../srml/consensus" } timestamp = { package = "srml-timestamp", path = "../../srml/timestamp" } treasury = { package = "srml-treasury", path = "../../srml/treasury" } contract = { package = "srml-contract", path = "../../srml/contract" } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index aabee6805e..4f0c38d884 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -37,14 +37,14 @@ mod tests { 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, Digest, DigestItem}; + use runtime_primitives::traits::{Header as HeaderT, Hash as HashT}; use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; - use {balances, indices, session, system, staking, consensus, timestamp, treasury, contract}; + use {balances, indices, system, staking, 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}; + SystemConfig, GrandpaConfig, IndicesConfig, Event, SessionKeys}; use wabt; use primitives::map; @@ -121,15 +121,33 @@ mod tests { #[test] fn panic_execution_with_foreign_code_gives_error() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ - 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], - 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] + 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] + }, + 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] + } ]); let r = executor().call::<_, NeverNativeValue, fn() -> _>( @@ -154,15 +172,33 @@ mod tests { #[test] fn bad_extrinsic_with_native_equivalent_code_gives_error() { let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ - 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], - 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] + 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] + }, + 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] + } ]); let r = executor().call::<_, NeverNativeValue, fn() -> _>( @@ -187,8 +223,12 @@ mod tests { #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ - 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], + 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], @@ -224,8 +264,12 @@ mod tests { #[test] fn successful_execution_with_foreign_code_gives_ok() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ - 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], + 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], @@ -258,10 +302,14 @@ mod tests { }); } + fn to_session_keys(ring: &AuthorityKeyring) -> SessionKeys { + SessionKeys(ring.to_owned().into(), ring.to_owned().into()) + } + fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { let three = AccountId::from_raw([3u8; 32]); let mut ext = TestExternalities::new_with_code(code, GenesisConfig { - consensus: Some(Default::default()), + aura: Some(Default::default()), system: Some(SystemConfig { changes_trie_config: if support_changes_trie { Some(ChangesTrieConfiguration { digest_interval: 2, @@ -289,16 +337,14 @@ mod tests { vesting: vec![], }), session: Some(SessionConfig { - session_length: 2, validators: vec![AccountKeyring::One.into(), AccountKeyring::Two.into(), three], keys: vec![ - (alice(), AuthorityKeyring::Alice.into()), - (bob(), AuthorityKeyring::Bob.into()), - (charlie(), AuthorityKeyring::Charlie.into()) + (alice(), to_session_keys(&AuthorityKeyring::Alice)), + (bob(), to_session_keys(&AuthorityKeyring::Bob)), + (charlie(), to_session_keys(&AuthorityKeyring::Charlie)), ] }), staking: Some(StakingConfig { - sessions_per_era: 2, current_era: 0, stakers: vec![ (dave(), alice(), 111, staking::StakerStatus::Validator), @@ -307,7 +353,6 @@ mod tests { ], validator_count: 3, minimum_validator_count: 0, - bonding_duration: 0, offline_slash: Perbill::zero(), session_reward: Perbill::zero(), current_session_reward: 0, @@ -321,6 +366,7 @@ mod tests { contract: Some(Default::default()), sudo: Some(Default::default()), grandpa: Some(GrandpaConfig { + _genesis_phantom_data: Default::default(), authorities: vec![], }), }.build_storage().unwrap().0); @@ -447,8 +493,8 @@ mod tests { // 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()); + assert_eq!(digest.logs().len(), 0); +// assert!(digest.logs()[0].as_consensus().is_some()); (block1, block2) } @@ -465,7 +511,7 @@ mod tests { }, CheckedExtrinsic { signed: Some((alice(), 0)), - function: Call::Consensus(consensus::Call::remark(vec![0; 120000])), + function: Call::System(system::Call::remark(vec![0; 120000])), } ] ) @@ -598,11 +644,6 @@ mod tests { event: Event::treasury(treasury::RawEvent::Rollover(0)), topics: vec![], }, - EventRecord { - phase: Phase::Finalization, - event: Event::session(session::RawEvent::NewSession(1)), - topics: vec![], - }, ]); }); } @@ -782,7 +823,7 @@ mod tests { assert!( WasmExecutor::new().call( &mut t, - 8, + 4, COMPACT_CODE, "Core_execute_block", &big_block().0 @@ -822,8 +863,12 @@ 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![ - 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], + 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], @@ -833,9 +878,11 @@ mod tests { twox_128(>::key()).to_vec() => vec![0u8; 16] ]); - let r = WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); + let r = WasmExecutor::new() + .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); + let r = WasmExecutor::new() + .call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); let r = ApplyResult::decode(&mut &r[..]).unwrap(); assert_eq!(r, Err(ApplyError::CantPay)); } @@ -844,8 +891,12 @@ 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![ - 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], + 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], @@ -855,9 +906,11 @@ mod tests { twox_128(>::key()).to_vec() => vec![0u8; 16] ]); - let r = WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); + let r = WasmExecutor::new() + .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); + let r = WasmExecutor::new() + .call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); let r = ApplyResult::decode(&mut &r[..]).unwrap(); assert_eq!(r, Ok(ApplyOutcome::Success)); @@ -890,7 +943,8 @@ mod tests { let block1 = changes_trie_block(); let mut t = new_test_ext(COMPACT_CODE, true); - WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); + WasmExecutor::new() + .call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); assert!(t.storage_changes_root(GENESIS_HASH.into()).unwrap().is_some()); } diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 2135ad672f..8b7b2521e4 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -41,12 +41,11 @@ pub type AccountIndex = u32; /// Balance of an account. pub type Balance = u128; -/// The Ed25519 pub key of an session that belongs to an authority of the chain. This is -/// exactly equivalent to what the substrate calls an "authority". -pub type AuthorityId = ::Signer; +/// Alias to the signature scheme used for Aura authority signatures. +pub type AuraSignature = primitives::ed25519::Signature; -/// Alias to 512-bit hash when used in the context of a session signature on the chain. -pub type AuthoritySignature = primitives::ed25519::Signature; +/// The Ed25519 pub key of an session that belongs to an Aura authority of the chain. +pub type AuraId = primitives::ed25519::Public; /// Index of a transaction in the chain. pub type Index = u64; @@ -58,9 +57,9 @@ pub type Hash = primitives::H256; pub type Timestamp = u64; /// Digest item type. -pub type DigestItem = generic::DigestItem; +pub type DigestItem = generic::DigestItem; /// Header type. -pub type Header = generic::Header; +pub type Header = generic::Header; /// Block type. pub type Block = generic::Block; /// Block ID. diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index 486a5b80a0..b42ecd67ee 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -17,7 +17,6 @@ version = { package = "sr-version", path = "../../core/sr-version", default-feat support = { package = "srml-support", path = "../../srml/support", default-features = false } aura = { package = "srml-aura", path = "../../srml/aura", default-features = false } balances = { package = "srml-balances", path = "../../srml/balances", default-features = false } -consensus = { package = "srml-consensus", path = "../../srml/consensus", default-features = false } contract = { package = "srml-contract", path = "../../srml/contract", default-features = false } council = { package = "srml-council", path = "../../srml/council", default-features = false } democracy = { package = "srml-democracy", path = "../../srml/democracy", default-features = false } @@ -36,7 +35,6 @@ consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../. rustc-hex = { version = "2.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"] @@ -51,7 +49,6 @@ std = [ "support/std", "aura/std", "balances/std", - "consensus/std", "contract/std", "council/std", "democracy/std", @@ -74,5 +71,4 @@ std = [ "rustc-hex", "substrate-keyring", "offchain-primitives/std", - "consensus_authorities/std", ] diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 25dbc6f205..8c5b9c3b1b 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -21,10 +21,11 @@ #![recursion_limit="256"] use rstd::prelude::*; +use parity_codec::{Encode, Decode}; use support::{construct_runtime, parameter_types}; use substrate_primitives::u32_trait::{_1, _2, _3, _4}; use node_primitives::{ - AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, AuthorityId, Signature, AuthoritySignature + AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, Signature, AuraId }; use grandpa::fg_primitives::{self, ScheduledChange}; use client::{ @@ -34,7 +35,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, AuthorityIdFor, Convert, + BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, Convert, }; use version::RuntimeVersion; use council::{motions as council_motions}; @@ -43,13 +44,13 @@ use council::seats as council_seats; #[cfg(any(feature = "std", test))] use version::NativeVersion; use substrate_primitives::OpaqueMetadata; +use grandpa::{AuthorityId as GrandpaId, AuthorityWeight as GrandpaWeight}; #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildStorage; -pub use consensus::Call as ConsensusCall; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; -pub use runtime_primitives::{Permill, Perbill}; +pub use runtime_primitives::{Permill, Perbill, impl_opaque_keys}; pub use support::StorageValue; pub use staking::StakerStatus; @@ -58,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 93, + spec_version: 94, impl_version: 94, apis: RUNTIME_API_VERSIONS, }; @@ -92,16 +93,15 @@ impl system::Trait for Runtime { type BlockNumber = BlockNumber; type Hash = Hash; type Hashing = BlakeTwo256; - type Digest = generic::Digest; type AccountId = AccountId; type Lookup = Indices; - type Header = generic::Header; + type Header = generic::Header; type Event = Event; - type Log = Log; } impl aura::Trait for Runtime { type HandleReport = aura::StakingSlasher; + type AuthorityId = AuraId; } impl indices::Trait for Runtime { @@ -121,24 +121,40 @@ impl balances::Trait for Runtime { type TransferPayment = (); } -impl consensus::Trait for Runtime { - type Log = Log; - type SessionKey = AuthorityId; - - // The Aura module handles offline-reports internally - // rather than using an explicit report system. - type InherentOfflineReport = (); -} - impl timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Aura; } +parameter_types! { + pub const Period: BlockNumber = 10 * MINUTES; + pub const Offset: BlockNumber = 0; +} + +type SessionHandlers = (Grandpa, Aura); +#[cfg(feature = "std")] +use serde::{Serialize, Deserialize}; +impl_opaque_keys! { + pub struct SessionKeys(grandpa::AuthorityId, AuraId); +} + +// NOTE: `SessionHandler` and `SessionKeys` are co-dependent: One key will be used for each handler. +// The number and order of items in `SessionHandler` *MUST* be the same number and order of keys in +// `SessionKeys`. +// TODO: Introduce some structure to tie these together to make it a bit less of a footgun. This +// should be easy, since OneSessionHandler trait provides the `Key` as an associated type. #2858 + impl session::Trait for Runtime { - type ConvertAccountIdToSessionKey = (); - type OnSessionChange = (Staking, grandpa::SyncedAuthorities); + type OnSessionEnding = Staking; + type SessionHandler = SessionHandlers; + type ShouldEndSession = session::PeriodicSessions; type Event = Event; + type Keys = SessionKeys; +} + +parameter_types! { + pub const SessionsPerEra: session::SessionIndex = 6; + pub const BondingDuration: staking::EraIndex = 24 * 28; } impl staking::Trait for Runtime { @@ -148,6 +164,8 @@ impl staking::Trait for Runtime { type Event = Event; type Slash = (); type Reward = (); + type SessionsPerEra = SessionsPerEra; + type BondingDuration = BondingDuration; } const MINUTES: BlockNumber = 6; @@ -187,7 +205,6 @@ impl council::Trait for Runtime { type OnMembersChanged = CouncilMotions; } - impl council::motions::Trait for Runtime { type Origin = Origin; type Proposal = Call; @@ -220,35 +237,32 @@ impl sudo::Trait for Runtime { } impl grandpa::Trait for Runtime { - type SessionKey = AuthorityId; - type Log = Log; type Event = Event; } impl finality_tracker::Trait for Runtime { - type OnFinalizationStalled = grandpa::SyncedAuthorities; + type OnFinalizationStalled = Grandpa; } construct_runtime!( - pub enum Runtime with Log(InternalLog: DigestItem) where + pub enum Runtime where Block = Block, NodeBlock = node_primitives::Block, UncheckedExtrinsic = UncheckedExtrinsic { - System: system::{default, Log(ChangesTrieRoot)}, - Aura: aura::{Module, Inherent(Timestamp), Log(PreRuntime)}, + System: system::{Module, Call, Storage, Config}, + Aura: aura::{Module, Config, Inherent(Timestamp)}, Timestamp: timestamp::{Module, Call, Storage, Config, Inherent}, - Consensus: consensus::{Module, Call, Storage, Config, Log(AuthoritiesChange), Inherent}, Indices: indices, Balances: balances, - Session: session, + Session: session::{Module, Call, Storage, Event, Config}, Staking: staking::{default, OfflineWorker}, Democracy: democracy, Council: council::{Module, Call, Storage, Event}, CouncilMotions: council_motions::{Module, Call, Storage, Event, Origin}, CouncilSeats: council_seats::{Config}, FinalityTracker: finality_tracker::{Module, Call, Inherent}, - Grandpa: grandpa::{Module, Call, Storage, Config, Log(), Event}, + Grandpa: grandpa::{Module, Call, Storage, Config, Event}, Treasury: treasury, Contract: contract::{Module, Call, Storage, Config, Event}, Sudo: sudo, @@ -258,7 +272,7 @@ construct_runtime!( /// The address format for describing accounts. pub type Address = ::Source; /// Block header type as expected by this runtime. -pub type Header = generic::Header; +pub type Header = generic::Header; /// Block type as expected by this runtime. pub type Block = generic::Block; /// A Block signed with a Justification @@ -331,45 +345,26 @@ impl_runtime_apis! { fn grandpa_pending_change(digest: &DigestFor) -> Option>> { - for log in digest.logs.iter().filter_map(|l| match l { - Log(InternalLog::grandpa(grandpa_signal)) => Some(grandpa_signal), - _ => None - }) { - if let Some(change) = Grandpa::scrape_digest_change(log) { - return Some(change); - } - } - None + Grandpa::pending_change(digest) } fn grandpa_forced_change(digest: &DigestFor) -> Option<(NumberFor, ScheduledChange>)> { - for log in digest.logs.iter().filter_map(|l| match l { - Log(InternalLog::grandpa(grandpa_signal)) => Some(grandpa_signal), - _ => None - }) { - if let Some(change) = Grandpa::scrape_digest_forced_change(log) { - return Some(change); - } - } - None + Grandpa::forced_change(digest) } - fn grandpa_authorities() -> Vec<(AuthorityId, u64)> { + fn grandpa_authorities() -> Vec<(GrandpaId, GrandpaWeight)> { Grandpa::grandpa_authorities() } } - impl consensus_aura::AuraApi for Runtime { + impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { Aura::slot_duration() } - } - - impl consensus_authorities::AuthoritiesApi for Runtime { - fn authorities() -> Vec> { - Consensus::authorities() + fn authorities() -> Vec { + Aura::authorities() } } } diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index 050cbdcb7e..dcb7e8f26b 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -1484,7 +1484,6 @@ dependencies = [ "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", @@ -1501,7 +1500,6 @@ dependencies = [ "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", @@ -2425,7 +2423,9 @@ dependencies = [ "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -2442,20 +2442,6 @@ dependencies = [ "substrate-keyring 2.0.0", ] -[[package]] -name = "srml-consensus" -version = "2.0.0" -dependencies = [ - "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", - "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 = "2.0.0" @@ -2539,7 +2525,6 @@ dependencies = [ "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "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", @@ -2583,7 +2568,6 @@ dependencies = [ "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "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", @@ -2599,7 +2583,6 @@ dependencies = [ "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", @@ -2788,21 +2771,10 @@ dependencies = [ [[package]] name = "substrate-consensus-aura-primitives" version = "2.0.0" -dependencies = [ - "sr-primitives 2.0.0", - "substrate-client 2.0.0", -] - -[[package]] -name = "substrate-consensus-authorities" -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", ] @@ -2853,6 +2825,7 @@ name = "substrate-finality-grandpa-primitives" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index e0a99b7d16..ad6a1ec549 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -33,7 +33,8 @@ //! //! ### Terminology //! -//! * **Asset issuance:** The creation of a new asset, whose total supply will belong to the account that issues the asset. +//! * **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. @@ -45,7 +46,8 @@ //! //! * 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. +//! * Remove an account's balance of an asset when requested by that account's owner and update +//! the asset's total supply. //! //! ## Interface //! @@ -237,7 +239,7 @@ mod tests { use primitives::{ BuildStorage, traits::{BlakeTwo256, IdentityLookup}, - testing::{Digest, DigestItem, Header} + testing::Header }; impl_outer_origin! { @@ -255,12 +257,10 @@ mod tests { type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = (); - type Log = DigestItem; } impl Trait for Test { type Event = (); diff --git a/srml/aura/Cargo.toml b/srml/aura/Cargo.toml index 82027871b4..5624df7be6 100644 --- a/srml/aura/Cargo.toml +++ b/srml/aura/Cargo.toml @@ -10,18 +10,18 @@ serde = { version = "1.0", 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 } +substrate-primitives = { path = "../../core/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 } +substrate-consensus-aura-primitives = { path = "../../core/consensus/aura/primitives", default-features = false} [dev-dependencies] lazy_static = "1.0" parking_lot = "0.8.0" -substrate-primitives = { path = "../../core/primitives" } runtime_io = { package = "sr-io", path = "../../core/sr-io" } -consensus = { package = "srml-consensus", path = "../consensus" } [features] default = ["std"] @@ -31,8 +31,10 @@ std = [ "rstd/std", "srml-support/std", "primitives/std", + "substrate-primitives/std", "system/std", "timestamp/std", "staking/std", "inherents/std", + "substrate-consensus-aura-primitives/std", ] diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index 597618c142..43f2da88af 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -51,19 +51,18 @@ pub use timestamp; use rstd::{result, prelude::*}; -use parity_codec::{Encode, Decode}; -use srml_support::storage::StorageValue; -use srml_support::{decl_storage, decl_module}; -use primitives::traits::{SaturatedConversion, Saturating, Zero, One}; +use parity_codec::Encode; +use srml_support::{decl_storage, decl_module, Parameter, storage::StorageValue}; +use primitives::{traits::{SaturatedConversion, Saturating, Zero, One, Member}, generic::DigestItem}; use timestamp::OnTimestampSet; -use rstd::marker::PhantomData; #[cfg(feature = "std")] use timestamp::TimestampInherentData; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; +use substrate_consensus_aura_primitives::{AURA_ENGINE_ID, ConsensusLog}; #[cfg(feature = "std")] -use serde::Serialize; +use parity_codec::Decode; mod mock; mod tests; @@ -93,20 +92,6 @@ impl AuraInherentData for InherentData { } } -/// Logs in this module. -pub type Log = RawLog; - -/// Logs in this module. -/// -/// The type parameter distinguishes logs belonging to two different runtimes, -/// which should not be mixed. -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -#[derive(Encode, Decode, PartialEq, Eq, Clone)] -pub enum RawLog { - /// AuRa inherent digests - PreRuntime([u8; 4], Vec, PhantomData), -} - /// Provides the slot duration inherent data for `Aura`. #[cfg(feature = "std")] pub struct InherentDataProvider { @@ -166,12 +151,18 @@ impl HandleReport for () { pub trait Trait: timestamp::Trait { /// The logic for handling reports. type HandleReport: HandleReport; + + /// The identifier type for an authority. + type AuthorityId: Member + Parameter + Default; } decl_storage! { trait Store for Module as Aura { /// The last timestamp. LastTimestamp get(last) build(|_| 0.into()): T::Moment; + + /// The current authorities + pub Authorities get(authorities) config(): Vec; } } @@ -179,6 +170,37 @@ decl_module! { pub struct Module for enum Call where origin: T::Origin { } } +impl Module { + fn change_authorities(new: Vec) { + >::put(&new); + + let log: DigestItem = DigestItem::Consensus( + AURA_ENGINE_ID, + ConsensusLog::AuthoritiesChange(new).encode() + ); + >::deposit_log(log.into()); + } +} + +impl session::OneSessionHandler for Module { + type Key = T::AuthorityId; + fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + where I: Iterator + { + // instant changes + if changed { + let next_authorities = validators.map(|(_, k)| k).collect::>(); + let last_authorities = >::authorities(); + if next_authorities != last_authorities { + Self::change_authorities(next_authorities); + } + } + } + fn on_disabled(_i: usize) { + // ignore? + } +} + /// A report of skipped authorities in Aura. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] diff --git a/srml/aura/src/mock.rs b/srml/aura/src/mock.rs index e72e25ef94..e9c43850f6 100644 --- a/srml/aura/src/mock.rs +++ b/srml/aura/src/mock.rs @@ -18,11 +18,11 @@ #![cfg(test)] -use primitives::{BuildStorage, traits::IdentityLookup, testing::{Digest, DigestItem, Header, UintAuthorityId}}; +use primitives::{BuildStorage, traits::IdentityLookup, testing::{Header, UintAuthorityId}}; use srml_support::impl_outer_origin; use runtime_io; use substrate_primitives::{H256, Blake2Hasher}; -use crate::{Trait, Module}; +use crate::{Trait, Module, GenesisConfig}; impl_outer_origin!{ pub enum Origin for Test {} @@ -32,24 +32,16 @@ impl_outer_origin!{ #[derive(Clone, PartialEq, Eq, Debug)] pub struct Test; -impl consensus::Trait for Test { - type Log = DigestItem; - type SessionKey = UintAuthorityId; - type InherentOfflineReport = (); -} - impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; type Hashing = ::primitives::traits::BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = (); - type Log = DigestItem; } impl timestamp::Trait for Test { @@ -59,17 +51,17 @@ impl timestamp::Trait for Test { impl Trait for Test { type HandleReport = (); + type AuthorityId = UintAuthorityId; } pub fn new_test_ext(authorities: Vec) -> runtime_io::TestExternalities { let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(consensus::GenesisConfig::{ - code: vec![], - authorities: authorities.into_iter().map(|a| UintAuthorityId(a)).collect(), - }.build_storage().unwrap().0); t.extend(timestamp::GenesisConfig::{ minimum_period: 1, }.build_storage().unwrap().0); + t.extend(GenesisConfig::{ + authorities: authorities.into_iter().map(|a| UintAuthorityId(a)).collect(), + }.build_storage().unwrap().0); t.into() } diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml index 0f189dfcda..d961b724ff 100644 --- a/srml/babe/Cargo.toml +++ b/srml/babe/Cargo.toml @@ -14,7 +14,6 @@ primitives = { package = "sr-primitives", path = "../../core/sr-primitives", def 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 } @@ -23,7 +22,6 @@ lazy_static = "1.3.0" parking_lot = "0.8.0" substrate-primitives = { path = "../../core/primitives" } runtime_io = { package = "sr-io", path = "../../core/sr-io" } -consensus = { package = "srml-consensus", path = "../consensus" } [features] default = ["std"] @@ -35,7 +33,6 @@ 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 index e969dee74b..0cfc0fb8d0 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -20,18 +20,19 @@ #![forbid(unsafe_code)] pub use timestamp; -use rstd::{result, prelude::*, marker::PhantomData}; -use srml_support::{decl_storage, decl_module}; +use rstd::{result, prelude::*}; +use srml_support::{decl_storage, decl_module, StorageValue}; use timestamp::{OnTimestampSet, Trait}; -use primitives::traits::{SaturatedConversion, Saturating}; +use primitives::{generic::DigestItem, traits::{SaturatedConversion, Saturating}}; #[cfg(feature = "std")] use timestamp::TimestampInherentData; use parity_codec::{Encode, Decode}; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; -#[cfg(feature = "std")] -use serde::Serialize; +use babe_primitives::BABE_ENGINE_ID; + +pub use babe_primitives::AuthorityId; /// The BABE inherent identifier. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"babeslot"; @@ -58,20 +59,6 @@ impl BabeInherentData for InherentData { } } -/// Logs in this module. -pub type Log = RawLog; - -/// Logs in this module. -/// -/// The type parameter distinguishes logs belonging to two different runtimes, -/// which should not be mixed. -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -#[derive(Encode, Decode, PartialEq, Eq, Clone)] -pub enum RawLog { - /// BABE inherent digests - PreRuntime([u8; 4], Vec, PhantomData), -} - /// Provides the slot duration inherent data for BABE. #[cfg(feature = "std")] pub struct InherentDataProvider { @@ -121,8 +108,11 @@ impl ProvideInherentData for InherentDataProvider { decl_storage! { trait Store for Module as Babe { - // The last timestamp. + /// The last timestamp. LastTimestamp get(last): T::Moment; + + /// The current authorities set. + Authorities get(authorities): Vec; } } @@ -143,6 +133,34 @@ impl OnTimestampSet for Module { fn on_timestamp_set(_moment: T::Moment) { } } +impl Module { + fn change_authorities(new: Vec) { + >::put(&new); + + let log: DigestItem = DigestItem::Consensus(BABE_ENGINE_ID, new.encode()); + >::deposit_log(log.into()); + } +} + +impl session::OneSessionHandler for Module { + type Key = AuthorityId; + fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + where I: Iterator + { + // instant changes + if changed { + let next_authorities = validators.map(|(_, k)| k).collect::>(); + let last_authorities = >::authorities(); + if next_authorities != last_authorities { + Self::change_authorities(next_authorities); + } + } + } + fn on_disabled(_i: usize) { + // ignore? + } +} + impl ProvideInherent for Module { type Call = timestamp::Call; type Error = MakeFatalError; diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index c8f5c33d06..3c3762833b 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -675,12 +675,10 @@ impl, I: Instance> system::Trait for ElevatedTrait { type BlockNumber = T::BlockNumber; type Hash = T::Hash; type Hashing = T::Hashing; - type Digest = T::Digest; type AccountId = T::AccountId; type Lookup = T::Lookup; type Header = T::Header; type Event = (); - type Log = T::Log; } impl, I: Instance> Trait for ElevatedTrait { type Balance = T::Balance; diff --git a/srml/balances/src/mock.rs b/srml/balances/src/mock.rs index db20efc475..ac5208ab90 100644 --- a/srml/balances/src/mock.rs +++ b/srml/balances/src/mock.rs @@ -19,7 +19,7 @@ #![cfg(test)] use primitives::BuildStorage; -use primitives::{traits::{IdentityLookup}, testing::{Digest, DigestItem, Header}}; +use primitives::{traits::{IdentityLookup}, testing::Header}; use substrate_primitives::{H256, Blake2Hasher}; use runtime_io; use srml_support::impl_outer_origin; @@ -38,12 +38,10 @@ impl system::Trait for Runtime { type BlockNumber = u64; type Hash = H256; type Hashing = ::primitives::traits::BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = (); - type Log = DigestItem; } impl Trait for Runtime { type Balance = u64; diff --git a/srml/balances/src/tests.rs b/srml/balances/src/tests.rs index 89491fe5f8..0a5a4b5bb7 100644 --- a/srml/balances/src/tests.rs +++ b/srml/balances/src/tests.rs @@ -36,7 +36,10 @@ fn basic_locking_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).build(), || { assert_eq!(Balances::free_balance(&1), 10); Balances::set_lock(ID_1, &1, 9, u64::max_value(), WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 5), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 5), + "account liquidity restrictions prevent withdrawal" + ); }); } @@ -89,11 +92,20 @@ fn combination_locking_should_work() { fn lock_value_extension_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).build(), || { Balances::set_lock(ID_1, &1, 5, u64::max_value(), WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); Balances::extend_lock(ID_1, &1, 2, u64::max_value(), WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); Balances::extend_lock(ID_1, &1, 8, u64::max_value(), WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 3), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 3), + "account liquidity restrictions prevent withdrawal" + ); }); } @@ -101,19 +113,28 @@ fn lock_value_extension_should_work() { fn lock_reasons_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).transaction_fees(0, 1).build(), || { Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Transfer.into()); - assert_noop!(>::transfer(&1, &2, 1), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 1), + "account liquidity restrictions prevent withdrawal" + ); assert_ok!(>::reserve(&1, 1)); assert_ok!(>::make_payment(&1, 1)); Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Reserve.into()); assert_ok!(>::transfer(&1, &2, 1)); - assert_noop!(>::reserve(&1, 1), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::reserve(&1, 1), + "account liquidity restrictions prevent withdrawal" + ); assert_ok!(>::make_payment(&1, 1)); Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::TransactionPayment.into()); assert_ok!(>::transfer(&1, &2, 1)); assert_ok!(>::reserve(&1, 1)); - assert_noop!(>::make_payment(&1, 1), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::make_payment(&1, 1), + "account liquidity restrictions prevent withdrawal" + ); }); } @@ -121,7 +142,10 @@ fn lock_reasons_should_work() { fn lock_block_number_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).build(), || { Balances::set_lock(ID_1, &1, 10, 2, WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 1), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 1), + "account liquidity restrictions prevent withdrawal" + ); System::set_block_number(2); assert_ok!(>::transfer(&1, &2, 1)); @@ -132,12 +156,21 @@ fn lock_block_number_should_work() { fn lock_block_number_extension_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).build(), || { Balances::set_lock(ID_1, &1, 10, 2, WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); Balances::extend_lock(ID_1, &1, 10, 1, WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); System::set_block_number(2); Balances::extend_lock(ID_1, &1, 10, 8, WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 3), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 3), + "account liquidity restrictions prevent withdrawal" + ); }); } @@ -145,11 +178,20 @@ fn lock_block_number_extension_should_work() { fn lock_reasons_extension_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).build(), || { Balances::set_lock(ID_1, &1, 10, 10, WithdrawReason::Transfer.into()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); Balances::extend_lock(ID_1, &1, 10, 10, WithdrawReasons::none()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); Balances::extend_lock(ID_1, &1, 10, 10, WithdrawReason::Reserve.into()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); }); } diff --git a/srml/consensus/Cargo.toml b/srml/consensus/Cargo.toml deleted file mode 100644 index bcb16a825a..0000000000 --- a/srml/consensus/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -[package] -name = "srml-consensus" -version = "2.0.0" -authors = ["Parity Technologies "] -edition = "2018" - -[dependencies] -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 } -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 } - -[dev-dependencies] -runtime_io = { package = "sr-io", path = "../../core/sr-io" } - -[features] -default = ["std"] -std = [ - "serde", - "parity-codec/std", - "substrate-primitives/std", - "rstd/std", - "srml-support/std", - "primitives/std", - "system/std", - "inherents/std", -] diff --git a/srml/consensus/src/lib.rs b/srml/consensus/src/lib.rs deleted file mode 100644 index 4613981ec5..0000000000 --- a/srml/consensus/src/lib.rs +++ /dev/null @@ -1,438 +0,0 @@ -// 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 . - -//! # 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 -//! behavior among validators and logging changes in the validator authority set. -//! -//! ## Interface -//! -//! ### Dispatchable Functions -//! -//! - `report_misbehavior` - Report some misbehavior. The origin of this call must be signed. -//! - `note_offline` - Note that the previous block's validator missed its opportunity to propose a block. -//! The origin of this call must be an inherent. -//! - `remark` - Make some on-chain remark. The origin of this call must be signed. -//! - `set_heap_pages` - Set the number of pages in the WebAssembly environment's heap. -//! - `set_code` - Set the new code. -//! - `set_storage` - Set some items of storage. -//! -//! ### Public 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 -//! -//! ### Simple Code Snippet -//! -//! Set authorities: -//! -//! ``` -//! # 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: -//! -//! ``` -//! # use srml_consensus as consensus; -//! # use primitives::traits::Zero; -//! # use primitives::traits::OnFinalize; -//! # fn not_executed() { -//! >::on_finalize(T::BlockNumber::zero()); -//! # } -//! ``` -//! -//! ### Example from SRML -//! -//! In the staking module, the `consensus::OnOfflineReport` is implemented to monitor offline -//! reporting among validators: -//! -//! ``` -//! # 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 { -//! // Get validator from session module -//! // Process validator -//! } -//! } -//! } -//! ``` -//! -//! 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): -//! -//! ``` -//! # 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 -//! reporting among validators. -//! - [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, -//! it has a mode where it can track `consensus`, if desired. -//! -//! ## 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` -//! to create and check inherents. - -#![cfg_attr(not(feature = "std"), no_std)] - -#[cfg(feature = "std")] -use serde::Serialize; -use rstd::prelude::*; -use parity_codec as codec; -use codec::{Encode, Decode}; -use srml_support::{storage, Parameter, decl_storage, decl_module}; -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_none}; -use inherents::{ - ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError -}; - -#[cfg(any(feature = "std", test))] -use substrate_primitives::sr25519::Public as AuthorityId; - -mod mock; -mod tests; - -/// The identifier for consensus inherents. -pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"offlrep0"; - -/// The error type used by this inherent. -pub type InherentError = RuntimeString; - -struct AuthorityStorageVec(rstd::marker::PhantomData); -impl StorageVec for AuthorityStorageVec { - type Item = S; - const PREFIX: &'static [u8] = well_known_keys::AUTHORITY_PREFIX; -} - -pub type Key = Vec; -pub type KeyValue = (Vec, Vec); - -/// Handling offline validator reports in a generic way. -pub trait OnOfflineReport { - fn handle_report(offline: Offline); -} - -impl OnOfflineReport for () { - fn handle_report(_: T) {} -} - -/// Describes the offline-reporting extrinsic. -pub trait InherentOfflineReport { - /// The report data type passed to the runtime during block authorship. - type Inherent: codec::Codec + Parameter; - - /// Whether an inherent is empty and doesn't need to be included. - fn is_empty(inherent: &Self::Inherent) -> bool; - - /// Handle the report. - fn handle_report(report: Self::Inherent); - - /// Whether two reports are compatible. - fn check_inherent(contained: &Self::Inherent, expected: &Self::Inherent) -> Result<(), &'static str>; -} - -impl InherentOfflineReport for () { - type Inherent = (); - - fn is_empty(_inherent: &()) -> bool { true } - fn handle_report(_: ()) { } - fn check_inherent(_: &(), _: &()) -> Result<(), &'static str> { - Err("Explicit reporting not allowed") - } -} - -/// A variant of the `OfflineReport` that is useful for instant-finality blocks. -/// -/// This assumes blocks are only finalized. -pub struct InstantFinalityReportVec(::rstd::marker::PhantomData); - -impl>> InherentOfflineReport for InstantFinalityReportVec { - type Inherent = Vec; - - fn is_empty(inherent: &Self::Inherent) -> bool { inherent.is_empty() } - - fn handle_report(report: Vec) { - T::handle_report(report) - } - - fn check_inherent(contained: &Self::Inherent, expected: &Self::Inherent) -> Result<(), &'static str> { - contained.iter().try_for_each(|n| - if !expected.contains(n) { - Err("Node we believe online marked offline") - } else { - Ok(()) - } - ) - } -} - -/// Logs in this module. -pub type Log = RawLog< - ::SessionKey, ->; - -/// Logs in this module. -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -#[derive(Encode, Decode, PartialEq, Eq, Clone)] -pub enum RawLog { - /// Authorities set has been changed. Contains the new set of authorities. - AuthoritiesChange(Vec), -} - -impl RawLog { - /// Try to cast the log entry as AuthoritiesChange log entry. - pub fn as_authorities_change(&self) -> Option<&[SessionKey]> { - match *self { - RawLog::AuthoritiesChange(ref item) => Some(item), - } - } -} - -// Implementation for tests outside of this crate. -#[cfg(any(feature = "std", test))] -impl From> for primitives::testing::DigestItem where N: Into { - fn from(log: RawLog) -> primitives::testing::DigestItem { - match log { - RawLog::AuthoritiesChange(authorities) => - primitives::generic::DigestItem::AuthoritiesChange( - authorities.into_iter() - .map(Into::into).collect()), - } - } -} - -pub trait Trait: system::Trait { - /// Type for all log entries of this module. - type Log: From> + Into>; - - type SessionKey: Parameter + Default + MaybeSerializeDebug; - /// Defines the offline-report type of the trait. - /// Set to `()` if offline-reports aren't needed for this runtime. - type InherentOfflineReport: InherentOfflineReport; -} - -decl_storage! { - trait Store for Module as Consensus { - // Actual authorities set at the block execution start. Is `Some` iff - // the set has been changed. - OriginalAuthorities: Option>; - } - add_extra_genesis { - config(authorities): Vec; - #[serde(with = "substrate_primitives::bytes")] - config(code): Vec; - - build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| { - use codec::{Encode, KeyedVec}; - - let auth_count = config.authorities.len() as u32; - config.authorities.iter().enumerate().for_each(|(i, v)| { - storage.insert((i as u32).to_keyed_vec(well_known_keys::AUTHORITY_PREFIX), v.encode()); - }); - storage.insert(well_known_keys::AUTHORITY_COUNT.to_vec(), auth_count.encode()); - storage.insert(well_known_keys::CODE.to_vec(), config.code.clone()); - }); - } -} - -decl_module! { - pub struct Module for enum Call where origin: T::Origin { - /// Report some misbehavior. - fn report_misbehavior(origin, _report: Vec) { - ensure_signed(origin)?; - } - - /// Note that the previous block's validator missed its opportunity to propose a block. - fn note_offline(origin, offline: ::Inherent) { - ensure_none(origin)?; - - T::InherentOfflineReport::handle_report(offline); - } - - /// Make some on-chain remark. - fn remark(origin, _remark: Vec) { - ensure_signed(origin)?; - } - - /// Set the number of pages in the WebAssembly environment's heap. - fn set_heap_pages(pages: u64) { - storage::unhashed::put_raw(well_known_keys::HEAP_PAGES, &pages.encode()); - } - - /// Set the new code. - pub fn set_code(new: Vec) { - storage::unhashed::put_raw(well_known_keys::CODE, &new); - } - - /// Set some items of storage. - fn set_storage(items: Vec) { - for i in &items { - storage::unhashed::put_raw(&i.0, &i.1); - } - } - - /// Kill some items from storage. - fn kill_storage(keys: Vec) { - for key in &keys { - storage::unhashed::kill(&key); - } - } - - fn on_finalize() { - if let Some(original_authorities) = >::take() { - let current_authorities = AuthorityStorageVec::::items(); - if current_authorities != original_authorities { - Self::deposit_log(RawLog::AuthoritiesChange(current_authorities)); - } - } - } - } -} - -impl Module { - /// Get the current set of authorities. These are the session keys. - pub fn authorities() -> Vec { - AuthorityStorageVec::::items() - } - - /// 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]) { - let current_authorities = AuthorityStorageVec::::items(); - if current_authorities != authorities { - Self::save_original_authorities(Some(current_authorities)); - AuthorityStorageVec::::set_items(authorities); - } - } - - /// Set the total number of authorities. - pub fn set_authority_count(count: u32) { - Self::save_original_authorities(None); - AuthorityStorageVec::::set_count(count); - } - - /// Set a single authority by index. - pub fn set_authority(index: u32, key: &T::SessionKey) { - let current_authority = AuthorityStorageVec::::item(index); - if current_authority != *key { - Self::save_original_authorities(None); - AuthorityStorageVec::::set_item(index, key); - } - } - - /// Save original authorities set. - fn save_original_authorities(current_authorities: Option>) { - if OriginalAuthorities::::get().is_some() { - // if we have already saved original set before, do not overwrite - return; - } - - >::put(current_authorities.unwrap_or_else(|| - AuthorityStorageVec::::items())); - } - - /// Deposit one of this module's logs. - fn deposit_log(log: Log) { - >::deposit_log(::Log::from(log).into()); - } -} - -/// Implementing `ProvideInherent` enables this module to create and check inherents. -impl ProvideInherent for Module { - /// The call type of the module. - type Call = Call; - /// The error returned by `check_inherent`. - type Error = MakeFatalError; - /// The inherent identifier used by this inherent. - const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; - - /// Creates an inherent from the `InherentData`. - fn create_inherent(data: &InherentData) -> Option { - if let Ok(Some(data)) = - data.get_data::<::Inherent>( - &INHERENT_IDENTIFIER - ) - { - if ::is_empty(&data) { - None - } else { - Some(Call::note_offline(data)) - } - } else { - None - } - } - - /// Verify the validity of the given inherent. - fn check_inherent(call: &Self::Call, data: &InherentData) -> Result<(), Self::Error> { - let offline = match call { - Call::note_offline(ref offline) => offline, - _ => return Ok(()), - }; - - let expected = data - .get_data::<::Inherent>(&INHERENT_IDENTIFIER)? - .ok_or(RuntimeString::from("No `offline_report` found in the inherent data!"))?; - - ::check_inherent( - &offline, &expected - ).map_err(|e| RuntimeString::from(e).into()) - } -} diff --git a/srml/consensus/src/mock.rs b/srml/consensus/src/mock.rs deleted file mode 100644 index 85e6dc3654..0000000000 --- a/srml/consensus/src/mock.rs +++ /dev/null @@ -1,63 +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 . - -//! Test utilities - -#![cfg(test)] - -use primitives::{BuildStorage, traits::IdentityLookup, testing::{Digest, DigestItem, Header, UintAuthorityId}}; -use srml_support::impl_outer_origin; -use runtime_io; -use substrate_primitives::{H256, Blake2Hasher}; -use crate::{GenesisConfig, Trait, Module}; - -impl_outer_origin!{ - pub enum Origin for Test {} -} - -// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. -#[derive(Clone, PartialEq, Eq, Debug)] -pub struct Test; -impl Trait for Test { - type Log = DigestItem; - type SessionKey = UintAuthorityId; - type InherentOfflineReport = crate::InstantFinalityReportVec<()>; -} -impl system::Trait for Test { - type Origin = Origin; - type Index = u64; - type BlockNumber = u64; - type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; - type Digest = Digest; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type Event = (); - type Log = DigestItem; -} - -pub fn new_test_ext(authorities: Vec) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(GenesisConfig::{ - code: vec![], - authorities: authorities.into_iter().map(|a| UintAuthorityId(a)).collect(), - }.build_storage().unwrap().0); - t.into() -} - -pub type System = system::Module; -pub type Consensus = Module; diff --git a/srml/consensus/src/tests.rs b/srml/consensus/src/tests.rs deleted file mode 100644 index 471cdf4979..0000000000 --- a/srml/consensus/src/tests.rs +++ /dev/null @@ -1,131 +0,0 @@ -// 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 . - -//! Tests for the module. - -#![cfg(test)] - -use primitives::{generic, testing::{self, UintAuthorityId}, traits::OnFinalize}; -use runtime_io::with_externalities; -use crate::mock::{Consensus, System, new_test_ext}; -use inherents::{InherentData, ProvideInherent}; - -#[test] -fn authorities_change_logged() { - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); - Consensus::set_authorities(&[UintAuthorityId(4), UintAuthorityId(5), UintAuthorityId(6)]); - Consensus::on_finalize(1); - let header = System::finalize(); - assert_eq!(header.digest, testing::Digest { - logs: vec![ - generic::DigestItem::AuthoritiesChange( - vec![ - UintAuthorityId(4).into(), - UintAuthorityId(5).into(), - UintAuthorityId(6).into() - ] - ), - ], - }); - }); -} - -#[test] -fn partial_authorities_change_logged() { - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&2, &Default::default(), &Default::default(), &Default::default()); - Consensus::set_authorities(&[UintAuthorityId(2), UintAuthorityId(4), UintAuthorityId(5)]); - Consensus::on_finalize(2); - let header = System::finalize(); - assert_eq!(header.digest, testing::Digest { - logs: vec![ - generic::DigestItem::AuthoritiesChange( - vec![ - UintAuthorityId(2).into(), - UintAuthorityId(4).into(), - UintAuthorityId(5).into() - ] - ), - ], - }); - }); -} - -#[test] -fn authorities_change_is_not_logged_when_not_changed() { - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); - Consensus::on_finalize(1); - let header = System::finalize(); - assert_eq!(header.digest, testing::Digest { - logs: vec![], - }); - }); -} - -#[test] -fn authorities_change_is_not_logged_when_changed_back_to_original() { - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); - Consensus::set_authorities(&[UintAuthorityId(4), UintAuthorityId(5), UintAuthorityId(6)]); - Consensus::set_authorities(&[UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]); - Consensus::on_finalize(1); - let header = System::finalize(); - assert_eq!(header.digest, testing::Digest { - logs: vec![], - }); - }); -} - -#[test] -fn offline_report_can_be_excluded() { - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); - assert!(Consensus::create_inherent(&InherentData::new()).is_none()); - - let offline_report: Vec = vec![0]; - let mut data = InherentData::new(); - data.put_data(super::INHERENT_IDENTIFIER, &offline_report).unwrap(); - - assert!(Consensus::create_inherent(&data).is_some()); - }); -} - -#[test] -fn set_and_kill_storage_work() { - use srml_support::storage; - - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); - - let item = (vec![42u8], vec![42u8]); - - Consensus::set_storage(vec![item.clone()]).unwrap(); - - assert_eq!( - storage::unhashed::get_raw(&item.0), - Some(item.1), - ); - - Consensus::kill_storage(vec![item.0.clone()]).unwrap(); - - assert_eq!( - storage::unhashed::get_raw(&item.0), - None, - ); - }); -} diff --git a/srml/contract/Cargo.toml b/srml/contract/Cargo.toml index 7c04758171..8d3507db35 100644 --- a/srml/contract/Cargo.toml +++ b/srml/contract/Cargo.toml @@ -23,7 +23,6 @@ timestamp = { package = "srml-timestamp", path = "../timestamp", default-feature wabt = "~0.7.4" assert_matches = "1.1" hex-literal = "0.2.0" -consensus = { package = "srml-consensus", path = "../consensus" } balances = { package = "srml-balances", path = "../balances" } hex = "0.3" diff --git a/srml/contract/src/lib.rs b/srml/contract/src/lib.rs index 0111ce7840..b9c8976cc0 100644 --- a/srml/contract/src/lib.rs +++ b/srml/contract/src/lib.rs @@ -216,7 +216,8 @@ pub struct RawTombstoneContractInfo(H, PhantomData); impl RawTombstoneContractInfo where - H: Member + MaybeSerializeDebug + AsRef<[u8]> + AsMut<[u8]> + Copy + Default + rstd::hash::Hash, + H: Member + MaybeSerializeDebug + AsRef<[u8]> + AsMut<[u8]> + Copy + Default + rstd::hash::Hash + + Codec, Hasher: Hash, { fn new(storage_root: &[u8], code_hash: H) -> Self { diff --git a/srml/contract/src/tests.rs b/srml/contract/src/tests.rs index 7a19fdb1d6..61a81a4eb6 100644 --- a/srml/contract/src/tests.rs +++ b/srml/contract/src/tests.rs @@ -40,7 +40,7 @@ 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}; +use {balances, wabt}; mod contract { // Re-export contents of the root. This basically @@ -72,12 +72,10 @@ impl system::Trait for Test { type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = MetaEvent; - type Log = DigestItem; } impl balances::Trait for Test { type Balance = u64; @@ -92,11 +90,6 @@ impl timestamp::Trait for Test { type Moment = u64; type OnTimestampSet = (); } -impl consensus::Trait for Test { - type Log = DigestItem; - type SessionKey = UintAuthorityId; - type InherentOfflineReport = (); -} impl Trait for Test { type Currency = Balances; type Call = Call; @@ -1002,7 +995,8 @@ const CODE_CHECK_DEFAULT_RENT_ALLOWANCE: &str = r#" ) ) "#; -const HASH_CHECK_DEFAULT_RENT_ALLOWANCE: [u8; 32] = hex!("4f9ec2b94eea522cfff10b77ef4056c631045c00978a457d283950521ecf07b6"); +const HASH_CHECK_DEFAULT_RENT_ALLOWANCE: [u8; 32] = + hex!("4f9ec2b94eea522cfff10b77ef4056c631045c00978a457d283950521ecf07b6"); #[test] fn default_rent_allowance_on_create() { diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index fd69805732..681bc731be 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -73,12 +73,10 @@ mod tests { 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 balances::Trait for Test { type Balance = u64; diff --git a/srml/council/src/motions.rs b/srml/council/src/motions.rs index 8f31ee582f..a53752d71f 100644 --- a/srml/council/src/motions.rs +++ b/srml/council/src/motions.rs @@ -397,7 +397,12 @@ 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![], } ]); @@ -409,7 +414,10 @@ mod tests { with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); - assert_noop!(CouncilMotions::propose(Origin::signed(42), 3, Box::new(proposal.clone())), "proposer not on council"); + assert_noop!( + CouncilMotions::propose(Origin::signed(42), 3, Box::new(proposal.clone())), + "proposer not on council" + ); }); } @@ -457,12 +465,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(1, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 0, 1)), + event: OuterEvent::motions(RawEvent::Voted( + 1, + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + false, + 0, + 1, + )), topics: vec![], } ]); @@ -481,17 +500,31 @@ 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![], } ]); @@ -510,22 +543,38 @@ 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/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 6af6798b13..0fead411c8 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -919,7 +919,7 @@ mod tests { use substrate_primitives::{H256, Blake2Hasher}; use primitives::BuildStorage; use primitives::traits::{BlakeTwo256, IdentityLookup, Bounded}; - use primitives::testing::{Digest, DigestItem, Header}; + use primitives::testing::Header; use balances::BalanceLock; use system::EnsureSignedBy; @@ -948,12 +948,10 @@ mod tests { type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = (); - type Log = DigestItem; } impl balances::Trait for Test { type Balance = u64; diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index be441a3e57..dd14b7198a 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -27,27 +27,30 @@ //! //! //!

//! //! ### 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. +//! 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
 //!
@@ -196,7 +199,8 @@
 //!
 //! \## Usage
 //!
-//! // Insert 2-3 examples of usage and code snippets that show how to use  module in a custom module.
+//! // Insert 2-3 examples of usage and code snippets that show how to
+//! // use  module in a custom module.
 //!
 //! \### Prerequisites
 //!
@@ -324,8 +328,10 @@ decl_event!(
 // - Public calls that are signed by an external account.
 // - Root calls that are allowed to be made only by the governance system.
 // - 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.
+//   * "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:
@@ -505,7 +511,7 @@ mod tests {
 	// or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried.
 	use sr_primitives::{
 		BuildStorage, traits::{BlakeTwo256, OnInitialize, OnFinalize, IdentityLookup},
-		testing::{Digest, DigestItem, Header}
+		testing::Header
 	};
 
 	impl_outer_origin! {
@@ -523,12 +529,10 @@ mod tests {
 		type BlockNumber = u64;
 		type Hash = H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = ();
-		type Log = DigestItem;
 	}
 	impl balances::Trait for Test {
 		type Balance = u64;
diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs
index 3707716183..f4299abe47 100644
--- a/srml/executive/src/lib.rs
+++ b/srml/executive/src/lib.rs
@@ -77,17 +77,17 @@
 use rstd::prelude::*;
 use rstd::marker::PhantomData;
 use rstd::result;
-use primitives::traits::{
+use primitives::{generic::Digest, traits::{
 	self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalize,
-	OnInitialize, Digest, NumberFor, Block as BlockT, OffchainWorker,
-	ValidateUnsigned, DigestItem,
-};
-use primitives::weights::Weighable;
-use primitives::{ApplyOutcome, ApplyError};
-use primitives::transaction_validity::{TransactionValidity, TransactionPriority, TransactionLongevity};
+	OnInitialize, NumberFor, Block as BlockT, OffchainWorker,
+	ValidateUnsigned,
+}};
 use srml_support::{Dispatchable, traits::MakePayment};
 use parity_codec::{Codec, Encode};
-use system::extrinsics_root;
+use system::{extrinsics_root, DigestOf};
+use primitives::{ApplyOutcome, ApplyError};
+use primitives::transaction_validity::{TransactionValidity, TransactionPriority, TransactionLongevity};
+use primitives::weights::Weighable;
 
 mod internal {
 	pub const MAX_TRANSACTIONS_WEIGHT: u32 = 4 * 1024 * 1024;
@@ -112,6 +112,10 @@ pub trait ExecuteBlock {
 	fn execute_block(block: Block);
 }
 
+pub type CheckedOf = >::Checked;
+pub type CallOf =  as Applyable>::Call;
+pub type OriginOf =  as Dispatchable>::Origin;
+
 pub struct Executive(
 	PhantomData<(System, Block, Context, Payment, UnsignedValidator, AllModules)>
 );
@@ -126,12 +130,10 @@ impl<
 > ExecuteBlock for Executive
 where
 	Block::Extrinsic: Checkable + Codec,
-	>::Checked:
-		Applyable + Weighable,
-	<>::Checked as Applyable>::Call: Dispatchable,
-	<<>::Checked as Applyable>::Call as Dispatchable>::Origin:
-		From>,
-	UnsignedValidator: ValidateUnsigned>::Checked as Applyable>::Call>
+	CheckedOf: Applyable + Weighable,
+	CallOf: Dispatchable,
+	OriginOf: From>,
+	UnsignedValidator: ValidateUnsigned>,
 {
 	fn execute_block(block: Block) {
 		Executive::::execute_block(block);
@@ -148,16 +150,14 @@ impl<
 > Executive
 where
 	Block::Extrinsic: Checkable + Codec,
-	>::Checked:
-		Applyable + Weighable,
-	<>::Checked as Applyable>::Call: Dispatchable,
-	<<>::Checked as Applyable>::Call as Dispatchable>::Origin:
-		From>,
-	UnsignedValidator: ValidateUnsigned>::Checked as Applyable>::Call>
+	CheckedOf: Applyable + Weighable,
+	CallOf: Dispatchable,
+	OriginOf: From>,
+	UnsignedValidator: ValidateUnsigned>,
 {
 	/// Start the execution of a particular block.
 	pub fn initialize_block(header: &System::Header) {
-		let mut digests = System::Digest::default();
+		let mut digests = >::default();
 		header.digest().logs().iter().for_each(|d| if d.as_pre_runtime().is_some() { digests.push(d.clone()) });
 		Self::initialize_block_impl(header.number(), header.parent_hash(), header.extrinsics_root(), &digests);
 	}
@@ -166,7 +166,7 @@ where
 		block_number: &System::BlockNumber,
 		parent_hash: &System::Hash,
 		extrinsics_root: &System::Hash,
-		digest: &System::Digest
+		digest: &Digest,
 	) {
 		>::initialize(block_number, parent_hash, extrinsics_root, digest);
 		>::on_initialize(*block_number);
@@ -259,7 +259,7 @@ where
 	fn apply_extrinsic_with_len(
 		uxt: Block::Extrinsic,
 		encoded_len: usize,
-		to_note: Option>
+		to_note: Option>,
 	) -> result::Result {
 		// Verify that the signature is good.
 		let xt = uxt.check(&Default::default()).map_err(internal::ApplyError::BadSignature)?;
@@ -397,7 +397,7 @@ mod tests {
 	use substrate_primitives::{H256, Blake2Hasher};
 	use primitives::BuildStorage;
 	use primitives::traits::{Header as HeaderT, BlakeTwo256, IdentityLookup};
-	use primitives::testing::{Digest, DigestItem, Header, Block};
+	use primitives::testing::{Digest, Header, Block};
 	use srml_support::{traits::Currency, impl_outer_origin, impl_outer_event};
 	use system;
 	use hex_literal::hex;
@@ -422,12 +422,10 @@ mod tests {
 		type BlockNumber = u64;
 		type Hash = substrate_primitives::H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = MetaEvent;
-		type Log = DigestItem;
 	}
 	impl balances::Trait for Runtime {
 		type Balance = u64;
@@ -457,7 +455,14 @@ mod tests {
 	}
 
 	type TestXt = primitives::testing::TestXt>;
-	type Executive = super::Executive, system::ChainContext, balances::Module, Runtime, ()>;
+	type Executive = super::Executive<
+		Runtime,
+		Block,
+		system::ChainContext,
+		balances::Module,
+		Runtime,
+		()
+	>;
 
 	#[test]
 	fn balance_transfer_dispatch_works() {
@@ -474,8 +479,13 @@ mod tests {
 		let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2, 69));
 		let mut t = runtime_io::TestExternalities::::new(t);
 		with_externalities(&mut t, || {
-			Executive::initialize_block(&Header::new(1, H256::default(), H256::default(),
-				[69u8; 32].into(), Digest::default()));
+			Executive::initialize_block(&Header::new(
+				1,
+				H256::default(),
+				H256::default(),
+				[69u8; 32].into(),
+				Digest::default(),
+			));
 			Executive::apply_extrinsic(xt).unwrap();
 			assert_eq!(>::total_balance(&1), 32);
 			assert_eq!(>::total_balance(&2), 69);
@@ -543,7 +553,13 @@ mod tests {
 		let mut t = new_test_ext();
 		let xt = primitives::testing::TestXt(Some(1), 42, Call::transfer(33, 69));
 		with_externalities(&mut t, || {
-			Executive::initialize_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default()));
+			Executive::initialize_block(&Header::new(
+				1,
+				H256::default(),
+				H256::default(),
+				[69u8; 32].into(),
+				Digest::default(),
+			));
 			assert!(Executive::apply_extrinsic(xt).is_err());
 			assert_eq!(>::extrinsic_index(), Some(0));
 		});
@@ -558,7 +574,13 @@ mod tests {
 			let encoded = xt2.encode();
 			let len = if should_fail { (internal::MAX_TRANSACTIONS_WEIGHT - 1) as usize } else { encoded.len() };
 			with_externalities(&mut t, || {
-				Executive::initialize_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default()));
+				Executive::initialize_block(&Header::new(
+					1,
+					H256::default(),
+					H256::default(),
+					[69u8; 32].into(),
+					Digest::default(),
+				));
 				assert_eq!(>::all_extrinsics_weight(), 0);
 
 				Executive::apply_extrinsic(xt).unwrap();
diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs
index 9e83198502..6442fee543 100644
--- a/srml/finality-tracker/src/lib.rs
+++ b/srml/finality-tracker/src/lib.rs
@@ -202,7 +202,7 @@ impl Module {
 			let delay = latency + (window_size / two);
 			// median may be at most n - delay
 			if median + delay <= now {
-				T::OnFinalizationStalled::on_stalled(window_size - T::BlockNumber::one());
+				T::OnFinalizationStalled::on_stalled(window_size - T::BlockNumber::one(), median);
 			}
 		}
 	}
@@ -212,20 +212,20 @@ impl Module {
 pub trait OnFinalizationStalled {
 	/// The parameter here is how many more blocks to wait before applying
 	/// changes triggered by finality stalling.
-	fn on_stalled(further_wait: N);
+	fn on_stalled(further_wait: N, median: N);
 }
 
 macro_rules! impl_on_stalled {
 	() => (
 		impl OnFinalizationStalled for () {
-			fn on_stalled(_: N) {}
+			fn on_stalled(_: N, _: N) {}
 		}
 	);
 
 	( $($t:ident)* ) => {
 		impl),*> OnFinalizationStalled for ($($t,)*) {
-			fn on_stalled(further_wait: NUM) {
-				$($t::on_stalled(further_wait.clone());)*
+			fn on_stalled(further_wait: NUM, median: NUM) {
+				$($t::on_stalled(further_wait.clone(), median.clone());)*
 			}
 		}
 	}
@@ -263,7 +263,7 @@ mod tests {
 	use substrate_primitives::H256;
 	use primitives::BuildStorage;
 	use primitives::traits::{BlakeTwo256, IdentityLookup, OnFinalize, Header as HeaderT};
-	use primitives::testing::{Digest, DigestItem, Header};
+	use primitives::testing::Header;
 	use srml_support::impl_outer_origin;
 	use srml_system as system;
 	use lazy_static::lazy_static;
@@ -290,12 +290,10 @@ mod tests {
 				type BlockNumber = u64;
 				type Hash = H256;
 				type Hashing = BlakeTwo256;
-				type Digest = Digest;
 				type AccountId = u64;
 				type Lookup = IdentityLookup;
 				type Header = Header;
 				type Event = ();
-				type Log = DigestItem;
 			}
 
 			type System = system::Module;
@@ -306,7 +304,7 @@ mod tests {
 
 			pub struct StallTracker;
 			impl OnFinalizationStalled for StallTracker {
-				fn on_stalled(further_wait: u64) {
+				fn on_stalled(further_wait: u64, _median: u64) {
 					let now = System::block_number();
 					NOTIFICATIONS.lock().push(StallEvent { at: now, further_wait });
 				}
diff --git a/srml/grandpa/Cargo.toml b/srml/grandpa/Cargo.toml
index 7855019af8..9e61029f72 100644
--- a/srml/grandpa/Cargo.toml
+++ b/srml/grandpa/Cargo.toml
@@ -14,7 +14,6 @@ primitives = { package = "sr-primitives", path = "../../core/sr-primitives", def
 srml-support = { path = "../support", default-features = false }
 system = { package = "srml-system", path = "../system", default-features = false }
 session = { package = "srml-session", path = "../session", default-features = false }
-consensus = { package = "srml-consensus", path = "../consensus", default-features = false }
 finality-tracker = { package = "srml-finality-tracker", path = "../finality-tracker", default-features = false }
 
 [dev-dependencies]
@@ -31,7 +30,6 @@ std = [
 	"srml-support/std",
 	"primitives/std",
 	"system/std",
-	"consensus/std",
 	"session/std",
 	"finality-tracker/std",
 ]
diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs
index 5425ace8bb..61610e9194 100644
--- a/srml/grandpa/src/lib.rs
+++ b/srml/grandpa/src/lib.rs
@@ -33,136 +33,84 @@ pub use substrate_finality_grandpa_primitives as fg_primitives;
 #[cfg(feature = "std")]
 use serde::Serialize;
 use rstd::prelude::*;
-use parity_codec as codec;
-use codec::{Encode, Decode};
-use fg_primitives::ScheduledChange;
-use srml_support::{Parameter, decl_event, decl_storage, decl_module};
-use srml_support::dispatch::Result;
-use srml_support::storage::StorageValue;
-use srml_support::storage::unhashed::StorageVec;
-use primitives::traits::CurrentHeight;
-use substrate_primitives::ed25519;
-use system::ensure_signed;
-use primitives::traits::MaybeSerializeDebug;
-use ed25519::Public as AuthorityId;
+use parity_codec::{self as codec, Encode, Decode};
+use srml_support::{
+	decl_event, decl_storage, decl_module, dispatch::Result, storage::StorageValue
+};
+use primitives::{
+	generic::{DigestItem, OpaqueDigestItemId}, traits::CurrentHeight
+};
+use fg_primitives::{ScheduledChange, GRANDPA_ENGINE_ID};
+pub use fg_primitives::{AuthorityId, AuthorityWeight};
+use system::{ensure_signed, DigestOf};
 
 mod mock;
 mod tests;
 
-struct AuthorityStorageVec(rstd::marker::PhantomData);
-impl StorageVec for AuthorityStorageVec {
-	type Item = (S, u64);
-	const PREFIX: &'static [u8] = crate::fg_primitives::well_known_keys::AUTHORITY_PREFIX;
-}
-
-/// The log type of this crate, projected from module trait type.
-pub type Log = RawLog<
-	::BlockNumber,
-	::SessionKey,
->;
-
-/// Logs which can be scanned by GRANDPA for authorities change events.
-pub trait GrandpaChangeSignal {
-	/// Try to cast the log entry as a contained signal.
-	fn as_signal(&self) -> Option>;
-	/// Try to cast the log entry as a contained forced signal.
-	fn as_forced_signal(&self) -> Option<(N, ScheduledChange)>;
-}
-
-/// A logs in this module.
+/// Consensus log type of this module.
 #[cfg_attr(feature = "std", derive(Serialize, Debug))]
 #[derive(Encode, Decode, PartialEq, Eq, Clone)]
-pub enum RawLog {
+pub enum Signal {
 	/// Authorities set change has been signaled. Contains the new set of authorities
 	/// and the delay in blocks _to finalize_ before applying.
-	AuthoritiesChangeSignal(N, Vec<(SessionKey, u64)>),
+	AuthoritiesChange(ScheduledChange),
 	/// A forced authorities set change. Contains in this order: the median last
 	/// finalized block when the change was signaled, the delay in blocks _to import_
 	/// before applying and the new set of authorities.
-	ForcedAuthoritiesChangeSignal(N, N, Vec<(SessionKey, u64)>),
+	ForcedAuthoritiesChange(N, ScheduledChange),
 }
 
-impl RawLog {
+impl Signal {
 	/// Try to cast the log entry as a contained signal.
-	pub fn as_signal(&self) -> Option<(N, &[(SessionKey, u64)])> {
-		match *self {
-			RawLog::AuthoritiesChangeSignal(ref delay, ref signal) => Some((delay.clone(), signal)),
-			RawLog::ForcedAuthoritiesChangeSignal(_, _, _) => None,
+	pub fn try_into_change(self) -> Option> {
+		match self {
+			Signal::AuthoritiesChange(change) => Some(change),
+			Signal::ForcedAuthoritiesChange(_, _) => None,
 		}
 	}
 
 	/// Try to cast the log entry as a contained forced signal.
-	pub fn as_forced_signal(&self) -> Option<(N, N, &[(SessionKey, u64)])> {
-		match *self {
-			RawLog::ForcedAuthoritiesChangeSignal(ref median, ref delay, ref signal) => Some((median.clone(), delay.clone(), signal)),
-			RawLog::AuthoritiesChangeSignal(_, _) => None,
+	pub fn try_into_forced_change(self) -> Option<(N, ScheduledChange)> {
+		match self {
+			Signal::ForcedAuthoritiesChange(median, change) => Some((median, change)),
+			Signal::AuthoritiesChange(_) => None,
 		}
 	}
 }
 
-impl GrandpaChangeSignal for RawLog
-	where N: Clone, SessionKey: Clone + Into,
-{
-	fn as_signal(&self) -> Option> {
-		RawLog::as_signal(self).map(|(delay, next_authorities)| ScheduledChange {
-			delay,
-			next_authorities: next_authorities.iter()
-				.cloned()
-				.map(|(k, w)| (k.into(), w))
-				.collect(),
-		})
-	}
-
-	fn as_forced_signal(&self) -> Option<(N, ScheduledChange)> {
-		RawLog::as_forced_signal(self).map(|(median, delay, next_authorities)| (median, ScheduledChange {
-			delay,
-			next_authorities: next_authorities.iter()
-				.cloned()
-				.map(|(k, w)| (k.into(), w))
-				.collect(),
-		}))
-	}
-}
-
 pub trait Trait: system::Trait {
-	/// Type for all log entries of this module.
-	type Log: From> + Into>;
-
-	/// The session key type used by authorities.
-	type SessionKey: Parameter + Default + MaybeSerializeDebug;
-
 	/// The event type of this module.
-	type Event: From> + Into<::Event>;
+	type Event: From + Into<::Event>;
 }
 
 /// A stored pending change, old format.
 // TODO: remove shim
 // https://github.com/paritytech/substrate/issues/1614
 #[derive(Encode, Decode)]
-pub struct OldStoredPendingChange {
+pub struct OldStoredPendingChange {
 	/// The block number this was scheduled at.
 	pub scheduled_at: N,
 	/// The delay in blocks until it will be applied.
 	pub delay: N,
 	/// The next authority set.
-	pub next_authorities: Vec<(SessionKey, u64)>,
+	pub next_authorities: Vec<(AuthorityId, u64)>,
 }
 
 /// A stored pending change.
 #[derive(Encode)]
-pub struct StoredPendingChange {
+pub struct StoredPendingChange {
 	/// The block number this was scheduled at.
 	pub scheduled_at: N,
 	/// The delay in blocks until it will be applied.
 	pub delay: N,
 	/// The next authority set.
-	pub next_authorities: Vec<(SessionKey, u64)>,
+	pub next_authorities: Vec<(AuthorityId, u64)>,
 	/// If defined it means the change was forced and the given block number
 	/// indicates the median last finalized block when the change was signaled.
 	pub forced: Option,
 }
 
-impl Decode for StoredPendingChange {
+impl Decode for StoredPendingChange {
 	fn decode(value: &mut I) -> Option {
 		let old = OldStoredPendingChange::decode(value)?;
 		let forced = >::decode(value).unwrap_or(None);
@@ -177,43 +125,31 @@ impl Decode for StoredPendingChange where ::SessionKey {
+	pub enum Event {
 		/// New authority set has been applied.
-		NewAuthorities(Vec<(SessionKey, u64)>),
+		NewAuthorities(Vec<(AuthorityId, u64)>),
 	}
 );
 
 decl_storage! {
 	trait Store for Module as GrandpaFinality {
-		// Pending change: (signaled at, scheduled change).
-		PendingChange get(pending_change): Option>;
-		// next block number where we can force a change.
+		/// The current authority set.
+		Authorities get(authorities) config(): Vec<(AuthorityId, AuthorityWeight)>;
+
+		/// Pending change: (signaled at, scheduled change).
+		PendingChange: Option>;
+
+		/// next block number where we can force a change.
 		NextForced get(next_forced): Option;
-	}
-	add_extra_genesis {
-		config(authorities): Vec<(T::SessionKey, u64)>;
-
-		build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| {
-			use codec::{Encode, KeyedVec};
-
-			let auth_count = config.authorities.len() as u32;
-			config.authorities.iter().enumerate().for_each(|(i, v)| {
-				storage.insert((i as u32).to_keyed_vec(
-					crate::fg_primitives::well_known_keys::AUTHORITY_PREFIX),
-					v.encode()
-				);
-			});
-			storage.insert(
-				crate::fg_primitives::well_known_keys::AUTHORITY_COUNT.to_vec(),
-				auth_count.encode(),
-			);
-		});
+
+		/// `true` if we are currently stalled.
+		Stalled get(stalled): Option<(T::BlockNumber, T::BlockNumber)>;
 	}
 }
 
 decl_module! {
 	pub struct Module for enum Call where origin: T::Origin {
-		fn deposit_event() = default;
+		fn deposit_event() = default;
 
 		/// Report some misbehavior.
 		fn report_misbehavior(origin, _report: Vec) {
@@ -225,24 +161,28 @@ decl_module! {
 			if let Some(pending_change) = >::get() {
 				if block_number == pending_change.scheduled_at {
 					if let Some(median) = pending_change.forced {
-						Self::deposit_log(RawLog::ForcedAuthoritiesChangeSignal(
+						Self::deposit_log(Signal::ForcedAuthoritiesChange(
 							median,
-							pending_change.delay,
-							pending_change.next_authorities.clone(),
-						));
+							ScheduledChange{
+								delay: pending_change.delay,
+								next_authorities: pending_change.next_authorities.clone(),
+							}
+						))
 					} else {
-						Self::deposit_log(RawLog::AuthoritiesChangeSignal(
-							pending_change.delay,
-							pending_change.next_authorities.clone(),
+						Self::deposit_log(Signal::AuthoritiesChange(
+							ScheduledChange{
+								delay: pending_change.delay,
+								next_authorities: pending_change.next_authorities.clone(),
+							}
 						));
 					}
 				}
 
 				if block_number == pending_change.scheduled_at + pending_change.delay {
+					>::put(&pending_change.next_authorities);
 					Self::deposit_event(
-						RawEvent::NewAuthorities(pending_change.next_authorities.clone())
+						Event::NewAuthorities(pending_change.next_authorities)
 					);
-					>::set_items(pending_change.next_authorities);
 					>::kill();
 				}
 			}
@@ -252,8 +192,8 @@ decl_module! {
 
 impl Module {
 	/// Get the current set of authorities, along with their respective weights.
-	pub fn grandpa_authorities() -> Vec<(T::SessionKey, u64)> {
-		>::items()
+	pub fn grandpa_authorities() -> Vec<(AuthorityId, u64)> {
+		>::get()
 	}
 
 	/// Schedule a change in the authorities.
@@ -271,11 +211,11 @@ impl Module {
 	/// No change should be signaled while any change is pending. Returns
 	/// an error if a change is already pending.
 	pub fn schedule_change(
-		next_authorities: Vec<(T::SessionKey, u64)>,
+		next_authorities: Vec<(AuthorityId, u64)>,
 		in_blocks: T::BlockNumber,
 		forced: Option,
 	) -> Result {
-		if Self::pending_change().is_none() {
+		if !>::exists() {
 			let scheduled_at = system::ChainContext::::default().current_height();
 
 			if let Some(_) = forced {
@@ -302,79 +242,60 @@ impl Module {
 	}
 
 	/// Deposit one of this module's logs.
-	fn deposit_log(log: Log) {
-		>::deposit_log(::Log::from(log).into());
+	fn deposit_log(log: Signal) {
+		let log: DigestItem = DigestItem::Consensus(GRANDPA_ENGINE_ID, log.encode());
+		>::deposit_log(log.into());
 	}
 }
 
-impl Module where AuthorityId: core::convert::From<::SessionKey> {
-	/// See if the digest contains any standard scheduled change.
-	pub fn scrape_digest_change(log: &Log)
+impl Module {
+	pub fn grandpa_log(digest: &DigestOf) -> Option> {
+		let id = OpaqueDigestItemId::Consensus(&GRANDPA_ENGINE_ID);
+		digest.convert_first(|l| l.try_to::>(id))
+	}
+
+	pub fn pending_change(digest: &DigestOf)
 		-> Option>
 	{
-		 as GrandpaChangeSignal>::as_signal(log)
+		Self::grandpa_log(digest).and_then(|signal| signal.try_into_change())
 	}
 
-	/// See if the digest contains any forced scheduled change.
-	pub fn scrape_digest_forced_change(log: &Log)
+	pub fn forced_change(digest: &DigestOf)
 		-> Option<(T::BlockNumber, ScheduledChange)>
 	{
-		 as GrandpaChangeSignal>::as_forced_signal(log)
-	}
-}
-
-/// Helper for authorities being synchronized with the general session authorities.
-///
-/// This is not the only way to manage an authority set for GRANDPA, but it is
-/// a convenient one. When this is used, no other mechanism for altering authority
-/// sets should be.
-pub struct SyncedAuthorities(::rstd::marker::PhantomData);
-
-// FIXME: remove when https://github.com/rust-lang/rust/issues/26925 is fixed
-impl Default for SyncedAuthorities {
-	fn default() -> Self {
-		SyncedAuthorities(::rstd::marker::PhantomData)
+		Self::grandpa_log(digest).and_then(|signal| signal.try_into_forced_change())
 	}
 }
 
-impl session::OnSessionChange for SyncedAuthorities where
-	T: Trait + consensus::Trait::SessionKey>,
-	::Log: From::SessionKey>>
-{
-	fn on_session_change(_: X, _: bool) {
-		use primitives::traits::Zero;
-
-		let next_authorities = >::authorities()
-			.into_iter()
-			.map(|key| (key, 1)) // evenly-weighted.
-			.collect::::SessionKey, u64)>>();
-
+impl session::OneSessionHandler for Module {
+	type Key = AuthorityId;
+	fn on_new_session<'a, I: 'a>(changed: bool, validators: I)
+		where I: Iterator
+	{
 		// instant changes
-		let last_authorities = >::grandpa_authorities();
-		if next_authorities != last_authorities {
-			let _ = >::schedule_change(next_authorities, Zero::zero(), None);
+		if changed {
+			let next_authorities = validators.map(|(_, k)| (k, 1u64)).collect::>();
+			let last_authorities = >::grandpa_authorities();
+			if next_authorities != last_authorities {
+				use primitives::traits::Zero;
+				if let Some((further_wait, median)) = >::take() {
+					let _ = Self::schedule_change(next_authorities, further_wait, Some(median));
+				} else {
+					let _ = Self::schedule_change(next_authorities, Zero::zero(), None);
+				}
+			}
 		}
 	}
+	fn on_disabled(_i: usize) {
+		// ignore?
+	}
 }
 
-impl finality_tracker::OnFinalizationStalled for SyncedAuthorities where
-	T: Trait + consensus::Trait::SessionKey>,
-	::Log: From::SessionKey>>,
-	T: finality_tracker::Trait,
-{
-	fn on_stalled(further_wait: T::BlockNumber) {
+impl finality_tracker::OnFinalizationStalled for Module {
+	fn on_stalled(further_wait: T::BlockNumber, median: T::BlockNumber) {
 		// when we record old authority sets, we can use `finality_tracker::median`
 		// to figure out _who_ failed. until then, we can't meaningfully guard
 		// against `next == last` the way that normal session changes do.
-
-		let next_authorities = >::authorities()
-			.into_iter()
-			.map(|key| (key, 1)) // evenly-weighted.
-			.collect::::SessionKey, u64)>>();
-
-		let median = >::median();
-
-		// schedule a change for `further_wait` blocks.
-		let _ = >::schedule_change(next_authorities, further_wait, Some(median));
+		>::put((further_wait, median));
 	}
 }
diff --git a/srml/grandpa/src/mock.rs b/srml/grandpa/src/mock.rs
index 4405604ab1..80c99b9a3c 100644
--- a/srml/grandpa/src/mock.rs
+++ b/srml/grandpa/src/mock.rs
@@ -18,21 +18,23 @@
 
 #![cfg(test)]
 
-use primitives::{BuildStorage, traits::IdentityLookup, testing::{Digest, DigestItem, Header}};
-use primitives::generic::DigestItem as GenDigestItem;
+use primitives::{
+	BuildStorage, DigestItem, traits::IdentityLookup, testing::{Header, UintAuthorityId}
+};
 use runtime_io;
 use srml_support::{impl_outer_origin, impl_outer_event};
 use substrate_primitives::{H256, Blake2Hasher};
 use parity_codec::{Encode, Decode};
-use crate::{GenesisConfig, Trait, Module, RawLog};
+use crate::{AuthorityId, GenesisConfig, Trait, Module, Signal};
+use substrate_finality_grandpa_primitives::GRANDPA_ENGINE_ID;
 
 impl_outer_origin!{
 	pub enum Origin for Test {}
 }
 
-impl From> for DigestItem {
-	fn from(log: RawLog) -> DigestItem {
-		GenDigestItem::Other(log.encode())
+impl From> for DigestItem {
+	fn from(log: Signal) -> DigestItem {
+		DigestItem::Consensus(GRANDPA_ENGINE_ID, log.encode())
 	}
 }
 
@@ -40,9 +42,8 @@ impl From> for DigestItem {
 #[derive(Clone, PartialEq, Eq, Debug, Decode, Encode)]
 pub struct Test;
 impl Trait for Test {
-	type Log = DigestItem;
-	type SessionKey = u64;
 	type Event = TestEvent;
+
 }
 impl system::Trait for Test {
 	type Origin = Origin;
@@ -50,12 +51,10 @@ impl system::Trait for Test {
 	type BlockNumber = u64;
 	type Hash = H256;
 	type Hashing = ::primitives::traits::BlakeTwo256;
-	type Digest = Digest;
 	type AccountId = u64;
 	type Lookup = IdentityLookup;
 	type Header = Header;
 	type Event = TestEvent;
-	type Log = DigestItem;
 }
 
 mod grandpa {
@@ -64,14 +63,19 @@ mod grandpa {
 
 impl_outer_event!{
 	pub enum TestEvent for Test {
-		grandpa,
+		grandpa,
 	}
 }
 
+pub fn to_authorities(vec: Vec<(u64, u64)>) -> Vec<(AuthorityId, u64)> {
+	vec.into_iter().map(|(id, weight)| (UintAuthorityId(id).into(), weight)).collect()
+}
+
 pub fn new_test_ext(authorities: Vec<(u64, u64)>) -> runtime_io::TestExternalities {
 	let mut t = system::GenesisConfig::::default().build_storage().unwrap().0;
 	t.extend(GenesisConfig:: {
-		authorities,
+		_genesis_phantom_data: Default::default(),
+		authorities: to_authorities(authorities),
 	}.build_storage().unwrap().0);
 	t.into()
 }
diff --git a/srml/grandpa/src/tests.rs b/srml/grandpa/src/tests.rs
index d19c5c25b6..ab923f295b 100644
--- a/srml/grandpa/src/tests.rs
+++ b/srml/grandpa/src/tests.rs
@@ -18,35 +18,37 @@
 
 #![cfg(test)]
 
-use primitives::{testing, traits::OnFinalize};
-use primitives::traits::Header;
+use primitives::testing::Digest;
+use primitives::traits::{Header, OnFinalize};
 use runtime_io::with_externalities;
-use crate::mock::{Grandpa, System, new_test_ext};
+use crate::mock::*;
 use system::{EventRecord, Phase};
-use crate::{RawLog, RawEvent};
 use codec::{Decode, Encode};
+use fg_primitives::ScheduledChange;
 use super::*;
 
 #[test]
 fn authorities_change_logged() {
 	with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || {
 		System::initialize(&1, &Default::default(), &Default::default(), &Default::default());
-		Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 0, None).unwrap();
+		Grandpa::schedule_change(to_authorities(vec![(4, 1), (5, 1), (6, 1)]), 0, None).unwrap();
 
 		System::note_finished_extrinsics();
 		Grandpa::on_finalize(1);
 
 		let header = System::finalize();
-		assert_eq!(header.digest, testing::Digest {
+		assert_eq!(header.digest, Digest {
 			logs: vec![
-				RawLog::AuthoritiesChangeSignal(0, vec![(4, 1), (5, 1), (6, 1)]).into(),
+				Signal::AuthoritiesChange(
+					ScheduledChange { delay: 0, next_authorities: to_authorities(vec![(4, 1), (5, 1), (6, 1)]) }
+				).into(),
 			],
 		});
 
 		assert_eq!(System::events(), vec![
 			EventRecord {
 				phase: Phase::Finalization,
-				event: RawEvent::NewAuthorities(vec![(4, 1), (5, 1), (6, 1)]).into(),
+				event: Event::NewAuthorities(to_authorities(vec![(4, 1), (5, 1), (6, 1)])).into(),
 				topics: vec![],
 			},
 		]);
@@ -57,12 +59,14 @@ fn authorities_change_logged() {
 fn authorities_change_logged_after_delay() {
 	with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || {
 		System::initialize(&1, &Default::default(), &Default::default(), &Default::default());
-		Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 1, None).unwrap();
+		Grandpa::schedule_change(to_authorities(vec![(4, 1), (5, 1), (6, 1)]), 1, None).unwrap();
 		Grandpa::on_finalize(1);
 		let header = System::finalize();
-		assert_eq!(header.digest, testing::Digest {
+		assert_eq!(header.digest, Digest {
 			logs: vec![
-				RawLog::AuthoritiesChangeSignal(1, vec![(4, 1), (5, 1), (6, 1)]).into(),
+				Signal::AuthoritiesChange(
+					ScheduledChange { delay: 1, next_authorities: to_authorities(vec![(4, 1), (5, 1), (6, 1)]) }
+				).into(),
 			],
 		});
 
@@ -77,7 +81,7 @@ fn authorities_change_logged_after_delay() {
 		assert_eq!(System::events(), vec![
 			EventRecord {
 				phase: Phase::Finalization,
-				event: RawEvent::NewAuthorities(vec![(4, 1), (5, 1), (6, 1)]).into(),
+				event: Event::NewAuthorities(to_authorities(vec![(4, 1), (5, 1), (6, 1)])).into(),
 				topics: vec![],
 			},
 		]);
@@ -88,23 +92,23 @@ fn authorities_change_logged_after_delay() {
 fn cannot_schedule_change_when_one_pending() {
 	with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || {
 		System::initialize(&1, &Default::default(), &Default::default(), &Default::default());
-		Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 1, None).unwrap();
-		assert!(Grandpa::pending_change().is_some());
-		assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err());
+		Grandpa::schedule_change(to_authorities(vec![(4, 1), (5, 1), (6, 1)]), 1, None).unwrap();
+		assert!(>::exists());
+		assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_err());
 
 		Grandpa::on_finalize(1);
 		let header = System::finalize();
 
 		System::initialize(&2, &header.hash(), &Default::default(), &Default::default());
-		assert!(Grandpa::pending_change().is_some());
-		assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err());
+		assert!(>::exists());
+		assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_err());
 
 		Grandpa::on_finalize(2);
 		let header = System::finalize();
 
 		System::initialize(&3, &header.hash(), &Default::default(), &Default::default());
-		assert!(Grandpa::pending_change().is_none());
-		assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_ok());
+		assert!(!>::exists());
+		assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_ok());
 
 		Grandpa::on_finalize(3);
 		let _header = System::finalize();
@@ -116,11 +120,11 @@ fn new_decodes_from_old() {
 	let old = OldStoredPendingChange {
 		scheduled_at: 5u32,
 		delay: 100u32,
-		next_authorities: vec![(1u64, 5), (2u64, 10), (3u64, 2)],
+		next_authorities: to_authorities(vec![(1, 5), (2, 10), (3, 2)]),
 	};
 
 	let encoded = old.encode();
-	let new = StoredPendingChange::::decode(&mut &encoded[..]).unwrap();
+	let new = StoredPendingChange::::decode(&mut &encoded[..]).unwrap();
 	assert!(new.forced.is_none());
 	assert_eq!(new.scheduled_at, old.scheduled_at);
 	assert_eq!(new.delay, old.delay);
@@ -132,23 +136,23 @@ fn dispatch_forced_change() {
 	with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || {
 		System::initialize(&1, &Default::default(), &Default::default(), &Default::default());
 		Grandpa::schedule_change(
-			vec![(4, 1), (5, 1), (6, 1)],
+			to_authorities(vec![(4, 1), (5, 1), (6, 1)]),
 			5,
 			Some(0),
 		).unwrap();
 
-		assert!(Grandpa::pending_change().is_some());
-		assert!(Grandpa::schedule_change(vec![(5, 1)], 1, Some(0)).is_err());
+		assert!(>::exists());
+		assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, Some(0)).is_err());
 
 		Grandpa::on_finalize(1);
 		let mut header = System::finalize();
 
 		for i in 2..7 {
 			System::initialize(&i, &header.hash(), &Default::default(), &Default::default());
-			assert!(Grandpa::pending_change().unwrap().forced.is_some());
+			assert!(>::get().unwrap().forced.is_some());
 			assert_eq!(Grandpa::next_forced(), Some(11));
-			assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err());
-			assert!(Grandpa::schedule_change(vec![(5, 1)], 1, Some(0)).is_err());
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_err());
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, Some(0)).is_err());
 
 			Grandpa::on_finalize(i);
 			header = System::finalize();
@@ -158,9 +162,9 @@ fn dispatch_forced_change() {
 		// add a normal change.
 		{
 			System::initialize(&7, &header.hash(), &Default::default(), &Default::default());
-			assert!(Grandpa::pending_change().is_none());
-			assert_eq!(Grandpa::grandpa_authorities(), vec![(4, 1), (5, 1), (6, 1)]);
-			assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_ok());
+			assert!(!>::exists());
+			assert_eq!(Grandpa::grandpa_authorities(), to_authorities(vec![(4, 1), (5, 1), (6, 1)]));
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_ok());
 			Grandpa::on_finalize(7);
 			header = System::finalize();
 		}
@@ -168,9 +172,9 @@ fn dispatch_forced_change() {
 		// run the normal change.
 		{
 			System::initialize(&8, &header.hash(), &Default::default(), &Default::default());
-			assert!(Grandpa::pending_change().is_some());
-			assert_eq!(Grandpa::grandpa_authorities(), vec![(4, 1), (5, 1), (6, 1)]);
-			assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err());
+			assert!(>::exists());
+			assert_eq!(Grandpa::grandpa_authorities(), to_authorities(vec![(4, 1), (5, 1), (6, 1)]));
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_err());
 			Grandpa::on_finalize(8);
 			header = System::finalize();
 		}
@@ -179,18 +183,18 @@ fn dispatch_forced_change() {
 		// time.
 		for i in 9..11 {
 			System::initialize(&i, &header.hash(), &Default::default(), &Default::default());
-			assert!(Grandpa::pending_change().is_none());
-			assert_eq!(Grandpa::grandpa_authorities(), vec![(5, 1)]);
+			assert!(!>::exists());
+			assert_eq!(Grandpa::grandpa_authorities(), to_authorities(vec![(5, 1)]));
 			assert_eq!(Grandpa::next_forced(), Some(11));
-			assert!(Grandpa::schedule_change(vec![(5, 1), (6, 1)], 5, Some(0)).is_err());
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1), (6, 1)]), 5, Some(0)).is_err());
 			Grandpa::on_finalize(i);
 			header = System::finalize();
 		}
 
 		{
 			System::initialize(&11, &header.hash(), &Default::default(), &Default::default());
-			assert!(Grandpa::pending_change().is_none());
-			assert!(Grandpa::schedule_change(vec![(5, 1), (6, 1), (7, 1)], 5, Some(0)).is_ok());
+			assert!(!>::exists());
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1), (6, 1), (7, 1)]), 5, Some(0)).is_ok());
 			assert_eq!(Grandpa::next_forced(), Some(21));
 			Grandpa::on_finalize(11);
 			header = System::finalize();
diff --git a/srml/indices/src/mock.rs b/srml/indices/src/mock.rs
index 80d3fa2c4f..e2ea51e89d 100644
--- a/srml/indices/src/mock.rs
+++ b/srml/indices/src/mock.rs
@@ -21,7 +21,7 @@
 use std::collections::HashSet;
 use ref_thread_local::{ref_thread_local, RefThreadLocal};
 use primitives::BuildStorage;
-use primitives::testing::{Digest, DigestItem, Header};
+use primitives::testing::Header;
 use substrate_primitives::{H256, Blake2Hasher};
 use srml_support::impl_outer_origin;
 use {runtime_io, system};
@@ -71,12 +71,10 @@ impl system::Trait for Runtime {
 	type BlockNumber = u64;
 	type Hash = H256;
 	type Hashing = ::primitives::traits::BlakeTwo256;
-	type Digest = Digest;
 	type AccountId = u64;
 	type Lookup = Indices;
 	type Header = Header;
 	type Event = ();
-	type Log = DigestItem;
 }
 impl Trait for Runtime {
 	type AccountIndex = u64;
diff --git a/srml/session/Cargo.toml b/srml/session/Cargo.toml
index 318c6d9f22..2c8c040ea1 100644
--- a/srml/session/Cargo.toml
+++ b/srml/session/Cargo.toml
@@ -11,7 +11,6 @@ parity-codec = { version = "3.3", default-features = false, features = ["derive"
 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 }
-consensus = { package = "srml-consensus", path = "../consensus", default-features = false }
 system = { package = "srml-system", path = "../system", default-features = false }
 timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false }
 
@@ -29,7 +28,5 @@ std = [
 	"rstd/std",
 	"srml-support/std",
 	"primitives/std",
-	"consensus/std",
-	"system/std",
 	"timestamp/std"
 ]
diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs
index 5c36f6fadc..a74edf52d7 100644
--- a/srml/session/src/lib.rs
+++ b/srml/session/src/lib.rs
@@ -115,220 +115,253 @@
 
 #![cfg_attr(not(feature = "std"), no_std)]
 
-use rstd::prelude::*;
-use primitives::traits::{Zero, One, Convert};
+use rstd::{prelude::*, marker::PhantomData, ops::Rem};
+#[cfg(not(feature = "std"))]
+use rstd::alloc::borrow::ToOwned;
+use parity_codec::Decode;
+use primitives::traits::{Zero, Saturating, Member, OpaqueKeys};
 use srml_support::{StorageValue, StorageMap, for_each_tuple, decl_module, decl_event, decl_storage};
-use srml_support::{dispatch::Result, traits::OnFreeBalanceZero};
+use srml_support::{ensure, traits::{OnFreeBalanceZero, Get}, Parameter, print};
 use system::ensure_signed;
-use rstd::ops::Mul;
 
-/// A session has changed.
-pub trait OnSessionChange {
-	/// Session has changed.
-	fn on_session_change(time_elapsed: T, should_reward: bool);
+/// Simple index type with which we can count sessions.
+pub type SessionIndex = u32;
+
+pub trait ShouldEndSession {
+	fn should_end_session(now: BlockNumber) -> bool;
+}
+
+pub struct PeriodicSessions<
+	Period,
+	Offset,
+>(PhantomData<(Period, Offset)>);
+
+impl<
+	BlockNumber: Rem + Saturating + Zero,
+	Period: Get,
+	Offset: Get,
+> ShouldEndSession for PeriodicSessions {
+	fn should_end_session(now: BlockNumber) -> bool {
+		((now.saturating_sub(Offset::get())) % Period::get()).is_zero()
+	}
+}
+
+pub trait OnSessionEnding {
+	/// Handle the fact that the session is ending, and optionally provide the new validator set.
+	fn on_session_ending(i: SessionIndex) -> Option>;
+}
+
+impl OnSessionEnding for () {
+	fn on_session_ending(_: SessionIndex) -> Option> { None }
 }
 
-macro_rules! impl_session_change {
+/// Handler for when a session keys set changes.
+pub trait SessionHandler {
+	/// Session set has changed; act appropriately.
+	fn on_new_session(changed: bool, validators: &[(AccountId, Ks)]);
+
+	/// A validator got disabled. Act accordingly until a new session begins.
+	fn on_disabled(validator_index: usize);
+}
+
+pub trait OneSessionHandler {
+	type Key: Decode + Default;
+	fn on_new_session<'a, I: 'a>(changed: bool, validators: I)
+		where I: Iterator, AccountId: 'a;
+	fn on_disabled(i: usize);
+}
+
+macro_rules! impl_session_handlers {
 	() => (
-		impl OnSessionChange for () {
-			fn on_session_change(_: T, _: bool) {}
+		impl SessionHandler for () {
+			fn on_new_session(_: bool, _: &[(AId, Ks)]) {}
+			fn on_disabled(_: usize) {}
 		}
 	);
 
 	( $($t:ident)* ) => {
-		impl),*> OnSessionChange for ($($t,)*) {
-			fn on_session_change(time_elapsed: T, should_reward: bool) {
-				$($t::on_session_change(time_elapsed.clone(), should_reward);)*
+		impl ),*> SessionHandler for ( $( $t , )* ) {
+			fn on_new_session(changed: bool, validators: &[(AId, Ks)]) {
+				let mut i: usize = 0;
+				$(
+					i += 1;
+					let our_keys = validators.iter()
+						.map(|k| (&k.0, k.1.get::<$t::Key>(i - 1).unwrap_or_default()));
+					$t::on_new_session(changed, our_keys);
+				)*
+			}
+			fn on_disabled(i: usize) {
+				$(
+					$t::on_disabled(i);
+				)*
 			}
 		}
 	}
 }
 
-for_each_tuple!(impl_session_change);
+for_each_tuple!(impl_session_handlers);
 
-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;
 
+pub trait Trait: system::Trait {
 	/// The overarching event type.
-	type Event: From> + Into<::Event>;
-}
+	type Event: From + Into<::Event>;
 
-decl_module! {
-	pub struct Module for enum Call where origin: T::Origin {
-		fn deposit_event() = default;
-
-		/// Sets the session key of the function caller to `key`.
-		/// Allows an account to set its session key prior to becoming a validator.
-		/// This doesn't take effect until the next session.
-		///
-		/// The dispatch origin of this function must be signed.
-		///
-		/// # 
-		/// - O(1).
-		/// - One extra DB entry.
-		/// # 
-		fn set_key(origin, key: T::SessionKey) {
-			let who = ensure_signed(origin)?;
-			// set new value for next session
-			>::insert(who, key);
-		}
+	/// Indicator for when to end the session.
+	type ShouldEndSession: ShouldEndSession;
 
-		/// Set a new session length. Won't kick in until the next session change (at current length).
-		///
-		/// Dispatch origin of this call must be _root_.
-		fn set_length(#[compact] new: T::BlockNumber) {
-			>::put(new);
-		}
+	/// Handler for when a session is about to end.
+	type OnSessionEnding: OnSessionEnding;
 
-		/// Forces a new session.
-		///
-		/// Dispatch origin of this call must be _root_.
-		fn force_new_session(apply_rewards: bool) -> Result {
-			Self::apply_force_new_session(apply_rewards)
-		}
+	/// Handler when a session has changed.
+	type SessionHandler: SessionHandler;
 
-		/// 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);
-		}
-	}
+	/// The keys.
+	type Keys: OpaqueKeys + Member + Parameter + Default;
 }
 
-decl_event!(
-	pub enum Event where ::BlockNumber {
-		/// New session has happened. Note that the argument is the session index, not the block
-		/// number as the type might suggest.
-		NewSession(BlockNumber),
-	}
-);
+type OpaqueKey = Vec;
 
 decl_storage! {
 	trait Store for Module as Session {
 		/// 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 = 1000.into();
+
 		/// Current index of the session.
-		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 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;
+		pub CurrentIndex get(current_index): SessionIndex;
+
+		/// True if anything has changed in this session.
+		Changed: bool;
+
 		/// The next key for a given validator.
 		NextKeyFor build(|config: &GenesisConfig| {
 			config.keys.clone()
-		}): map T::AccountId => Option;
-		/// The next session length.
-		NextSessionLength: Option;
+		}): map T::AccountId => Option;
+
+		/// The keys that are currently active.
+		Active build(|config: &GenesisConfig| {
+			(0..T::Keys::count()).map(|i| (
+				i as u32,
+				config.keys.iter()
+					.map(|x| x.1.get_raw(i).to_vec())
+					.collect::>(),
+			)).collect::)>>()
+		}): map u32 => Vec;
 	}
 	add_extra_genesis {
-		config(keys): Vec<(T::AccountId, T::SessionKey)>;
+		config(keys): Vec<(T::AccountId, T::Keys)>;
 	}
 }
 
-impl Module {
-	/// The current number of validators.
-	pub fn validator_count() -> u32 {
-		>::get().len() as u32
+decl_event!(
+	pub enum Event {
+		/// New session has happened. Note that the argument is the session index, not the block
+		/// number as the type might suggest.
+		NewSession(SessionIndex),
 	}
+);
 
-	/// The last length change if there was one, zero if not.
-	pub fn last_length_change() -> T::BlockNumber {
-		>::get().unwrap_or_else(T::BlockNumber::zero)
-	}
+decl_module! {
+	pub struct Module for enum Call where origin: T::Origin {
+		fn deposit_event() = default;
 
-	// INTERNAL API (available to other runtime modules)
-	/// Forces a new session, no origin.
-	pub fn apply_force_new_session(apply_rewards: bool) -> Result {
-		>::put(apply_rewards);
-		Ok(())
-	}
+		/// Sets the session key(s) of the function caller to `key`.
+		/// Allows an account to set its session key prior to becoming a validator.
+		/// This doesn't take effect until the next session.
+		///
+		/// The dispatch origin of this function must be signed.
+		///
+		/// # 
+		/// - O(1).
+		/// - One extra DB entry.
+		/// # 
+		fn set_keys(origin, keys: T::Keys, proof: Vec) {
+			let who = ensure_signed(origin)?;
 
-	/// Set the current set of validators.
-	///
-	/// Called by `staking::new_era` only. `rotate_session` must be called after this in order to
-	/// update the session keys to the next validator set.
-	pub fn set_validators(new: &[T::AccountId]) {
-		>::put(&new.to_vec());
-	}
+			ensure!(keys.ownership_proof_is_valid(&proof), "invalid ownership proof");
+
+			let old_keys = >::get(&who);
+			let mut updates = vec![];
+
+			for i in 0..T::Keys::count() {
+				let new_key = keys.get_raw(i);
+				let maybe_old_key = old_keys.as_ref().map(|o| o.get_raw(i));
+				if maybe_old_key == Some(new_key) {
+					// no change.
+					updates.push(None);
+					continue;
+				}
+				let mut active = >::get(i as u32);
+				match active.binary_search_by(|k| k[..].cmp(&new_key)) {
+					Ok(_) => return Err("duplicate key provided"),
+					Err(pos) => active.insert(pos, new_key.to_owned()),
+				}
+				if let Some(old_key) = maybe_old_key {
+					match active.binary_search_by(|k| k[..].cmp(&old_key)) {
+						Ok(pos) => { active.remove(pos); }
+						Err(_) => {
+							// unreachable as long as our state is valid. we don't want to panic if
+							// it isn't, though.
+							print("ERROR: active doesn't contain outgoing key");
+						}
+					}
+				}
+				updates.push(Some((i, active)));
+			}
+
+			// Update the active sets.
+			for (i, active) in updates.into_iter().filter_map(|x| x) {
+				>::insert(i as u32, active);
+			}
+			// Set new keys value for next session.
+			>::insert(who, keys);
+			// Something changed.
+			>::put(true);
+		}
 
-	/// Hook to be called after transaction processing.
-	pub fn check_rotate_session(block_number: T::BlockNumber) {
-		// Do this last, after the staking system has had the chance to switch out the authorities for the
-		// new set.
-		// Check block number and call `rotate_session` if necessary.
-		let is_final_block = ((block_number - Self::last_length_change()) % Self::length()).is_zero();
-		let (should_end_session, apply_rewards) = >::take()
-			.map_or((is_final_block, is_final_block), |apply_rewards| (true, apply_rewards));
-		if should_end_session {
-			Self::rotate_session(is_final_block, apply_rewards);
+		/// Called when a block is finalized. Will rotate session if it is the last
+		/// block of the current session.
+		fn on_initialize(n: T::BlockNumber) {
+			if T::ShouldEndSession::should_end_session(n) {
+				Self::rotate_session();
+			}
 		}
 	}
+}
 
+impl Module {
 	/// Move on to next session: register the new authority set.
-	pub fn rotate_session(is_final_block: bool, apply_rewards: bool) {
-		let now = >::get();
-		let time_elapsed = now.clone() - Self::current_start();
-		let session_index = >::get() + One::one();
-
-		Self::deposit_event(RawEvent::NewSession(session_index));
-
+	pub fn rotate_session() {
 		// Increment current session index.
-		>::put(session_index);
-		>::put(now);
+		let session_index = >::get();
 
-		// Enact session length change.
-		let len_changed = if let Some(next_len) = >::take() {
-			>::put(next_len);
-			true
+		let mut changed = >::take();
+
+		// See if we have a new validator set.
+		let validators = if let Some(new) = T::OnSessionEnding::on_session_ending(session_index) {
+			changed = true;
+			>::put(&new);
+			new
 		} else {
-			false
+			>::get()
 		};
-		if len_changed || !is_final_block {
-			let block_number = >::block_number();
-			>::put(block_number);
-		}
 
-		T::OnSessionChange::on_session_change(time_elapsed, apply_rewards);
+		let session_index = session_index + 1;
+		>::put(session_index);
 
-		// Update any changes in session keys.
-		let v = Self::validators();
-		>::set_authority_count(v.len() as u32);
-		for (i, v) in v.into_iter().enumerate() {
-			>::set_authority(
-				i as u32,
-				&>::get(&v)
-					.or_else(|| T::ConvertAccountIdToSessionKey::convert(v))
-					.unwrap_or_default()
-			);
-		};
-	}
+		// Record that this happened.
+		Self::deposit_event(Event::NewSession(session_index));
 
-	/// 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();
-		Mul::::mul(block_period, session_length)
+		// Tell everyone about the new session keys.
+		let amalgamated = validators.into_iter()
+			.map(|a| { let k = >::get(&a).unwrap_or_default(); (a, k) })
+			.collect::>();
+		T::SessionHandler::on_new_session::(changed, &amalgamated);
 	}
 
-	/// Number of blocks remaining in this session, not counting this one. If the session is
-	/// due to rotate at the end of this block, then it will return 0. If the session just began, then
-	/// it will return `Self::length() - 1`.
-	pub fn blocks_remaining() -> T::BlockNumber {
-		let length = Self::length();
-		let length_minus_1 = length - One::one();
-		let block_number = >::block_number();
-		length_minus_1 - (block_number - Self::last_length_change() + length_minus_1) % length
+	/// Disable the validator of index `i`.
+	pub fn disable(i: usize) {
+		T::SessionHandler::on_disabled(i);
+		>::put(true);
 	}
 }
 
@@ -346,8 +379,8 @@ mod tests {
 	use runtime_io::with_externalities;
 	use substrate_primitives::{H256, Blake2Hasher};
 	use primitives::BuildStorage;
-	use primitives::traits::{BlakeTwo256, IdentityLookup};
-	use primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, ConvertUintAuthorityId};
+	use primitives::traits::{BlakeTwo256, IdentityLookup, OnInitialize};
+	use primitives::testing::{Header, UintAuthorityId};
 
 	impl_outer_origin!{
 		pub enum Origin for Test {}
@@ -355,62 +388,87 @@ mod tests {
 
 	thread_local!{
 		static NEXT_VALIDATORS: RefCell> = RefCell::new(vec![1, 2, 3]);
+		static AUTHORITIES: RefCell> =
+			RefCell::new(vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
+		static FORCE_SESSION_END: RefCell = RefCell::new(false);
+		static SESSION_LENGTH: RefCell = RefCell::new(2);
+	}
+
+	pub struct TestShouldEndSession;
+	impl ShouldEndSession for TestShouldEndSession {
+		fn should_end_session(now: u64) -> bool {
+			let l = SESSION_LENGTH.with(|l| *l.borrow());
+			now % l == 0 || FORCE_SESSION_END.with(|l| { let r = *l.borrow(); *l.borrow_mut() = false; r })
+		}
+	}
+
+	pub struct TestSessionHandler;
+	impl SessionHandler for TestSessionHandler {
+		fn on_new_session(_changed: bool, validators: &[(u64, T)]) {
+			AUTHORITIES.with(|l|
+				*l.borrow_mut() = validators.iter().map(|(_, id)| id.get::(0).unwrap_or_default()).collect()
+			);
+		}
+		fn on_disabled(_validator_index: usize) {}
 	}
 
-	pub struct TestOnSessionChange;
-	impl OnSessionChange for TestOnSessionChange {
-		fn on_session_change(_elapsed: u64, _should_reward: bool) {
-			NEXT_VALIDATORS.with(|v| Session::set_validators(&*v.borrow()));
+	pub struct TestOnSessionEnding;
+	impl OnSessionEnding for TestOnSessionEnding {
+		fn on_session_ending(_: SessionIndex) -> Option> {
+			Some(NEXT_VALIDATORS.with(|l| l.borrow().clone()))
 		}
 	}
 
+	fn authorities() -> Vec {
+		AUTHORITIES.with(|l| l.borrow().to_vec())
+	}
+
+	fn force_new_session() {
+		FORCE_SESSION_END.with(|l| *l.borrow_mut() = true )
+	}
+
+	fn set_session_length(x: u64) {
+		SESSION_LENGTH.with(|l| *l.borrow_mut() = x )
+	}
+
 	#[derive(Clone, Eq, PartialEq)]
 	pub struct Test;
-	impl consensus::Trait for Test {
-		type Log = DigestItem;
-		type SessionKey = UintAuthorityId;
-		type InherentOfflineReport = ();
-	}
 	impl system::Trait for Test {
 		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 = ();
-		type Log = DigestItem;
 	}
 	impl timestamp::Trait for Test {
 		type Moment = u64;
 		type OnTimestampSet = ();
 	}
 	impl Trait for Test {
-		type ConvertAccountIdToSessionKey = ConvertUintAuthorityId;
-		type OnSessionChange = TestOnSessionChange;
+		type ShouldEndSession = TestShouldEndSession;
+		type OnSessionEnding = TestOnSessionEnding;
+		type SessionHandler = TestSessionHandler;
+		type Keys = UintAuthorityId;
 		type Event = ();
 	}
 
 	type System = system::Module;
-	type Consensus = consensus::Module;
 	type Session = Module;
 
 	fn new_test_ext() -> runtime_io::TestExternalities {
 		let mut t = system::GenesisConfig::::default().build_storage().unwrap().0;
-		t.extend(consensus::GenesisConfig::{
-			code: vec![],
-			authorities: NEXT_VALIDATORS.with(|l| l.borrow().iter().cloned().map(UintAuthorityId).collect()),
-		}.build_storage().unwrap().0);
 		t.extend(timestamp::GenesisConfig::{
 			minimum_period: 5,
 		}.build_storage().unwrap().0);
 		t.extend(GenesisConfig::{
-			session_length: 2,
 			validators: NEXT_VALIDATORS.with(|l| l.borrow().clone()),
-			keys: vec![],
+			keys: NEXT_VALIDATORS.with(|l|
+				l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i))).collect()
+			),
 		}.build_storage().unwrap().0);
 		runtime_io::TestExternalities::new(t)
 	}
@@ -418,8 +476,7 @@ mod tests {
 	#[test]
 	fn simple_setup_should_work() {
 		with_externalities(&mut new_test_ext(), || {
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
-			assert_eq!(Session::length(), 2);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
 			assert_eq!(Session::validators(), vec![1, 2, 3]);
 		});
 	}
@@ -428,106 +485,56 @@ mod tests {
 	fn authorities_should_track_validators() {
 		with_externalities(&mut new_test_ext(), || {
 			NEXT_VALIDATORS.with(|v| *v.borrow_mut() = vec![1, 2]);
-			assert_ok!(Session::force_new_session(false));
-			Session::check_rotate_session(1);
+			force_new_session();
+
+			System::set_block_number(1);
+			Session::on_initialize(1);
 			assert_eq!(Session::validators(), vec![1, 2]);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2)]);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2)]);
 
 			NEXT_VALIDATORS.with(|v| *v.borrow_mut() = vec![1, 2, 4]);
-			assert_ok!(Session::force_new_session(false));
-			Session::check_rotate_session(2);
+			assert_ok!(Session::set_keys(Origin::signed(4), UintAuthorityId(4), vec![]));
+
+			force_new_session();
+			System::set_block_number(2);
+			Session::on_initialize(2);
 			assert_eq!(Session::validators(), vec![1, 2, 4]);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(4)]);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(4)]);
 
 			NEXT_VALIDATORS.with(|v| *v.borrow_mut() = vec![1, 2, 3]);
-			assert_ok!(Session::force_new_session(false));
-			Session::check_rotate_session(3);
+			force_new_session();
+			System::set_block_number(3);
+			Session::on_initialize(3);
 			assert_eq!(Session::validators(), vec![1, 2, 3]);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
 		});
 	}
 
 	#[test]
 	fn should_work_with_early_exit() {
 		with_externalities(&mut new_test_ext(), || {
-			System::set_block_number(1);
-			assert_ok!(Session::set_length(10));
-			assert_eq!(Session::blocks_remaining(), 1);
-			Session::check_rotate_session(1);
-
-			System::set_block_number(2);
-			assert_eq!(Session::blocks_remaining(), 0);
-			Session::check_rotate_session(2);
-			assert_eq!(Session::length(), 10);
-
-			System::set_block_number(7);
-			assert_eq!(Session::current_index(), 1);
-			assert_eq!(Session::blocks_remaining(), 5);
-			assert_ok!(Session::force_new_session(false));
-			Session::check_rotate_session(7);
+			set_session_length(10);
 
-			System::set_block_number(8);
-			assert_eq!(Session::current_index(), 2);
-			assert_eq!(Session::blocks_remaining(), 9);
-			Session::check_rotate_session(8);
-
-			System::set_block_number(17);
-			assert_eq!(Session::current_index(), 2);
-			assert_eq!(Session::blocks_remaining(), 0);
-			Session::check_rotate_session(17);
-
-			System::set_block_number(18);
-			assert_eq!(Session::current_index(), 3);
-		});
-	}
-
-	#[test]
-	fn session_length_change_should_work() {
-		with_externalities(&mut new_test_ext(), || {
-			// Block 1: Change to length 3; no visible change.
 			System::set_block_number(1);
-			assert_ok!(Session::set_length(3));
-			Session::check_rotate_session(1);
-			assert_eq!(Session::length(), 2);
+			Session::on_initialize(1);
 			assert_eq!(Session::current_index(), 0);
 
-			// Block 2: Length now changed to 3. Index incremented.
 			System::set_block_number(2);
-			assert_ok!(Session::set_length(3));
-			Session::check_rotate_session(2);
-			assert_eq!(Session::length(), 3);
-			assert_eq!(Session::current_index(), 1);
+			Session::on_initialize(2);
+			assert_eq!(Session::current_index(), 0);
+			force_new_session();
 
-			// Block 3: Length now changed to 3. Index incremented.
 			System::set_block_number(3);
-			Session::check_rotate_session(3);
-			assert_eq!(Session::length(), 3);
+			Session::on_initialize(3);
 			assert_eq!(Session::current_index(), 1);
 
-			// Block 4: Change to length 2; no visible change.
-			System::set_block_number(4);
-			assert_ok!(Session::set_length(2));
-			Session::check_rotate_session(4);
-			assert_eq!(Session::length(), 3);
+			System::set_block_number(9);
+			Session::on_initialize(9);
 			assert_eq!(Session::current_index(), 1);
 
-			// Block 5: Length now changed to 2. Index incremented.
-			System::set_block_number(5);
-			Session::check_rotate_session(5);
-			assert_eq!(Session::length(), 2);
+			System::set_block_number(10);
+			Session::on_initialize(10);
 			assert_eq!(Session::current_index(), 2);
-
-			// Block 6: No change.
-			System::set_block_number(6);
-			Session::check_rotate_session(6);
-			assert_eq!(Session::length(), 2);
-			assert_eq!(Session::current_index(), 2);
-
-			// Block 7: Next index.
-			System::set_block_number(7);
-			Session::check_rotate_session(7);
-			assert_eq!(Session::length(), 2);
-			assert_eq!(Session::current_index(), 3);
 		});
 	}
 
@@ -536,26 +543,24 @@ mod tests {
 		with_externalities(&mut new_test_ext(), || {
 			// Block 1: No change
 			System::set_block_number(1);
-			Session::check_rotate_session(1);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
+			Session::on_initialize(1);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
 
 			// Block 2: Session rollover, but no change.
 			System::set_block_number(2);
-			Session::check_rotate_session(2);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
+			Session::on_initialize(2);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
 
 			// Block 3: Set new key for validator 2; no visible change.
 			System::set_block_number(3);
-			assert_ok!(Session::set_key(Origin::signed(2), UintAuthorityId(5)));
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
-
-			Session::check_rotate_session(3);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
+			Session::on_initialize(3);
+			assert_ok!(Session::set_keys(Origin::signed(2), UintAuthorityId(5), vec![]));
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
 
 			// Block 4: Session rollover, authority 2 changes.
 			System::set_block_number(4);
-			Session::check_rotate_session(4);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(5), UintAuthorityId(3)]);
+			Session::on_initialize(4);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(5), UintAuthorityId(3)]);
 		});
 	}
 }
diff --git a/srml/staking/Cargo.toml b/srml/staking/Cargo.toml
index 62fc187176..1b95f30f32 100644
--- a/srml/staking/Cargo.toml
+++ b/srml/staking/Cargo.toml
@@ -13,7 +13,6 @@ rstd = { package = "sr-std", path = "../../core/sr-std", default-features = fals
 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 }
-consensus = { package = "srml-consensus", path = "../consensus", default-features = false }
 system = { package = "srml-system", path = "../system", default-features = false }
 session = { package = "srml-session", path = "../session", default-features = false }
 
diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs
index 0754985a6f..1f6e023d18 100644
--- a/srml/staking/src/lib.rs
+++ b/srml/staking/src/lib.rs
@@ -24,24 +24,25 @@
 //!
 //! ## 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.
+//! 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 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.
+//! - 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
@@ -57,50 +58,55 @@
 //!
 //! #### 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 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.
+//! 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.
 //!
-//! 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:
+//! 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
 //!
-//! A **validator** takes the role of either validating blocks or ensuring their finality, maintaining the veracity of
-//! the network. A validator should avoid both any sort of malicious misbehavior and going offline.
-//! Bonded accounts that state interest in being a validator do NOT get immediately chosen as a validator. Instead, they
-//! are declared as a _candidate_ and they _might_ get elected at the _next era_ as a validator. The result of the
-//! election is determined by nominators and their votes.
+//! A **validator** takes the role of either validating blocks or ensuring their finality,
+//! maintaining the veracity of the network. A validator should avoid both any sort of malicious
+//! misbehavior and going offline. Bonded accounts that state interest in being a validator do NOT
+//! get immediately chosen as a validator. Instead, they are declared as a _candidate_ and they
+//! _might_ get elected at the _next era_ as a validator. The result of the election is determined
+//! by nominators and their votes.
 //!
-//! An account can become a validator candidate via the [`validate`](./enum.Call.html#variant.validate) call.
+//! An account can become a validator candidate via the
+//! [`validate`](./enum.Call.html#variant.validate) call.
 //!
 //! #### Nomination
 //!
-//! A **nominator** does not take any _direct_ role in maintaining the network, instead, it votes on a set of validators
-//! to be elected. Once interest in nomination is stated by an account, it takes effect at the next election round. The
-//! funds in the nominator's stash account indicate the _weight_ of its vote.
-//! Both the rewards and any punishment that a validator earns are shared between the validator and its nominators.
-//! This rule incentivizes the nominators to NOT vote for the misbehaving/offline validators as much as possible, simply
-//! because the nominators will also lose funds if they vote poorly.
+//! A **nominator** does not take any _direct_ role in maintaining the network, instead, it votes on
+//! a set of validators  to be elected. Once interest in nomination is stated by an account, it
+//! takes effect at the next election round. The funds in the nominator's stash account indicate the
+//! _weight_ of its vote. Both the rewards and any punishment that a validator earns are shared
+//! between the validator and its nominators. This rule incentivizes the nominators to NOT vote for
+//! the misbehaving/offline validators as much as possible, simply because the nominators will also
+//! lose funds if they vote poorly.
 //!
 //! An account can become a nominator via the [`nominate`](enum.Call.html#variant.nominate) call.
 //!
 //! #### Rewards and Slash
 //!
-//! 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_.
+//! 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).
+//! 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).
 //!
 //! 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.
@@ -108,9 +114,9 @@
 //!
 //! #### Chilling
 //!
-//! Finally, any of the roles above can choose to step back temporarily and just chill for a while. This means that if
-//! they are a nominator, they will not be considered as voters anymore and if they are validators, they will no longer
-//! be a candidate for the next election.
+//! Finally, any of the roles above can choose to step back temporarily and just chill for a while.
+//! This means that if they are a nominator, they will not be considered as voters anymore and if
+//! they are validators, they will no longer be a candidate for the next election.
 //!
 //! An account can step back via the [`chill`](enum.Call.html#variant.chill) call.
 //!
@@ -118,8 +124,8 @@
 //!
 //! ### Dispatchable Functions
 //!
-//! 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.
+//! 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.
 //!
 //! ### Public Functions
 //!
@@ -153,30 +159,34 @@
 //!
 //! ### Slot Stake
 //!
-//! 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.
+//! 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`
-//! (`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 their associated nominators.
+//! 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`  (`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 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 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)).
+//! [`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`](./struct.Payee.html) storage item (see [`set_payee`](enum.Call.html#variant.set_payee)),
-//! to be one of the following:
+//! 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.
@@ -185,8 +195,8 @@
 //! ### Slashing details
 //!
 //! 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
+//! [`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
 //! [`ValidatorPrefs::unstake_threshold`](./struct.ValidatorPrefs.html#structfield.unstake_threshold).
 //!
 //! On top of this, the Staking module also introduces an
@@ -199,35 +209,38 @@
 //! the consequence.
 //!
 //! 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).
+//! [`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`](./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.
+//! 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.
 //!
-//! Note that there is a limitation to the number of fund-chunks that can be scheduled to be unlocked in the future
-//! via [`unbond`](enum.Call.html#variant.unbond).
-//! In case this maximum (`MAX_UNLOCKING_CHUNKS`) is reached, the bonded account _must_ first wait until a successful
+//! Note that there is a limitation to the number of fund-chunks that can be scheduled to be
+//! unlocked in the future via [`unbond`](enum.Call.html#variant.unbond). In case this maximum
+//! (`MAX_UNLOCKING_CHUNKS`) is reached, the bonded account _must_ first wait until a successful
 //! call to `withdraw_unbonded` to remove some of the chunks.
 //!
 //! ### 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 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 iteratively normalizes the nominator staked
+//! values until the total difference among votes of a particular nominator are less than a
+//! threshold.
 //!
 //! ## GenesisConfig
 //!
@@ -236,8 +249,8 @@
 //! ## Related Modules
 //!
 //! - [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.
+//! - [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.
 
 #![recursion_limit="128"]
 #![cfg_attr(not(feature = "std"), no_std)]
@@ -261,17 +274,17 @@ mod benches;
 use runtime_io::with_storage;
 use rstd::{prelude::*, result, collections::btree_map::BTreeMap};
 use parity_codec::{HasCompact, Encode, Decode};
-use srml_support::{ StorageValue, StorageMap, EnumerableStorageMap, dispatch::Result,
-	decl_module, decl_event, decl_storage, ensure,
-	traits::{Currency, OnFreeBalanceZero, OnDilution, LockIdentifier, LockableCurrency,
-		WithdrawReasons, OnUnbalanced, Imbalance
+use srml_support::{
+	StorageValue, StorageMap, EnumerableStorageMap, decl_module, decl_event,
+	decl_storage, ensure, traits::{
+		Currency, OnFreeBalanceZero, OnDilution, LockIdentifier, LockableCurrency,
+		WithdrawReasons, OnUnbalanced, Imbalance, Get
 	}
 };
-use session::OnSessionChange;
+use session::{OnSessionEnding, SessionIndex};
 use primitives::Perbill;
 use primitives::traits::{
-	Convert, Zero, One, StaticLookup, CheckedSub, CheckedShl, Saturating,
-	Bounded, SaturatedConversion
+	Convert, Zero, One, StaticLookup, CheckedSub, CheckedShl, Saturating, Bounded
 };
 #[cfg(feature = "std")]
 use primitives::{Serialize, Deserialize};
@@ -286,6 +299,9 @@ const MAX_UNSTAKE_THRESHOLD: u32 = 10;
 const MAX_UNLOCKING_CHUNKS: usize = 32;
 const STAKING_ID: LockIdentifier = *b"staking ";
 
+/// Counter for the number of eras that have passed.
+pub type EraIndex = u32;
+
 /// Indicates the initial status of the staker.
 #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))]
 pub enum StakerStatus {
@@ -322,7 +338,8 @@ pub struct ValidatorPrefs {
 	/// Validator should ensure this many more slashes than is necessary before being unstaked.
 	#[codec(compact)]
 	pub unstake_threshold: u32,
-	/// Reward that validator takes up-front; only the rest is split between themselves and nominators.
+	/// Reward that validator takes up-front; only the rest is split between themselves and
+	/// nominators.
 	#[codec(compact)]
 	pub validator_payment: Balance,
 }
@@ -339,19 +356,19 @@ impl Default for ValidatorPrefs {
 /// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked.
 #[derive(PartialEq, Eq, Clone, Encode, Decode)]
 #[cfg_attr(feature = "std", derive(Debug))]
-pub struct UnlockChunk {
+pub struct UnlockChunk {
 	/// Amount of funds to be unlocked.
 	#[codec(compact)]
 	value: Balance,
 	/// Era number at which point it'll be unlocked.
 	#[codec(compact)]
-	era: BlockNumber,
+	era: EraIndex,
 }
 
 /// The ledger of a (bonded) stash.
 #[derive(PartialEq, Eq, Clone, Encode, Decode)]
 #[cfg_attr(feature = "std", derive(Debug))]
-pub struct StakingLedger {
+pub struct StakingLedger {
 	/// The stash account whose balance is actually locked and at stake.
 	pub stash: AccountId,
 	/// The total amount of the stash's balance that we are currently accounting for.
@@ -364,17 +381,16 @@ pub struct StakingLedger>,
+	pub unlocking: Vec>,
 }
 
 impl<
 	AccountId,
 	Balance: HasCompact + Copy + Saturating,
-	BlockNumber: HasCompact + PartialOrd
-> StakingLedger {
+> StakingLedger {
 	/// Remove entries from `unlocking` that are sufficiently old and reduce the
 	/// total by the sum of their balances.
-	fn consolidate_unlocked(self, current_era: BlockNumber) -> Self {
+	fn consolidate_unlocked(self, current_era: EraIndex) -> Self {
 		let mut total = self.total;
 		let unlocking = self.unlocking.into_iter()
 			.filter(|chunk| if chunk.era > current_era {
@@ -414,12 +430,17 @@ pub struct Exposure {
 }
 
 type BalanceOf = <::Currency as Currency<::AccountId>>::Balance;
-type PositiveImbalanceOf = <::Currency as Currency<::AccountId>>::PositiveImbalance;
-type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance;
+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>>;
+type ExpoMap = BTreeMap<
+	::AccountId,
+	Exposure<::AccountId, BalanceOf>
+>;
 
 pub trait Trait: system::Trait + session::Trait {
 	/// The staking balance.
@@ -443,6 +464,12 @@ pub trait Trait: system::Trait + session::Trait {
 
 	/// Handler for the unbalanced increment when rewarding a staker.
 	type Reward: OnUnbalanced>;
+
+	/// Number of sessions per era.
+	type SessionsPerEra: Get;
+
+	/// Number of eras that staked funds must remain bonded for.
+	type BondingDuration: Get;
 }
 
 decl_storage! {
@@ -451,26 +478,25 @@ decl_storage! {
 		/// The ideal number of staking participants.
 		pub ValidatorCount get(validator_count) config(): u32;
 		/// 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 = 1000.into();
+		pub MinimumValidatorCount get(minimum_validator_count) config():
+			u32 = DEFAULT_MINIMUM_VALIDATOR_COUNT;
 		/// Maximum reward, per validator, that is provided per acceptable session.
 		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);
 		/// 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 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.
+		/// 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.
 		pub Invulnerables get(invulnerables) config(): Vec;
 
 		/// Map from all locked "stash" accounts to the controller account.
 		pub Bonded get(bonded): map T::AccountId => Option;
 		/// Map from all (unlocked) "controller" accounts to the info regarding the staking.
-		pub Ledger get(ledger): map T::AccountId => Option, T::BlockNumber>>;
+		pub Ledger get(ledger):
+			map T::AccountId => Option>>;
 
 		/// Where the reward payment should be made. Keyed by stash.
 		pub Payee get(payee): map T::AccountId => RewardDestination;
@@ -481,38 +507,34 @@ decl_storage! {
 		/// The map from nominator stash key to the set of stash keys of all validators to nominate.
 		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 Session module.
+		/// 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 Session module.
 		///
 		/// This is keyed by the stash account.
 		pub Stakers get(stakers): map T::AccountId => Exposure>;
 
-		// The historical validators and their nominations for a given era. Stored as a trie root of the mapping
-		// `T::AccountId` => `Exposure>`, which is just the contents of `Stakers`,
-		// under a key that is the `era`.
+		// The historical validators and their nominations for a given era. Stored as a trie root
+		// of the mapping `T::AccountId` => `Exposure>`, which is just
+		// the contents of `Stakers`, under a key that is the `era`.
 		//
-		// Every era change, this will be appended with the trie root of the contents of `Stakers`, and the oldest
-		// entry removed down to a specific number of entries (probably around 90 for a 3 month history).
+		// Every era change, this will be appended with the trie root of the contents of `Stakers`,
+		// and the oldest entry removed down to a specific number of entries (probably around 90 for
+		// a 3 month history).
 		// pub HistoricalStakers get(historical_stakers): map T::BlockNumber => Option;
 
 		/// The currently elected validator set keyed by stash account ID.
 		pub CurrentElected get(current_elected): Vec;
 
 		/// The current era index.
-		pub CurrentEra get(current_era) config(): T::BlockNumber;
+		pub CurrentEra get(current_era) config(): EraIndex;
 
 		/// Maximum reward, per validator, that is provided per acceptable session.
 		pub CurrentSessionReward get(current_session_reward) config(): BalanceOf;
 
-		/// The accumulated reward for the current era. Reset to zero at the beginning of the era and
-		/// increased for every successfully finished session.
+		/// The accumulated reward for the current era. Reset to zero at the beginning of the era
+		/// and increased for every successfully finished session.
 		pub CurrentEraReward get(current_era_reward): BalanceOf;
 
-		/// The next value of sessions per era.
-		pub NextSessionsPerEra get(next_sessions_per_era): Option;
-		/// The session index at which the era length last changed.
-		pub LastEraLengthChange get(last_era_length_change): T::BlockNumber;
-
 		/// The amount of balance actively at stake for each validator slot, currently.
 		///
 		/// This is used to derive rewards and punishments.
@@ -520,18 +542,25 @@ decl_storage! {
 			config.stakers.iter().map(|&(_, _, value, _)| value).min().unwrap_or_default()
 		}): BalanceOf;
 
-		/// The number of times a given validator has been reported offline. This gets decremented by one each era that passes.
+		/// The number of times a given validator has been reported offline. This gets decremented
+		/// by one each era that passes.
 		pub SlashCount get(slash_count): map T::AccountId => u32;
 
-		/// 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)>;
+
+		/// True if the next session change will be a new era regardless of index.
+		pub ForceNewEra get(forcing_new_era): bool;
 	}
 	add_extra_genesis {
-		config(stakers): Vec<(T::AccountId, T::AccountId, BalanceOf, StakerStatus)>;
-		build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| {
+		config(stakers):
+			Vec<(T::AccountId, T::AccountId, BalanceOf, StakerStatus)>;
+		build(|
+			storage: &mut primitives::StorageOverlay,
+			_: &mut primitives::ChildrenStorageOverlay,
+			config: &GenesisConfig
+		| {
 			with_storage(storage, || {
 				for &(ref stash, ref controller, balance, ref status) in &config.stakers {
 					assert!(T::Currency::free_balance(&stash) >= balance);
@@ -556,18 +585,32 @@ decl_storage! {
 					};
 				}
 
-				>::select_validators();
+				if let (_, Some(validators)) = >::select_validators() {
+					>::put(&validators);
+				}
 			});
 		});
 	}
 }
 
+decl_event!(
+	pub enum Event where Balance = BalanceOf, ::AccountId {
+		/// All validators have been rewarded by the given balance.
+		Reward(Balance),
+		/// 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 its nominators) has been slashed by the given amount.
+		OfflineSlash(AccountId, Balance),
+	}
+);
+
 decl_module! {
 	pub struct Module for enum Call where origin: T::Origin {
 		fn deposit_event() = default;
 
-		/// Take the origin account as a stash and lock up `value` of its balance. `controller` will be the
-		/// account that controls it.
+		/// Take the origin account as a stash and lock up `value` of its balance. `controller` will
+		/// be the  account that controls it.
 		///
 		/// The dispatch origin for this call must be _Signed_ by the stash account.
 		///
@@ -583,7 +626,11 @@ decl_module! {
 		/// (which creates a bunch of storage items for an account). In essence, nothing prevents many accounts from
 		/// spamming `Staking` storage by bonding 1 UNIT. See test case: `bond_with_no_staked_value`.
 		/// # 
-		fn bond(origin, controller: ::Source, #[compact] value: BalanceOf, payee: RewardDestination) {
+		fn bond(origin,
+			controller: ::Source,
+			#[compact] value: BalanceOf,
+			payee: RewardDestination
+		) {
 			let stash = ensure_signed(origin)?;
 
 			if >::exists(&stash) {
@@ -603,11 +650,12 @@ decl_module! {
 
 			let stash_balance = T::Currency::free_balance(&stash);
 			let value = value.min(stash_balance);
-			Self::update_ledger(&controller, &StakingLedger { stash, total: value, active: value, unlocking: vec![] });
+			let item = StakingLedger { stash, total: value, active: value, unlocking: vec![] };
+			Self::update_ledger(&controller, &item);
 		}
 
-		/// Add some extra amount that have appeared in the stash `free_balance` into the balance up for
-		/// staking.
+		/// Add some extra amount that have appeared in the stash `free_balance` into the balance up
+		/// for  staking.
 		///
 		/// Use this if there are additional funds in your stash account that you wish to bond.
 		///
@@ -676,7 +724,7 @@ decl_module! {
 					ledger.active = Zero::zero();
 				}
 
-				let era = Self::current_era() + Self::bonding_duration();
+				let era = Self::current_era() + T::BondingDuration::get();
 				ledger.unlocking.push(UnlockChunk { value, era });
 				Self::update_ledger(&controller, &ledger);
 			}
@@ -720,7 +768,10 @@ decl_module! {
 			let controller = ensure_signed(origin)?;
 			let ledger = Self::ledger(&controller).ok_or("not a controller")?;
 			let stash = &ledger.stash;
-			ensure!(prefs.unstake_threshold <= MAX_UNSTAKE_THRESHOLD, "unstake threshold too large");
+			ensure!(
+				prefs.unstake_threshold <= MAX_UNSTAKE_THRESHOLD,
+				"unstake threshold too large"
+			);
 			>::remove(stash);
 			>::insert(stash, prefs);
 		}
@@ -807,27 +858,19 @@ decl_module! {
 			}
 			if controller != old_controller {
 				>::insert(&stash, &controller);
-				if let Some(l) = >::take(&old_controller) { >::insert(&controller, l) };
+				if let Some(l) = >::take(&old_controller) {
+					>::insert(&controller, l);
+				}
 			}
 		}
 
-		// ----- Root calls.
-
-		/// Set the number of sessions in an era.
-		fn set_sessions_per_era(#[compact] new: T::BlockNumber) {
-			>::put(new);
-		}
-
-		/// The length of the bonding duration in eras.
-		fn set_bonding_duration(#[compact] new: T::BlockNumber) {
-			>::put(new);
-		}
-
 		/// The ideal number of validators.
 		fn set_validator_count(#[compact] new: u32) {
 			>::put(new);
 		}
 
+		// ----- Root calls.
+
 		/// Force there to be a new era. This also forces a new session immediately after.
 		/// `apply_rewards` should be true for validators to get the session reward.
 		///
@@ -836,8 +879,8 @@ decl_module! {
 		/// - Triggers the Phragmen election. Expensive but not user-controlled.
 		/// - Depends on state: `O(|edges| * |validators|)`.
 		/// # 
-		fn force_new_era(apply_rewards: bool) -> Result {
-			Self::apply_force_new_era(apply_rewards)
+		fn force_new_era() {
+			Self::apply_force_new_era()
 		}
 
 		/// Set the offline slash grace period.
@@ -852,32 +895,9 @@ decl_module! {
 	}
 }
 
-decl_event!(
-	pub enum Event where Balance = BalanceOf, ::AccountId {
-		/// All validators have been rewarded by the given balance.
-		Reward(Balance),
-		/// 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 its nominators) has been slashed by the given amount.
-		OfflineSlash(AccountId, Balance),
-	}
-);
-
 impl Module {
-	/// Just force_new_era without origin check.
-	fn apply_force_new_era(apply_rewards: bool) -> Result {
-		>::put(());
-		>::apply_force_new_session(apply_rewards)
-	}
-
 	// PUBLIC IMMUTABLES
 
-	/// The length of a staking era in blocks.
-	pub fn era_length() -> T::BlockNumber {
-		Self::sessions_per_era() * >::length()
-	}
-
 	/// The total balance that can be slashed from a validator controller account as of
 	/// right now.
 	pub fn slashable_balance(who: &T::AccountId) -> BalanceOf {
@@ -887,29 +907,41 @@ impl Module {
 	// MUTABLES (DANGEROUS)
 
 	/// Update the ledger for a controller. This will also update the stash lock.
-	fn update_ledger(controller: &T::AccountId, ledger: &StakingLedger, T::BlockNumber>) {
-		T::Currency::set_lock(STAKING_ID, &ledger.stash, ledger.total, T::BlockNumber::max_value(), WithdrawReasons::all());
+	fn update_ledger(
+		controller: &T::AccountId,
+		ledger: &StakingLedger>
+	) {
+		T::Currency::set_lock(
+			STAKING_ID,
+			&ledger.stash,
+			ledger.total,
+			T::BlockNumber::max_value(),
+			WithdrawReasons::all()
+		);
 		>::insert(controller, ledger);
 	}
 
-	/// 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.
+	/// 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 the validator's 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);
 		let (mut imbalance, missing) = T::Currency::slash(stash, own_slash);
 		let own_slash = own_slash - missing;
-		// The amount remaining that we can't slash from the validator, that must be taken from the nominators.
+		// The amount remaining that we can't slash from the validator, that must be taken from the
+		// nominators.
 		let rest_slash = slash - own_slash;
 		if !rest_slash.is_zero() {
 			// The total to be slashed from the nominators.
 			let total = exposure.total - exposure.own;
 			if !total.is_zero() {
-				let safe_mul_rational = |b| b * rest_slash / total;// FIXME #1572 avoid overflow
+				// FIXME #1572 avoid overflow
+				let safe_mul_rational = |b| b * rest_slash / total;
 				for i in exposure.others.iter() {
 					// best effort - not much that can be done on fail.
 					imbalance.subsume(T::Currency::slash(&i.who, safe_mul_rational(i.value)).0)
@@ -942,8 +974,9 @@ impl Module {
 		}
 	}
 
-	/// 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.
+	/// 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);
 		let reward = reward - off_the_table;
@@ -953,7 +986,8 @@ impl Module {
 		} else {
 			let exposure = Self::stakers(stash);
 			let total = exposure.total.max(One::one());
-			let safe_mul_rational = |b| b * reward / total;// FIXME #1572:  avoid overflow
+			// FIXME #1572:  avoid overflow
+			let safe_mul_rational = |b| b * reward / total;
 			for i in &exposure.others {
 				let nom_payout = safe_mul_rational(i.value);
 				imbalance.maybe_subsume(Self::make_payout(&i.who, nom_payout));
@@ -964,34 +998,16 @@ impl Module {
 		T::Reward::on_unbalanced(imbalance);
 	}
 
-	/// Get the reward for the session, assuming it ends with this block.
-	fn this_session_reward(actual_elapsed: T::Moment) -> BalanceOf {
-		let ideal_elapsed = >::ideal_session_duration();
-		if ideal_elapsed.is_zero() {
-			return Self::current_session_reward();
-		}
-		// 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
-	/// move to a new era.
-	fn new_session(actual_elapsed: T::Moment, should_reward: bool) {
-		if should_reward {
-			// accumulate good session reward
-			let reward = Self::this_session_reward(actual_elapsed);
-			>::mutate(|r| *r += reward);
-		}
+	/// Session has just ended. Provide the validator set for the next session if it's an era-end.
+	fn new_session(session_index: SessionIndex) -> Option> {
+		// accumulate good session reward
+		let reward = Self::current_session_reward();
+		>::mutate(|r| *r += reward);
 
-		let session_index = >::current_index();
-		if >::take().is_some()
-			|| ((session_index - Self::last_era_length_change()) % Self::sessions_per_era()).is_zero()
-		{
-			Self::new_era();
+		if >::take() || session_index % T::SessionsPerEra::get() == 0 {
+			Self::new_era()
+		} else {
+			None
 		}
 	}
 
@@ -999,7 +1015,7 @@ impl Module {
 	///
 	/// NOTE: This always happens immediately before a session change to ensure that new validators
 	/// get a chance to set their session keys.
-	fn new_era() {
+	fn new_era() -> Option> {
 		// Payout
 		let reward = >::take();
 		if !reward.is_zero() {
@@ -1016,21 +1032,15 @@ impl Module {
 		}
 
 		// Increment current era.
-		>::put(&(>::get() + One::one()));
-
-		// Enact era length change.
-		if let Some(next_spe) = Self::next_sessions_per_era() {
-			if next_spe != Self::sessions_per_era() {
-				>::put(&next_spe);
-				>::put(&>::current_index());
-			}
-		}
+		>::mutate(|s| *s += 1);
 
 		// Reassign all Stakers.
-		let slot_stake = Self::select_validators();
+		let (slot_stake, maybe_new_validators) = Self::select_validators();
 
 		// Update the balances for rewarding according to the stakes.
 		>::put(Self::session_reward() * slot_stake);
+
+		maybe_new_validators
 	}
 
 	fn slashable_balance_of(stash: &T::AccountId) -> BalanceOf {
@@ -1040,7 +1050,7 @@ impl Module {
 	/// Select a new validator set from the assembled stakers and their role preferences.
 	///
 	/// Returns the new `SlotStake` value.
-	fn select_validators() -> BalanceOf {
+	fn select_validators() -> (BalanceOf, Option>) {
 		let maybe_elected_set = elect::(
 			Self::validator_count() as usize,
 			Self::minimum_validator_count().max(1) as usize,
@@ -1054,8 +1064,10 @@ impl Module {
 			let assignments = elected_set.1;
 
 			// helper closure.
-			let to_balance = |b: ExtendedBalance| >>::convert(b);
-			let to_votes = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance;
+			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
@@ -1082,7 +1094,8 @@ impl Module {
 				.iter()
 				.map(|e| (e, Self::slashable_balance_of(e)))
 				.for_each(|(e, s)| {
-					exposures.insert(e.clone(), Exposure { own: s, total: s, ..Default::default() });
+					let item = Exposure { own: s, total: s, ..Default::default() };
+					exposures.insert(e.clone(), item);
 				});
 
 			for (n, _, assignment) in &assignments_with_stakes {
@@ -1099,11 +1112,16 @@ impl Module {
 			}
 
 			// This optimization will most likely be only applied off-chain.
-			let do_equalise = false;
-			if do_equalise {
+			let do_equalize = false;
+			if do_equalize {
 				let tolerance = 10 as u128;
 				let iterations = 10 as usize;
-				phragmen::equalize::(&mut assignments_with_stakes, &mut exposures, tolerance, iterations);
+				phragmen::equalize::(
+					&mut assignments_with_stakes,
+					&mut exposures,
+					tolerance,
+					iterations
+				);
 			}
 
 			// Clear Stakers and reduce their slash_count.
@@ -1127,11 +1145,10 @@ impl Module {
 
 			// Set the new validator set.
 			>::put(&elected_stashes);
-			>::set_validators(
-				&elected_stashes.into_iter().map(|s| Self::bonded(s).unwrap_or_default()).collect::>()
-			);
-
-			slot_stake
+			let validators = elected_stashes.into_iter()
+				.map(|s| Self::bonded(s).unwrap_or_default())
+				.collect::>();
+			(slot_stake, Some(validators))
 		} else {
 			// There were not enough candidates for even our minimal level of functionality.
 			// This is bad.
@@ -1139,10 +1156,14 @@ impl Module {
 			// and let the chain keep producing blocks until we can decide on a sufficiently
 			// substantial set.
 			// TODO: #2494
-			Self::slot_stake()
+			(Self::slot_stake(), None)
 		}
 	}
 
+	fn apply_force_new_era() {
+		>::put(true);
+	}
+
 	/// Call when a validator is determined to be offline. `count` is the
 	/// number of offenses the validator has committed.
 	///
@@ -1190,7 +1211,7 @@ impl Module {
 					.unwrap_or(slash_exposure);
 				let _ = Self::slash_validator(&stash, slash);
 				>::remove(&stash);
-				let _ = Self::apply_force_new_era(false);
+				let _ = Self::apply_force_new_era();
 
 				RawEvent::OfflineSlash(stash.clone(), slash)
 			} else {
@@ -1202,9 +1223,9 @@ impl Module {
 	}
 }
 
-impl OnSessionChange for Module {
-	fn on_session_change(elapsed: T::Moment, should_reward: bool) {
-		Self::new_session(elapsed, should_reward);
+impl OnSessionEnding for Module {
+	fn on_session_ending(i: SessionIndex) -> Option> {
+		Self::new_session(i + 1)
 	}
 }
 
@@ -1219,12 +1240,3 @@ impl OnFreeBalanceZero for Module {
 		>::remove(stash);
 	}
 }
-
-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);
-		}
-	}
-}
diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs
index 5b3b22dda5..5eca0d524a 100644
--- a/srml/staking/src/mock.rs
+++ b/srml/staking/src/mock.rs
@@ -16,15 +16,17 @@
 
 //! Test utilities
 
-use primitives::{traits::{IdentityLookup, Convert}, BuildStorage, Perbill};
-use primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, ConvertUintAuthorityId};
+use primitives::{BuildStorage, Perbill};
+use primitives::traits::{IdentityLookup, Convert, OpaqueKeys, OnInitialize};
+use primitives::testing::{Header, UintAuthorityId};
 use substrate_primitives::{H256, Blake2Hasher};
 use runtime_io;
-use srml_support::{impl_outer_origin, assert_ok, traits::Currency};
-use crate::{GenesisConfig, Module, Trait, StakerStatus, ValidatorPrefs, RewardDestination};
+use srml_support::{impl_outer_origin, parameter_types, assert_ok, traits::Currency};
+use crate::{EraIndex, GenesisConfig, Module, Trait, StakerStatus, ValidatorPrefs, RewardDestination};
 
 /// The AccountId alias in this test module.
-pub type AccountIdType = u64;
+pub type AccountId = u64;
+pub type BlockNumber = u64;
 
 /// Simple structure that exposes how u64 currency can be represented as... u64.
 pub struct CurrencyToVoteHandler;
@@ -37,6 +39,15 @@ impl Convert for CurrencyToVoteHandler {
 	}
 }
 
+pub struct TestSessionHandler;
+impl session::SessionHandler for TestSessionHandler {
+	fn on_new_session(_changed: bool, _validators: &[(AccountId, Ks)]) {
+	}
+
+	fn on_disabled(_validator_index: usize) {
+	}
+}
+
 impl_outer_origin!{
 	pub enum Origin for Test {}
 }
@@ -44,23 +55,16 @@ impl_outer_origin!{
 // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted.
 #[derive(Clone, PartialEq, Eq, Debug)]
 pub struct Test;
-impl consensus::Trait for Test {
-	type Log = DigestItem;
-	type SessionKey = UintAuthorityId;
-	type InherentOfflineReport = ();
-}
 impl system::Trait for Test {
 	type Origin = Origin;
 	type Index = u64;
 	type BlockNumber = u64;
 	type Hash = H256;
 	type Hashing = ::primitives::traits::BlakeTwo256;
-	type Digest = Digest;
-	type AccountId = AccountIdType;
+	type AccountId = AccountId;
 	type Lookup = IdentityLookup;
 	type Header = Header;
 	type Event = ();
-	type Log = DigestItem;
 }
 impl balances::Trait for Test {
 	type Balance = u64;
@@ -71,15 +75,25 @@ impl balances::Trait for Test {
 	type TransferPayment = ();
 	type DustRemoval = ();
 }
+parameter_types! {
+	pub const Period: BlockNumber = 1;
+	pub const Offset: BlockNumber = 0;
+}
 impl session::Trait for Test {
-	type ConvertAccountIdToSessionKey = ConvertUintAuthorityId;
-	type OnSessionChange = Staking;
+	type OnSessionEnding = Staking;
+	type Keys = UintAuthorityId;
+	type ShouldEndSession = session::PeriodicSessions;
+	type SessionHandler = TestSessionHandler;
 	type Event = ();
 }
 impl timestamp::Trait for Test {
 	type Moment = u64;
 	type OnTimestampSet = ();
 }
+parameter_types! {
+	pub const SessionsPerEra: session::SessionIndex = 3;
+	pub const BondingDuration: EraIndex = 3;
+}
 impl Trait for Test {
 	type Currency = balances::Module;
 	type CurrencyToVote = CurrencyToVoteHandler;
@@ -87,13 +101,13 @@ impl Trait for Test {
 	type Event = ();
 	type Slash = ();
 	type Reward = ();
+	type SessionsPerEra = SessionsPerEra;
+	type BondingDuration = BondingDuration;
 }
 
 pub struct ExtBuilder {
 	existential_deposit: u64,
-	session_length: u64,
-	sessions_per_era: u64,
-	current_era: u64,
+	current_era: EraIndex,
 	reward: u64,
 	validator_pool: bool,
 	nominate: bool,
@@ -106,8 +120,6 @@ impl Default for ExtBuilder {
 	fn default() -> Self {
 		Self {
 			existential_deposit: 0,
-			session_length: 1,
-			sessions_per_era: 1,
 			current_era: 0,
 			reward: 10,
 			validator_pool: false,
@@ -124,15 +136,7 @@ impl ExtBuilder {
 		self.existential_deposit = existential_deposit;
 		self
 	}
-	pub fn session_length(mut self, session_length: u64) -> Self {
-		self.session_length = session_length;
-		self
-	}
-	pub fn sessions_per_era(mut self, sessions_per_era: u64) -> Self {
-		self.sessions_per_era = sessions_per_era;
-		self
-	}
-	pub fn _current_era(mut self, current_era: u64) -> Self {
+	pub fn _current_era(mut self, current_era: EraIndex) -> Self {
 		self.current_era = current_era;
 		self
 	}
@@ -163,14 +167,9 @@ impl ExtBuilder {
 		} else {
 			1
 		};
-		let _ = consensus::GenesisConfig::{
-			code: vec![],
-			authorities: vec![],
-		}.assimilate_storage(&mut t, &mut c);
 		let _ = session::GenesisConfig::{
-			session_length: self.session_length,
 			// NOTE: if config.nominate == false then 100 is also selected in the initial round.
-			validators: if self.validator_pool { vec![10, 20, 30, 40] }  else { vec![10, 20] },
+			validators: if self.validator_pool { vec![10, 20, 30, 40] } else { vec![10, 20] },
 			keys: vec![],
 		}.assimilate_storage(&mut t, &mut c);
 		let _ = balances::GenesisConfig::{
@@ -197,30 +196,26 @@ impl ExtBuilder {
 			creation_fee: 0,
 			vesting: vec![],
 		}.assimilate_storage(&mut t, &mut c);
+		let stake_21 = if self.fair { 1000 } else { 2000 };
+		let stake_31 = if self.validator_pool { balance_factor * 1000 } else { 1 };
+		let status_41 = if self.validator_pool {
+			StakerStatus::::Validator
+		} else {
+			StakerStatus::::Idle
+		};
+		let nominated = if self.nominate { vec![11, 21] } else { vec![] };
 		let _ = GenesisConfig::{
-			sessions_per_era: self.sessions_per_era,
 			current_era: self.current_era,
-			stakers: if self.validator_pool {
-				vec![
-					(11, 10, balance_factor * 1000, StakerStatus::::Validator),
-					(21, 20, balance_factor * if self.fair { 1000 } else { 2000 }, StakerStatus::::Validator),
-					(31, 30, balance_factor * 1000, if self.validator_pool { StakerStatus::::Validator } else { StakerStatus::::Idle }),
-					(41, 40, balance_factor * 1000, if self.validator_pool { StakerStatus::::Validator } else { StakerStatus::::Idle }),
-					// nominator
-					(101, 100, balance_factor * 500, if self.nominate { StakerStatus::::Nominator(vec![11, 21]) } else { StakerStatus::::Nominator(vec![]) })
-				]
-			} else {
-				vec![
-					(11, 10, balance_factor * 1000, StakerStatus::::Validator),
-					(21, 20, balance_factor * if self.fair { 1000 } else { 2000 }, StakerStatus::::Validator),
-					(31, 30, 1, StakerStatus::::Validator),
-					// nominator
-					(101, 100, balance_factor * 500, if self.nominate { StakerStatus::::Nominator(vec![11, 21]) } else { StakerStatus::::Nominator(vec![]) })
-				]
-			},
+			stakers: vec![
+				(11, 10, balance_factor * 1000, StakerStatus::::Validator),
+				(21, 20, stake_21, StakerStatus::::Validator),
+				(31, 30, stake_31, StakerStatus::::Validator),
+				(41, 40, balance_factor * 1000, status_41),
+				// nominator
+				(101, 100, balance_factor * 500, StakerStatus::::Nominator(nominated))
+			],
 			validator_count: self.validator_count,
 			minimum_validator_count: self.minimum_validator_count,
-			bonding_duration: self.sessions_per_era * self.session_length * 3,
 			session_reward: Perbill::from_millionths((1000000 * self.reward / balance_factor) as u32),
 			offline_slash: Perbill::from_percent(5),
 			current_session_reward: self.reward,
@@ -268,4 +263,17 @@ pub fn bond_nominator(acc: u64, val: u64, target: Vec) {
 	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));
-}
\ No newline at end of file
+}
+
+pub fn start_session(session_index: session::SessionIndex) {
+	for i in 0..(session_index - Session::current_index()) {
+		System::set_block_number((i + 1).into());
+		Session::on_initialize(System::block_number());
+	}
+	assert_eq!(Session::current_index(), session_index);
+}
+
+pub fn start_era(era_index: EraIndex) {
+	start_session((era_index * 3).into());
+	assert_eq!(Staking::current_era(), era_index);
+}
diff --git a/srml/staking/src/phragmen.rs b/srml/staking/src/phragmen.rs
index ba79de4869..50f63323bb 100644
--- a/srml/staking/src/phragmen.rs
+++ b/srml/staking/src/phragmen.rs
@@ -105,7 +105,8 @@ pub fn elect(
 
 	// 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 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, ..Default::default() }, stash_balance)
diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs
index 357a1c1427..555248493e 100644
--- a/srml/staking/src/tests.rs
+++ b/srml/staking/src/tests.rs
@@ -19,6 +19,7 @@
 use super::*;
 use runtime_io::with_externalities;
 use phragmen;
+use primitives::traits::OnInitialize;
 use srml_support::{assert_ok, assert_noop, assert_eq_uvec, EnumerableStorageMap};
 use mock::*;
 use srml_support::traits::{Currency, ReservableCurrency};
@@ -93,7 +94,7 @@ fn no_offline_should_work() {
 		assert_eq!(Staking::slash_count(&10), 0);
 		assert_eq!(Balances::free_balance(&10), 1);
 		// New era is not being forced
-		assert!(Staking::forcing_new_era().is_none());
+		assert!(!Staking::forcing_new_era());
 	});
 }
 
@@ -110,9 +111,7 @@ fn change_controller_works() {
 
 		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);
+		start_era(1);
 
 		assert_noop!(
 			Staking::validate(Origin::signed(10), ValidatorPrefs::default()),
@@ -150,7 +149,7 @@ fn invulnerability_should_work() {
 		assert!(>::exists(&11));
 		// New era not being forced
 		// NOTE: new era is always forced once slashing happens -> new validators need to be chosen.
-		assert!(Staking::forcing_new_era().is_none());
+		assert!(!Staking::forcing_new_era());
 	});
 }
 
@@ -180,7 +179,7 @@ fn offline_should_slash_and_kick() {
 		// Confirm account 10 has been removed as a validator
 		assert!(!>::exists(&11));
 		// A new era is forced due to slashing
-		assert!(Staking::forcing_new_era().is_some());
+		assert!(Staking::forcing_new_era());
 	});
 }
 
@@ -219,7 +218,7 @@ fn offline_grace_should_delay_slashing() {
 		// User gets slashed
 		assert!(Balances::free_balance(&11) < 70);
 		// New era is forced
-		assert!(Staking::forcing_new_era().is_some());
+		assert!(Staking::forcing_new_era());
 	});
 }
 
@@ -286,7 +285,7 @@ fn slashing_does_not_cause_underflow() {
 		});
 
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// Should not panic
 		Staking::on_offline_validator(10, 100);
@@ -303,8 +302,6 @@ fn rewards_should_work() {
 	// * rewards get paid per Era
 	// * Check that nominators are also rewarded
 	with_externalities(&mut ExtBuilder::default()
-		.session_length(3)
-		.sessions_per_era(3)
 	.build(),
 	|| {
 		let delay = 1;
@@ -316,9 +313,6 @@ fn rewards_should_work() {
 		assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller));
 
 		// Initial config should be correct
-		assert_eq!(Staking::era_length(), 9);
-		assert_eq!(Staking::sessions_per_era(), 3);
-		assert_eq!(Staking::last_era_length_change(), 0);
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 0);
 		assert_eq!(Staking::current_session_reward(), 10);
@@ -343,7 +337,7 @@ fn rewards_should_work() {
 		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());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 1);
 
@@ -354,24 +348,24 @@ fn rewards_should_work() {
 		block = 6; // Block 6 => Session 2 => Era 0
 		System::set_block_number(block);
 		Timestamp::set_timestamp(block*5 + delay);	// a little late.
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 2);
 
 		// session reward is the same,
 		assert_eq!(Staking::current_session_reward(), session_reward);
 		// though 2 will be deducted while stashed in the era reward due to delay
-		assert_eq!(Staking::current_era_reward(), 2*session_reward - delay);
+		assert_eq!(Staking::current_era_reward(), 2*session_reward); // - delay);
 
 		block = 9; // Block 9 => Session 3 => Era 1
 		System::set_block_number(block);
 		Timestamp::set_timestamp(block*5);  // back to being on time. no delays
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 1);
 		assert_eq!(Session::current_index(), 3);
 
-		assert_eq!(Balances::total_balance(&10), 1 + (3*session_reward - delay)/2);
-		assert_eq!(Balances::total_balance(&2), 500 + (3*session_reward - delay)/2);
+		assert_eq!(Balances::total_balance(&10), 1 + (3*session_reward)/2);
+		assert_eq!(Balances::total_balance(&2), 500 + (3*session_reward)/2);
 	});
 }
 
@@ -381,12 +375,9 @@ fn multi_era_reward_should_work() {
 	// The value of current_session_reward is set at the end of each era, based on
 	// slot_stake and session_reward.
 	with_externalities(&mut ExtBuilder::default()
-		.session_length(3)
-		.sessions_per_era(3)
 		.nominate(false)
 		.build(),
 	|| {
-		let delay = 1;
 		let session_reward = 10;
 
 		// This is set by the test config builder.
@@ -398,37 +389,21 @@ fn multi_era_reward_should_work() {
 		// Set payee to controller
 		assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller));
 
-		let mut block = 3;
-		// Block 3 => Session 1 => Era 0
-		System::set_block_number(block);
-		Timestamp::set_timestamp(block*5);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 0);
-		assert_eq!(Session::current_index(), 1);
+		start_session(1);
 
 		// 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);
 
-		block = 6; // Block 6 => Session 2 => Era 0
-		System::set_block_number(block);
-		Timestamp::set_timestamp(block*5 + delay);	// a little late.
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 0);
-		assert_eq!(Session::current_index(), 2);
+		start_session(2);
 
 		assert_eq!(Staking::current_session_reward(), session_reward);
-		assert_eq!(Staking::current_era_reward(), 2*session_reward - delay);
+		assert_eq!(Staking::current_era_reward(), 2*session_reward);
 
-		block = 9; // Block 9 => Session 3 => Era 1
-		System::set_block_number(block);
-		Timestamp::set_timestamp(block*5);  // back to being punktlisch. no delayss
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 1);
-		assert_eq!(Session::current_index(), 3);
+		start_session(3);
 
 		// 1 + sum of of the session rewards accumulated
-		let recorded_balance = 1 + 3*session_reward - delay;
+		let recorded_balance = 1 + 3*session_reward;
 		assert_eq!(Balances::total_balance(&10), recorded_balance);
 
 		// the reward for next era will be: session_reward * slot_stake
@@ -436,14 +411,13 @@ 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());
+		start_session(5);
 
 		// 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());
+		start_session(6);
 
 		// pay time
 		assert_eq!(Balances::total_balance(&10), 3*new_session_reward + recorded_balance);
@@ -457,7 +431,6 @@ fn staking_should_work() {
 	// * new ones will be chosen per era
 	// * either one can unlock the stash and back-down from being a validator via `chill`ing.
 	with_externalities(&mut ExtBuilder::default()
-		.sessions_per_era(3)
 		.nominate(false)
 		.fair(false) // to give 20 more staked value
 		.build(),
@@ -465,15 +438,12 @@ fn staking_should_work() {
 		// remember + compare this along with the test.
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 
-		assert_ok!(Staking::set_bonding_duration(2));
-		assert_eq!(Staking::bonding_duration(), 2);
-
 		// put some money in account that we'll use.
 		for i in 1..5 { let _ = Balances::make_free_balance_be(&i, 2000); }
 
 		// --- Block 1:
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 
 		// add a new candidate for being a validator. account 3 controlled by 4.
@@ -485,7 +455,7 @@ fn staking_should_work() {
 
 		// --- Block 2:
 		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 
 		// No effects will be seen so far. Era has not been yet triggered.
@@ -494,7 +464,7 @@ fn staking_should_work() {
 
 		// --- Block 3: the validators will now change.
 		System::set_block_number(3);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// 2 only voted for 4 and 20
 		assert_eq!(Session::validators().len(), 2);
@@ -504,7 +474,7 @@ fn staking_should_work() {
 
 		// --- Block 4: Unstake 4 as a validator, freeing up the balance stashed in 3
 		System::set_block_number(4);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// 4 will chill
 		Staking::chill(Origin::signed(4)).unwrap();
@@ -516,14 +486,14 @@ fn staking_should_work() {
 
 		// --- Block 5: nothing. 4 is still there.
 		System::set_block_number(5);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq_uvec!(Session::validators(), vec![20, 4]);
 		assert_eq!(Staking::current_era(), 1);
 
 
 		// --- Block 6: 4 will not be a validator.
 		System::set_block_number(6);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 2);
 		assert_eq!(Session::validators().contains(&4), false);
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
@@ -548,9 +518,7 @@ fn less_than_needed_candidates_works() {
 		assert_eq!(Staking::minimum_validator_count(), 1);
 		assert_eq_uvec!(Session::validators(), vec![30, 20, 10]);
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 1);
+		start_era(1);
 
 		// Previous set is selected. NO election algorithm is even executed.
 		assert_eq_uvec!(Session::validators(), vec![30, 20, 10]);
@@ -574,7 +542,6 @@ fn no_candidate_emergency_condition() {
 		.nominate(false)
 		.build(),
 	|| {
-		assert_eq!(Staking::era_length(), 1);
 		assert_eq!(Staking::validator_count(), 15);
 
 		// initial validators
@@ -584,7 +551,7 @@ fn no_candidate_emergency_condition() {
 
 		// trigger era
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// Previous ones are elected. chill is invalidates. TODO: #2494
 		assert_eq_uvec!(Session::validators(), vec![10, 20, 30, 40]);
@@ -663,16 +630,14 @@ fn nominating_and_rewards_should_work() {
 		assert_ok!(Staking::bond(Origin::signed(3), 4, 1000, RewardDestination::Controller));
 		assert_ok!(Staking::nominate(Origin::signed(4), vec![11, 21, 41]));
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 1);
+		start_era(1);
 
 		// 10 and 20 have more votes, they will be chosen by phragmen.
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 
 		// OLD validators must have already received some rewards.
-		assert_eq!(Balances::total_balance(&40), 1 + session_reward);
-		assert_eq!(Balances::total_balance(&30), 1 + session_reward);
+		assert_eq!(Balances::total_balance(&40), 1 + 3 * session_reward);
+		assert_eq!(Balances::total_balance(&30), 1 + 3 * session_reward);
 
 		// ------ check the staked value of all parties.
 
@@ -694,22 +659,21 @@ fn nominating_and_rewards_should_work() {
 		assert_eq!(Staking::stakers(41).total, 0);
 
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		start_era(2);
 		// next session reward.
-		let new_session_reward = Staking::session_reward() * Staking::slot_stake();
+		let new_session_reward = Staking::session_reward() * 3 * Staking::slot_stake();
 		// nothing else will happen, era ends and rewards are paid again,
 		// it is expected that nominators will also be paid. See below
 
 		// Nominator 2: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> 2/9 + 3/11
-		assert_eq!(Balances::total_balance(&2), initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11));
+		assert_eq!(Balances::total_balance(&2), initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11) - 1);
 		// Nominator 4: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> 2/9 + 3/11
-		assert_eq!(Balances::total_balance(&4), initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11));
+		assert_eq!(Balances::total_balance(&4), initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11) - 1);
 
 		// 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);
 		// 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);
+		assert_eq!(Balances::total_balance(&20), initial_balance + 5*new_session_reward/11+ 2);
 
 		check_exposure_all();
 	});
@@ -719,7 +683,6 @@ fn nominating_and_rewards_should_work() {
 fn nominators_also_get_slashed() {
 	// A nominator should be slashed if the validator they nominated is slashed
 	with_externalities(&mut ExtBuilder::default().nominate(false).build(), || {
-		assert_eq!(Staking::era_length(), 1);
 		assert_eq!(Staking::validator_count(), 2);
 		// slash happens immediately.
 		assert_eq!(Staking::offline_slash_grace(), 0);
@@ -742,8 +705,7 @@ fn nominators_also_get_slashed() {
 		assert_ok!(Staking::nominate(Origin::signed(2), vec![20, 10]));
 
 		// new era, pay rewards,
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// Nominator stash didn't collect any.
 		assert_eq!(Balances::total_balance(&2), initial_balance);
@@ -757,11 +719,11 @@ fn nominators_also_get_slashed() {
 		let nominator_slash = nominator_stake.min(total_slash - validator_slash);
 
 		// initial + first era reward + slash
-		assert_eq!(Balances::total_balance(&10), initial_balance + 10 - validator_slash);
+		assert_eq!(Balances::total_balance(&10), initial_balance + 30 - 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());
+		assert!(Staking::forcing_new_era());
 	});
 }
 
@@ -772,7 +734,6 @@ fn double_staking_should_fail() {
 	// * an account already bonded as stash cannot nominate.
 	// * an account already bonded as controller can nominate.
 	with_externalities(&mut ExtBuilder::default()
-		.sessions_per_era(2)
 		.build(),
 		|| {
 			let arbitrary_value = 5;
@@ -792,7 +753,6 @@ fn double_controlling_should_fail() {
 	// should test (in the same order):
 	// * an account already bonded as controller CANNOT be reused as the controller of another account.
 	with_externalities(&mut ExtBuilder::default()
-		.sessions_per_era(2)
 		.build(),
 		|| {
 			let arbitrary_value = 5;
@@ -806,70 +766,43 @@ fn double_controlling_should_fail() {
 #[test]
 fn session_and_eras_work() {
 	with_externalities(&mut ExtBuilder::default()
-		.sessions_per_era(2)
 		.build(),
 	|| {
-		assert_eq!(Staking::era_length(), 2);
-		assert_eq!(Staking::sessions_per_era(), 2);
-		assert_eq!(Staking::last_era_length_change(), 0);
 		assert_eq!(Staking::current_era(), 0);
-		assert_eq!(Session::current_index(), 0);
 
 		// Block 1: No change.
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_session(1);
 		assert_eq!(Session::current_index(), 1);
-		assert_eq!(Staking::sessions_per_era(), 2);
-		assert_eq!(Staking::last_era_length_change(), 0);
 		assert_eq!(Staking::current_era(), 0);
 
 		// Block 2: Simple era change.
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 2);
-		assert_eq!(Staking::sessions_per_era(), 2);
-		assert_eq!(Staking::last_era_length_change(), 0);
+		start_session(3);
+		assert_eq!(Session::current_index(), 3);
 		assert_eq!(Staking::current_era(), 1);
 
 		// Block 3: Schedule an era length change; no visible changes.
-		System::set_block_number(3);
-		assert_ok!(Staking::set_sessions_per_era(3));
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 3);
-		assert_eq!(Staking::sessions_per_era(), 2);
-		assert_eq!(Staking::last_era_length_change(), 0);
+		start_session(4);
+		assert_eq!(Session::current_index(), 4);
 		assert_eq!(Staking::current_era(), 1);
 
 		// Block 4: Era change kicks in.
-		System::set_block_number(4);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 4);
-		assert_eq!(Staking::sessions_per_era(), 3);
-		assert_eq!(Staking::last_era_length_change(), 4);
+		start_session(6);
+		assert_eq!(Session::current_index(), 6);
 		assert_eq!(Staking::current_era(), 2);
 
 		// Block 5: No change.
-		System::set_block_number(5);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 5);
-		assert_eq!(Staking::sessions_per_era(), 3);
-		assert_eq!(Staking::last_era_length_change(), 4);
+		start_session(7);
+		assert_eq!(Session::current_index(), 7);
 		assert_eq!(Staking::current_era(), 2);
 
 		// Block 6: No change.
-		System::set_block_number(6);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 6);
-		assert_eq!(Staking::sessions_per_era(), 3);
-		assert_eq!(Staking::last_era_length_change(), 4);
+		start_session(8);
+		assert_eq!(Session::current_index(), 8);
 		assert_eq!(Staking::current_era(), 2);
 
 		// Block 7: Era increment.
-		System::set_block_number(7);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 7);
-		assert_eq!(Staking::sessions_per_era(), 3);
-		assert_eq!(Staking::last_era_length_change(), 4);
+		start_session(9);
+		assert_eq!(Session::current_index(), 9);
 		assert_eq!(Staking::current_era(), 3);
 	});
 }
@@ -947,31 +880,39 @@ fn reward_destination_works() {
 		// Check the balance of the stash account
 		assert_eq!(Balances::free_balance(&11), 1000);
 		// Check how much is at stake
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000, active: 1000, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000,
+			active: 1000,
+			unlocking: vec![],
+		}));
 		// Check current session reward is 10
-		let session_reward0 = Staking::current_session_reward(); // 10
+		let session_reward0 = 3 * Staking::current_session_reward(); // 10
 
 		// Move forward the system for payment
-		System::set_block_number(1);
 		Timestamp::set_timestamp(5);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// Check that RewardDestination is Staked (default)
 		assert_eq!(Staking::payee(&11), RewardDestination::Staked);
 		// Check that reward went to the stash account of validator
 		assert_eq!(Balances::free_balance(&11), 1000 + session_reward0);
 		// Check that amount at stake increased accordingly
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + session_reward0, active: 1000 + session_reward0, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + session_reward0,
+			active: 1000 + session_reward0,
+			unlocking: vec![],
+		}));
 		// Update current session reward
-		let session_reward1 = Staking::current_session_reward(); // 1010 (1* slot_stake)
+		let session_reward1 = 3 * Staking::current_session_reward(); // 1010 (1* slot_stake)
 
 		//Change RewardDestination to Stash
 		>::insert(&11, RewardDestination::Stash);
 
 		// Move forward the system for payment
-		System::set_block_number(2);
 		Timestamp::set_timestamp(10);
-		Session::check_rotate_session(System::block_number());
+		start_era(2);
 
 		// Check that RewardDestination is Stash
 		assert_eq!(Staking::payee(&11), RewardDestination::Stash);
@@ -980,7 +921,12 @@ fn reward_destination_works() {
 		// Record this value
 		let recorded_stash_balance = 1000 + session_reward0 + session_reward1;
 		// Check that amount at stake is NOT increased
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + session_reward0, active: 1000 + session_reward0, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + session_reward0,
+			active: 1000 + session_reward0,
+			unlocking: vec![],
+		}));
 
 		// Change RewardDestination to Controller
 		>::insert(&11, RewardDestination::Controller);
@@ -989,17 +935,21 @@ fn reward_destination_works() {
 		assert_eq!(Balances::free_balance(&10), 1);
 
 		// Move forward the system for payment
-		System::set_block_number(3);
 		Timestamp::set_timestamp(15);
-		Session::check_rotate_session(System::block_number());
-		let session_reward2 = Staking::current_session_reward(); // 1010 (1* slot_stake)
+		start_era(3);
+		let session_reward2 = 3 * Staking::current_session_reward(); // 1010 (1* slot_stake)
 
 		// Check that RewardDestination is Controller
 		assert_eq!(Staking::payee(&11), RewardDestination::Controller);
 		// Check that reward went to the controller account
 		assert_eq!(Balances::free_balance(&10), 1 + session_reward2);
 		// Check that amount at stake is NOT increased
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + session_reward0, active: 1000 + session_reward0, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + session_reward0,
+			active: 1000 + session_reward0,
+			unlocking: vec![],
+		}));
 		// Check that amount in staked account is NOT increased.
 		assert_eq!(Balances::free_balance(&11), recorded_stash_balance);
 	});
@@ -1011,8 +961,6 @@ fn validator_payment_prefs_work() {
 	// Note: unstake threshold is being directly tested in slashing tests.
 	// This test will focus on validator payment.
 	with_externalities(&mut ExtBuilder::default()
-		.session_length(3)
-		.sessions_per_era(3)
 		.build(),
 	|| {
 		// Initial config
@@ -1044,7 +992,7 @@ fn validator_payment_prefs_work() {
 		// Block 3 => Session 1 => Era 0
 		let mut block = 3;
 		System::set_block_number(block);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 1);
 
@@ -1054,7 +1002,7 @@ fn validator_payment_prefs_work() {
 
 		block = 6; // Block 6 => Session 2 => Era 0
 		System::set_block_number(block);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 2);
 
@@ -1063,7 +1011,7 @@ fn validator_payment_prefs_work() {
 
 		block = 9; // Block 9 => Session 3 => Era 1
 		System::set_block_number(block);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 1);
 		assert_eq!(Session::current_index(), 3);
 
@@ -1093,7 +1041,12 @@ fn bond_extra_works() {
 		// Check that account 10 is bonded to account 11
 		assert_eq!(Staking::bonded(&11), Some(10));
 		// Check how much is at stake
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000, active: 1000, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000,
+			active: 1000,
+			unlocking: vec![],
+		}));
 
 		// Give account 11 some large free balance greater than total
 		let _ = Balances::make_free_balance_be(&11, 1000000);
@@ -1101,12 +1054,22 @@ fn bond_extra_works() {
 		// Call the bond_extra function from controller, add only 100
 		assert_ok!(Staking::bond_extra(Origin::signed(11), 100));
 		// There should be 100 more `total` and `active` in the ledger
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + 100, active: 1000 + 100, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + 100,
+			active: 1000 + 100,
+			unlocking: vec![],
+		}));
 
 		// Call the bond_extra function with a large number, should handle it
 		assert_ok!(Staking::bond_extra(Origin::signed(11), u64::max_value()));
 		// The full amount of the funds should now be in the total and active
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000000, active: 1000000, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000000,
+			active: 1000000,
+			unlocking: vec![],
+		}));
 	});
 }
 
@@ -1124,14 +1087,10 @@ fn bond_extra_and_withdraw_unbonded_works() {
 		// Set payee to controller. avoids confusion
 		assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller));
 
-		// Set unbonding era (bonding_duration) to 2
-		assert_ok!(Staking::set_bonding_duration(2));
-
 		// Give account 11 some large free balance greater than total
 		let _ = Balances::make_free_balance_be(&11, 1000000);
 
 		// Initial config should be correct
-		assert_eq!(Staking::sessions_per_era(), 1);
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 0);
 		assert_eq!(Staking::current_session_reward(), 10);
@@ -1140,58 +1099,65 @@ fn bond_extra_and_withdraw_unbonded_works() {
 		assert_eq!(Balances::total_balance(&10), 1);
 
 		// confirm that 10 is a normal validator and gets paid at the end of the era.
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// Initial state of 10
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000, active: 1000, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000,
+			active: 1000,
+			unlocking: vec![],
+		}));
 		assert_eq!(Staking::stakers(&11), Exposure { total: 1000, own: 1000, others: vec![] });
 
 		// deposit the extra 100 units
 		Staking::bond_extra(Origin::signed(11), 100).unwrap();
 
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + 100, active: 1000 + 100, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + 100,
+			active: 1000 + 100,
+			unlocking: vec![],
+		}));
 		// Exposure is a snapshot! only updated after the next era update.
 		assert_ne!(Staking::stakers(&11), Exposure { total: 1000 + 100, own: 1000 + 100, others: vec![] });
 
 		// trigger next era.
-		System::set_block_number(2);Timestamp::set_timestamp(10);Session::check_rotate_session(System::block_number());
+		Timestamp::set_timestamp(10);
+		start_era(2);
 		assert_eq!(Staking::current_era(), 2);
-		assert_eq!(Session::current_index(), 2);
 
 		// ledger should be the same.
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + 100, active: 1000 + 100, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + 100,
+			active: 1000 + 100,
+			unlocking: vec![],
+		}));
 		// Exposure is now updated.
 		assert_eq!(Staking::stakers(&11), Exposure { total: 1000 + 100, own: 1000 + 100, others: vec![] });
 
 		// Unbond almost all of the funds in stash.
 		Staking::unbond(Origin::signed(10), 1000).unwrap();
 		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
-			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 2}] })
+			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}] })
 		);
 
 		// Attempting to free the balances now will fail. 2 eras need to pass.
 		Staking::withdraw_unbonded(Origin::signed(10)).unwrap();
 		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
-			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 2}] }));
+			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}] }));
 
 		// trigger next era.
-		System::set_block_number(3);
-		Session::check_rotate_session(System::block_number());
-
-		assert_eq!(Staking::current_era(), 3);
-		assert_eq!(Session::current_index(), 3);
+		start_era(3);
 
 		// nothing yet
 		Staking::withdraw_unbonded(Origin::signed(10)).unwrap();
 		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
-			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 2}] }));
+			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}] }));
 
 		// trigger next era.
-		System::set_block_number(4);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 4);
-		assert_eq!(Session::current_index(), 4);
+		start_era(5);
 
 		Staking::withdraw_unbonded(Origin::signed(10)).unwrap();
 		// Now the value is free and the staking ledger is updated.
@@ -1208,19 +1174,14 @@ fn too_many_unbond_calls_should_not_work() {
 			assert_ok!(Staking::unbond(Origin::signed(10), 1));
 		}
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
-		// locked ar era 1 until 4
+		// locked at era 1 until 4
 		assert_ok!(Staking::unbond(Origin::signed(10), 1));
 		// can't do more.
 		assert_noop!(Staking::unbond(Origin::signed(10), 1), "can not schedule more unlock chunks");
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
-
-		System::set_block_number(3);
-		Session::check_rotate_session(System::block_number());
+		start_era(3);
 
 		assert_noop!(Staking::unbond(Origin::signed(10), 1), "can not schedule more unlock chunks");
 		// free up.
@@ -1262,23 +1223,21 @@ fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment(
 		>::insert(&20, StakingLedger { stash: 22, total: 69, active: 69, unlocking: vec![] });
 
 		// New era --> rewards are paid --> stakes are changed
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 1);
+		start_era(1);
 
 		// -- new balances + reward
-		assert_eq!(Staking::stakers(&11).total, 1000 + 10);
-		assert_eq!(Staking::stakers(&21).total, 69 + 10);
+		assert_eq!(Staking::stakers(&11).total, 1000 + 30);
+		assert_eq!(Staking::stakers(&21).total, 69 + 30);
 
 		// -- slot stake should also be updated.
-		assert_eq!(Staking::slot_stake(), 79);
+		assert_eq!(Staking::slot_stake(), 69 + 30);
 
 		// If 10 gets slashed now, it will be slashed by 5% of exposure.total * 2.pow(unstake_thresh)
 		Staking::on_offline_validator(10, 4);
 		// Confirm user has been reported
 		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*/);
+		assert_eq!(Balances::free_balance(&11), 1000 + 30 - 51 /*5% of 1030*/ * 8 /*2**3*/);
 
 		check_exposure_all();
 	});
@@ -1474,8 +1433,7 @@ fn phragmen_poc_works() {
 		assert_ok!(Staking::nominate(Origin::signed(4), vec![11, 21, 41]));
 
 		// New era => election algorithm will trigger
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 
@@ -1552,7 +1510,6 @@ fn switching_roles() {
 	// Test that it should be possible to switch between roles (nominator, validator, idle) with minimal overhead.
 	with_externalities(&mut ExtBuilder::default()
 		.nominate(false)
-		.sessions_per_era(3)
 		.build(),
 	|| {
 		// Reset reward destination
@@ -1576,21 +1533,21 @@ fn switching_roles() {
 
 		// new block
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// no change
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 
 		// new block
 		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// no change
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 
 		// new block --> ne era --> new validators
 		System::set_block_number(3);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// with current nominators 10 and 5 have the most stake
 		assert_eq_uvec!(Session::validators(), vec![6, 10]);
@@ -1605,16 +1562,16 @@ fn switching_roles() {
 		// Winners: 20 and 2
 
 		System::set_block_number(4);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq_uvec!(Session::validators(), vec![6, 10]);
 
 		System::set_block_number(5);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq_uvec!(Session::validators(), vec![6, 10]);
 
 		// ne era
 		System::set_block_number(6);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq_uvec!(Session::validators(), vec![2, 20]);
 		check_exposure_all();
 	});
@@ -1640,8 +1597,7 @@ fn wrong_vote_is_null() {
 		]));
 
 		// new block
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 	});
@@ -1666,35 +1622,44 @@ fn bond_with_no_staked_value() {
 		assert_ok!(Staking::bond(Origin::signed(1), 2, 1, RewardDestination::Controller));
 		assert_ok!(Staking::validate(Origin::signed(2), ValidatorPrefs::default()));
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![30, 20, 10]);
 
-		// min of 10, 20 and 30 (30 got a payout into staking so it raised it from 1 to 11).
-		assert_eq!(Staking::slot_stake(), 11);
+		// min of 10, 20 and 30 (30 got a payout into staking so it raised it from 1 to 31).
+		assert_eq!(Staking::slot_stake(), 31);
 
 		// make the stingy one elected.
 		assert_ok!(Staking::bond(Origin::signed(3), 4, 500, RewardDestination::Controller));
 		assert_ok!(Staking::nominate(Origin::signed(4), vec![1]));
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		// no rewards paid to 2 and 4 yet
+		assert_eq!(Balances::free_balance(&2), initial_balance_2);
+		assert_eq!(Balances::free_balance(&4), initial_balance_4);
+
+		start_era(2);
 
 		// Stingy one is selected
 		assert_eq_uvec!(Session::validators(), vec![20, 10, 2]);
-		assert_eq!(Staking::stakers(1), Exposure { own: 1, total: 501, others: vec![IndividualExposure { who: 3, value: 500}]});
+		assert_eq!(Staking::stakers(1), Exposure {
+			own: 1,
+			total: 501,
+			others: vec![IndividualExposure { who: 3, value: 500}],
+		});
 		// New slot stake.
 		assert_eq!(Staking::slot_stake(), 501);
 
-		System::set_block_number(3);
-		Session::check_rotate_session(System::block_number());
+		// no rewards paid to 2 and 4 yet
+		assert_eq!(Balances::free_balance(&2), initial_balance_2);
+		assert_eq!(Balances::free_balance(&4), initial_balance_4);
 
-		let reward = Staking::current_session_reward();
+		start_era(3);
+
+		let reward = Staking::current_session_reward() * 3;
 		// 2 will not get a reward of only 1
 		// 4 will get the rest
-		assert_eq!(Balances::free_balance(&2), initial_balance_2 + 1);
-		assert_eq!(Balances::free_balance(&4), initial_balance_4 + reward - 1);
+		assert_eq!(Balances::free_balance(&2), initial_balance_2 + 3);
+		assert_eq!(Balances::free_balance(&4), initial_balance_4 + reward - 3);
 	});
 }
 
@@ -1719,8 +1684,7 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() {
 		assert_ok!(Staking::bond(Origin::signed(1), 2, 1, RewardDestination::Controller));
 		assert_ok!(Staking::validate(Origin::signed(2), ValidatorPrefs::default()));
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// 2 is elected.
 		// and fucks up the slot stake.
@@ -1728,21 +1692,20 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() {
 		assert_eq!(Staking::slot_stake(), 1);
 
 		// Old ones are rewarded.
-		assert_eq!(Balances::free_balance(&10), initial_balance_10 + 10);
+		assert_eq!(Balances::free_balance(&10), initial_balance_10 + 30);
 		// no rewards paid to 2. This was initial election.
 		assert_eq!(Balances::free_balance(&2), initial_balance_2);
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		start_era(2);
 
 		assert_eq_uvec!(Session::validators(), vec![20, 10, 2]);
 		assert_eq!(Staking::slot_stake(), 1);
 
 		let reward = Staking::current_session_reward();
 		// 2 will not get the full reward, practically 1
-		assert_eq!(Balances::free_balance(&2), initial_balance_2 + reward.max(1));
+		assert_eq!(Balances::free_balance(&2), initial_balance_2 + reward.max(3));
 		// same for 10
-		assert_eq!(Balances::free_balance(&10), initial_balance_10 + 10 + reward.max(1));
+		assert_eq!(Balances::free_balance(&10), initial_balance_10 + 30 + reward.max(3));
 		check_exposure_all();
 	});
 }
@@ -1775,7 +1738,7 @@ fn phragmen_linear_worse_case_equalize() {
 		assert_ok!(Staking::set_validator_count(7));
 
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		assert_eq_uvec!(Session::validators(), vec![10, 60, 40, 20, 50, 30, 70]);
 
@@ -1813,7 +1776,7 @@ fn phragmen_chooses_correct_number_of_validators() {
 		assert_eq!(Session::validators().len(), 1);
 
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		assert_eq!(Session::validators().len(), 1);
 		check_exposure_all();
@@ -1832,8 +1795,7 @@ fn phragmen_score_should_be_accurate_on_large_stakes() {
 		bond_validator(6, u64::max_value()-1);
 		bond_validator(8, u64::max_value()-2);
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		assert_eq!(Session::validators(), vec![4, 2]);
 		check_exposure_all();
@@ -1855,8 +1817,7 @@ fn phragmen_should_not_overflow_validators() {
 		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());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![4, 2]);
 
@@ -1882,8 +1843,7 @@ fn phragmen_should_not_overflow_nominators() {
 		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());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![4, 2]);
 
@@ -1905,8 +1865,7 @@ fn phragmen_should_not_overflow_ultimate() {
 		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());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![4, 2]);
 
@@ -1958,8 +1917,7 @@ fn phragmen_large_scale_test() {
 			prefix + 25]
 		);
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// For manual inspection
 		println!("Validators are {:?}", Session::validators());
@@ -2008,8 +1966,7 @@ fn phragmen_large_scale_test_2() {
 
 		bond_nominator(50, nom_budget, vec![3, 5]);
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// Each exposure => total == own + sum(others)
 		check_exposure_all();
diff --git a/srml/support/procedural/src/lib.rs b/srml/support/procedural/src/lib.rs
index abd7e90951..280d2a317d 100644
--- a/srml/support/procedural/src/lib.rs
+++ b/srml/support/procedural/src/lib.rs
@@ -55,7 +55,8 @@ use proc_macro::TokenStream;
 ///
 ///   `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))`.
+///   /!\ 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.
 ///
diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs
index ee2275de7c..b481a42420 100644
--- a/srml/support/procedural/src/storage/impls.rs
+++ b/srml/support/procedural/src/storage/impls.rs
@@ -122,7 +122,11 @@ impl<'a, I: Iterator> Impls<'a, I> {
 				}
 
 				/// Mutate the value under a key.
-				fn mutate R, S: #scrate::HashedStorage<#scrate::Twox128>>(f: F, storage: &mut S) -> R {
+				fn mutate(f: F, storage: &mut S) -> R
+				where
+					F: FnOnce(&mut Self::Query) -> R,
+					S: #scrate::HashedStorage<#scrate::Twox128>,
+				{
 					let mut val = >::get(storage);
 
 					let ret = f(&mut val);
@@ -218,7 +222,11 @@ impl<'a, I: Iterator> Impls<'a, I> {
 				}
 
 				/// Mutate the value under a key
-				fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &mut S) -> R {
+				fn mutate(key: &#kty, f: F, storage: &mut S) -> R
+				where
+					F: FnOnce(&mut Self::Query) -> R,
+					S: #scrate::HashedStorage<#scrate::#hasher>,
+				{
 					let mut val = #as_map::get(key, storage);
 
 					let ret = f(&mut val);
@@ -355,7 +363,9 @@ impl<'a, I: Iterator> Impls<'a, I> {
 					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>)>
+					where
+						S: #scrate::HashedStorage<#scrate::#hasher>;
 
 					/// Generate linkage for newly inserted element.
 					///
@@ -525,7 +535,11 @@ impl<'a, I: Iterator> Impls<'a, I> {
 				}
 
 				/// Mutate the value under a key
-				fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &mut S) -> R {
+				fn mutate(key: &#kty, f: F, storage: &mut S) -> R
+				where
+					F: FnOnce(&mut Self::Query) -> R,
+					S: #scrate::HashedStorage<#scrate::#hasher>,
+				{
 					use self::#inner_module::Utils;
 
 					let key_for = &*#as_map::key_for(key);
@@ -548,7 +562,9 @@ impl<'a, I: Iterator> Impls<'a, I> {
 					Self::read_head(storage)
 				}
 
-				fn enumerate<'a, S: #scrate::HashedStorage<#scrate::#hasher>>(storage: &'a S) -> #scrate::rstd::boxed::Box + 'a> where
+				fn enumerate<'a, S>(storage: &'a S) -> #scrate::rstd::boxed::Box + 'a>
+				where
+					S: #scrate::HashedStorage<#scrate::#hasher>,
 					#kty: 'a,
 					#typ: 'a,
 				{
@@ -564,7 +580,13 @@ impl<'a, I: Iterator> Impls<'a, I> {
 		}
 	}
 
-	pub fn double_map(self, hasher: TokenStream2, 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,
@@ -653,7 +675,11 @@ impl<'a, I: Iterator> Impls<'a, I> {
 					storage.take(&key).#option_simple_1(|| #fielddefault)
 				}
 
-				fn mutate R, S: #scrate::UnhashedStorage>(key1: &#k1ty, key2: &#k2ty, f: F, storage: &mut S) -> R {
+				fn mutate(key1: &#k1ty, key2: &#k2ty, f: F, storage: &mut S) -> R
+				where
+					F: FnOnce(&mut Self::Query) -> R,
+					S: #scrate::UnhashedStorage,
+				{
 					let mut val = #as_double_map::get(key1, key2, storage);
 
 					let ret = f(&mut val);
diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs
index 452e94227c..37e4005825 100644
--- a/srml/support/src/dispatch.rs
+++ b/srml/support/src/dispatch.rs
@@ -750,6 +750,7 @@ macro_rules! decl_module {
 		$vis:vis fn $name:ident ( root $(, $param:ident : $param_ty:ty )* ) { $( $impl:tt )* }
 	) => {
 		$(#[doc = $doc_attr])*
+		#[allow(unreachable_code)]
 		$vis fn $name($( $param: $param_ty ),* ) -> $crate::dispatch::Result {
 			{ $( $impl )* }
 			Ok(())
diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs
index fec7249c23..ae825397a6 100644
--- a/srml/support/src/lib.rs
+++ b/srml/support/src/lib.rs
@@ -270,7 +270,8 @@ mod tests {
 			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 hasher(twox_64_concat) 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;
@@ -440,7 +441,9 @@ mod tests {
 				modifier: StorageFunctionModifier::Default,
 				ty: StorageFunctionType::Map{
 					hasher: StorageHasher::Twox128,
-					key: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), is_linked: true
+					key: DecodeDifferent::Encode("T::BlockNumber"),
+					value: DecodeDifferent::Encode("T::BlockNumber"),
+					is_linked: true
 				},
 				default: DecodeDifferent::Encode(
 					DefaultByteGetter(&__GetByteStructGenericData(PhantomData::))
@@ -452,7 +455,9 @@ mod tests {
 				modifier: StorageFunctionModifier::Optional,
 				ty: StorageFunctionType::Map{
 					hasher: StorageHasher::Blake2_256,
-					key: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), is_linked: true
+					key: DecodeDifferent::Encode("T::BlockNumber"),
+					value: DecodeDifferent::Encode("T::BlockNumber"),
+					is_linked: true
 				},
 				default: DecodeDifferent::Encode(
 					DefaultByteGetter(&__GetByteStructGenericData2(PhantomData::))
diff --git a/srml/support/src/runtime.rs b/srml/support/src/runtime.rs
index 1ce95a3f3c..27955f2f51 100644
--- a/srml/support/src/runtime.rs
+++ b/srml/support/src/runtime.rs
@@ -30,13 +30,13 @@
 ///
 /// ```nocompile
 /// construct_runtime!(
-///     pub enum Runtime with Log(interalIdent: DigestItem) where
+///     pub enum Runtime where
 ///         Block = Block,
 ///         NodeBlock = runtime::Block,
 ///         UncheckedExtrinsic = UncheckedExtrinsic
 ///     {
 ///         System: system,
-///         Test: test::{default, Log(Test)},
+///         Test: test::{default},
 ///         Test2: test_with_long_module::{Module},
 ///
 ///         // Module with instances
@@ -50,8 +50,8 @@
 /// The identifier `System` is the name of the module and the lower case identifier `system` is the
 /// name of the Rust module/crate for this Substrate module.
 ///
-/// The module `Test: test::{default, Log(Test)}` will expand to
-/// `Test: test::{Module, Call, Storage, Event, Config, Log(Test)}`.
+/// The module `Test: test::{default}` will expand to
+/// `Test: test::{Module, Call, Storage, Event, Config}`.
 ///
 /// The module `Test2: test_with_long_module::{Module}` will expand to
 /// `Test2: test_with_long_module::{Module}`.
@@ -64,7 +64,6 @@
 /// - `Event` or `Event` (if the event is generic) or `Event` (if also over instance)
 /// - `Origin` or `Origin` (if the origin is generic) or `Origin` (if also over instance)
 /// - `Config` or `Config` (if the config is generic) or `Config` (if also over instance)
-/// - `Log( $(IDENT),* )`
 /// - `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.
@@ -82,7 +81,7 @@ macro_rules! construct_runtime {
 	// form)
 
 	(
-		pub enum $runtime:ident with Log ($log_internal:ident: DigestItem<$( $log_genarg:ty ),+>)
+		pub enum $runtime:ident
 			where
 				Block = $block:ident,
 				NodeBlock = $node_block:ty,
@@ -97,7 +96,6 @@ macro_rules! construct_runtime {
 				$block;
 				$node_block;
 				$uncheckedextrinsic;
-				$log_internal < $( $log_genarg ),* >;
 			};
 			{};
 			$( $rest )*
@@ -204,7 +202,6 @@ macro_rules! construct_runtime {
 			$block:ident;
 			$node_block:ty;
 			$uncheckedextrinsic:ident;
-			$log_internal:ident <$( $log_genarg:ty ),+>;
 		};
 		{
 			$(
@@ -264,14 +261,6 @@ macro_rules! construct_runtime {
 				$name: $module:: $( < $module_instance >:: )? { $( $modules )* }
 			)*
 		);
-		$crate::__decl_outer_log!(
-			$runtime;
-			$log_internal < $( $log_genarg ),* >;
-			{};
-			$(
-				$name: $module:: $( < $module_instance >:: )? { $( $modules $( ( $( $modules_args )* ) )* )* }
-			)*
-		);
 		$crate::__decl_outer_config!(
 			$runtime;
 			{};
@@ -539,26 +528,6 @@ macro_rules! __decl_all_modules {
 #[macro_export]
 #[doc(hidden)]
 macro_rules! __decl_outer_dispatch {
-	(
-		$runtime:ident;
-		$( $parsed_modules:ident :: $parsed_name:ident ),*;
-		System: $module:ident::{
-			$ignore:ident $( <$ignor:ident> )* $(, $modules:ident $( <$modules_generic:ident> )* )*
-		}
-		$(, $rest_name:ident : $rest_module:ident::{
-			$( $rest_modules:ident $( <$rest_modules_generic:ident> )* ),*
-		})*;
-	) => {
-		$crate::__decl_outer_dispatch!(
-			$runtime;
-			$( $parsed_modules :: $parsed_name ),*;
-			$(
-				$rest_name: $rest_module::{
-					$( $rest_modules $( <$rest_modules_generic> )* ),*
-				}
-			),*;
-		);
-	};
 	(
 		$runtime:ident;
 		$( $parsed_modules:ident :: $parsed_name:ident ),*;
@@ -698,75 +667,6 @@ macro_rules! __decl_runtime_metadata {
 				$( $parsed_modules::Module $( < $module_instance > )? with $( $withs )* , )*
 		);
 	}
-
-}
-/// A private macro that generates Log enum for the runtime. See impl_outer_log macro.
-#[macro_export]
-#[doc(hidden)]
-macro_rules! __decl_outer_log {
-	(
-		$runtime:ident;
-		$log_internal:ident <$( $log_genarg:ty ),+>;
-		{ $( $parsed:tt )* };
-		$name:ident: $module:ident:: $(<$module_instance:ident>::)? {
-			Log ( $( $args:ident )* ) $( $modules:ident $( ( $( $modules_args:ident )* ) )* )*
-		}
-		$( $rest:tt )*
-	) => {
-		$crate::__decl_outer_log!(
-			$runtime;
-			$log_internal < $( $log_genarg ),* >;
-			{ $( $parsed )* $module $(<$module_instance>)? ( $( $args )* )};
-			$( $rest )*
-		);
-	};
-	(
-		$runtime:ident;
-		$log_internal:ident <$( $log_genarg:ty ),+>;
-		{ $( $parsed:tt )* };
-		$name:ident: $module:ident:: $(<$module_instance:ident>::)? {
-			$ignore:ident $( ( $( $args_ignore:ident )* ) )*
-			$( $modules:ident $( ( $( $modules_args:ident )* ) )* )*
-		}
-		$( $rest:tt )*
-	) => {
-		$crate::__decl_outer_log!(
-			$runtime;
-			$log_internal < $( $log_genarg ),* >;
-			{ $( $parsed )* };
-			$name: $module:: $(<$module_instance>::)? { $( $modules $( ( $( $modules_args )* ) )* )* }
-			$( $rest )*
-		);
-	};
-	(
-		$runtime:ident;
-		$log_internal:ident <$( $log_genarg:ty ),+>;
-		{ $( $parsed:tt )* };
-		$name:ident: $module:ident:: $(<$module_instance:ident>::)? {}
-		$( $rest:tt )*
-	) => {
-		$crate::__decl_outer_log!(
-			$runtime;
-			$log_internal < $( $log_genarg ),* >;
-			{ $( $parsed )* };
-			$( $rest )*
-		);
-	};
-	(
-		$runtime:ident;
-		$log_internal:ident <$( $log_genarg:ty ),+>;
-		{ $(
-			$parsed_modules:ident $(< $parsed_instance:ident >)? ( $( $parsed_args:ident )* )
-		)* };
-	) => {
-		$crate::paste::item! {
-			$crate::runtime_primitives::impl_outer_log!(
-				pub enum Log($log_internal: DigestItem<$( $log_genarg ),*>) for $runtime {
-					$( [< $parsed_modules $(_ $parsed_instance)? >] $(< $parsed_modules::$parsed_instance >)? ( $( $parsed_args ),* ) ),*
-				}
-			);
-		}
-	};
 }
 
 /// A private macro that generates GenesisConfig for the runtime. See impl_outer_config macro.
diff --git a/srml/support/src/storage/hashed/mod.rs b/srml/support/src/storage/hashed/mod.rs
index 5c65cf0513..5ca718df8c 100644
--- a/srml/support/src/storage/hashed/mod.rs
+++ b/srml/support/src/storage/hashed/mod.rs
@@ -24,73 +24,136 @@ 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 {
+pub fn get(hash: &HashFn, key: &[u8]) -> Option
+where
+	T: Decode + Sized,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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 {
+pub fn get_or_default(hash: &HashFn, key: &[u8]) -> T
+where
+	T: Decode + Sized + Default,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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 {
+pub fn get_or(hash: &HashFn, key: &[u8], default_value: T) -> T
+where
+	T: Decode + Sized,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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 {
+pub fn get_or_else(hash: &HashFn, key: &[u8], default_value: F) -> T
+where
+	T: Decode + Sized,
+	F: FnOnce() -> T,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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) {
+pub fn put(hash: &HashFn, key: &[u8], value: &T)
+where
+	T: Encode,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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 {
+pub fn take(hash: &HashFn, key: &[u8]) -> Option
+where
+	T: Decode + Sized,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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 {
+pub fn take_or_default(hash: &HashFn, key: &[u8]) -> T
+where
+	T: Decode + Sized + Default,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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 {
+pub fn take_or(hash: &HashFn, key: &[u8], default_value: T) -> T
+where
+	T: Decode + Sized,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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 {
+pub fn take_or_else(hash: &HashFn, key: &[u8], default_value: F) -> T
+where
+	T: Decode + Sized,
+	F: FnOnce() -> T,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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 {
+pub fn exists(hash: &HashFn, key: &[u8]) -> bool
+where
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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]) {
+pub fn kill(hash: &HashFn, key: &[u8])
+where
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[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> {
+pub fn get_raw(hash: &HashFn, key: &[u8]) -> Option>
+where
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	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]) {
+pub fn put_raw(hash: &HashFn, key: &[u8], value: &[u8])
+where
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::put_raw(&hash(key).as_ref(), value)
 }
 
diff --git a/srml/support/src/storage/unhashed/generator.rs b/srml/support/src/storage/unhashed/generator.rs
index e6bbb5905f..3c56ae0ac5 100644
--- a/srml/support/src/storage/unhashed/generator.rs
+++ b/srml/support/src/storage/unhashed/generator.rs
@@ -27,11 +27,15 @@ pub trait UnhashedStorage {
 
 	/// 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") }
+	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() }
+	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);
@@ -50,10 +54,14 @@ pub trait UnhashedStorage {
 	}
 
 	/// 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") }
+	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() }
+	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>;
diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs
index df9f648c18..f7b4a4bd3a 100644
--- a/srml/support/test/tests/instance.rs
+++ b/srml/support/test/tests/instance.rs
@@ -16,14 +16,11 @@
 
 #![recursion_limit="128"]
 
-#[cfg(feature = "std")]
-use serde::Serialize;
 use runtime_io::{with_externalities, Blake2Hasher};
 use srml_support::rstd::prelude::*;
 use srml_support::rstd as rstd;
-use srml_support::codec::{Encode, Decode};
 use srml_support::runtime_primitives::{generic, BuildStorage};
-use srml_support::runtime_primitives::traits::{BlakeTwo256, Block as _, Verify, Digest};
+use srml_support::runtime_primitives::traits::{BlakeTwo256, Block as _, Verify};
 use srml_support::Parameter;
 use inherents::{
 	ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError
@@ -42,14 +39,12 @@ mod system {
 		type Origin: Into, Self::Origin>>
 			+ From>;
 		type BlockNumber;
-		type Digest: Digest;
 		type Hash;
 		type AccountId;
 		type Event: From;
-		type Log: From> + Into>;
 	}
 
-	pub type DigestItemOf = <::Digest as Digest>::Item;
+	pub type DigestItemOf = generic::DigestItem<::Hash>;
 
 	srml_support::decl_module! {
 		pub struct Module for enum Call where origin: T::Origin {
@@ -58,7 +53,7 @@ mod system {
 		}
 	}
 	impl Module {
-		pub fn deposit_log(_item: ::Item) {
+		pub fn deposit_log(_item: DigestItemOf) {
 			unimplemented!();
 		}
 	}
@@ -90,16 +85,6 @@ mod system {
 
 	pub type Origin = RawOrigin<::AccountId>;
 
-	pub type Log = RawLog<
-		::Hash,
-	>;
-
-	#[cfg_attr(feature = "std", derive(Serialize, Debug))]
-	#[derive(Encode, Decode, PartialEq, Eq, Clone)]
-	pub enum RawLog {
-		ChangesTrieRoot(H),
-	}
-
 	pub fn ensure_root(o: OuterOrigin) -> Result<(), &'static str>
 		where OuterOrigin: Into, OuterOrigin>>
 	{
@@ -110,14 +95,13 @@ mod system {
 // Test for:
 // * No default instance
 // * Custom InstantiableTrait
-// * Origin, Inherent, Log, Event
+// * Origin, Inherent, Event
 mod module1 {
 	use super::*;
 
 	pub trait Trait: system::Trait {
 		type Event: From> + Into<::Event>;
 		type Origin: From>;
-		type Log: From> + Into>;
 	}
 
 	srml_support::decl_module! {
@@ -126,18 +110,10 @@ mod module1 {
 
 			fn one() {
 				Self::deposit_event(RawEvent::AnotherVariant(3));
-				Self::deposit_log(RawLog::AmountChange(3));
 			}
 		}
 	}
 
-	impl, I: InstantiableThing> Module {
-		/// Deposit one of this module's logs.
-		fn deposit_log(log: Log) {
-			>::deposit_log(>::Log::from(log).into());
-		}
-	}
-
 	srml_support::decl_storage! {
 		trait Store for Module, I: InstantiableThing> as Module1 {
 			pub Value config(value): u64;
@@ -160,22 +136,6 @@ mod module1 {
 		_Phantom(rstd::marker::PhantomData<(T, I)>),
 	}
 
-	pub type Log = RawLog<
-		T,
-		I,
-		::Hash,
-	>;
-
-	/// A logs in this module.
-	#[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)>),
-		AmountChange(u32),
-		ChangesTrieRoot(Hash),
-		AuthoritiesChange(Vec<()>),
-	}
-
 	pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"12345678";
 
 	impl, I: InstantiableThing> ProvideInherent for Module {
@@ -203,7 +163,6 @@ mod module2 {
 		type Amount: Parameter + Default;
 		type Event: From> + Into<::Event>;
 		type Origin: From>;
-		type Log: From> + Into>;
 	}
 
 	impl, I: Instance> Currency for Module {}
@@ -237,19 +196,6 @@ mod module2 {
 		_Phantom(rstd::marker::PhantomData<(T, I)>),
 	}
 
-	pub type Log = RawLog<
-		T,
-		I,
-	>;
-
-	/// A logs in this module.
-	#[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)>),
-		AmountChange(u32),
-	}
-
 	pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"12345678";
 
 	impl, I: Instance> ProvideInherent for Module {
@@ -286,36 +232,30 @@ mod module3 {
 impl module1::Trait for Runtime {
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module1::Trait for Runtime {
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module2::Trait for Runtime {
 	type Amount = u16;
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module2::Trait for Runtime {
 	type Amount = u32;
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module2::Trait for Runtime {
 	type Amount = u32;
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module2::Trait for Runtime {
 	type Amount = u64;
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module3::Trait for Runtime {
 	type Currency = Module2_2;
@@ -331,30 +271,28 @@ impl system::Trait for Runtime {
 	type Hash = H256;
 	type Origin = Origin;
 	type BlockNumber = BlockNumber;
-	type Digest = generic::Digest;
 	type AccountId = AccountId;
 	type Event = Event;
-	type Log = Log;
 }
 
 srml_support::construct_runtime!(
-	pub enum Runtime with Log(InternalLog: DigestItem) where
+	pub enum Runtime where
 		Block = Block,
 		NodeBlock = Block,
 		UncheckedExtrinsic = UncheckedExtrinsic
 	{
-		System: system::{Module, Call, Event, Log(ChangesTrieRoot)},
-		Module1_1: module1::::{Module, Call, Storage, Event, Config, Origin, Log(ChangesTrieRoot, AuthoritiesChange), Inherent},
-		Module1_2: module1::::{Module, Call, Storage, Event, Config, Origin, Log(ChangesTrieRoot, AuthoritiesChange), Inherent},
-		Module2: module2::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent},
-		Module2_1: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent},
-		Module2_2: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent},
-		Module2_3: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent},
+		System: system::{Module, Call, Event},
+		Module1_1: module1::::{Module, Call, Storage, Event, Config, Origin, Inherent},
+		Module1_2: module1::::{Module, Call, Storage, Event, Config, Origin, Inherent},
+		Module2: module2::{Module, Call, Storage, Event, Config, Origin, Inherent},
+		Module2_1: module2::::{Module, Call, Storage, Event, Config, Origin, Inherent},
+		Module2_2: module2::::{Module, Call, Storage, Event, Config, Origin, Inherent},
+		Module2_3: module2::::{Module, Call, Storage, Event, Config, Origin, Inherent},
 		Module3: module3::{Module, Call},
 	}
 );
 
-pub type Header = generic::Header;
+pub type Header = generic::Header;
 pub type Block = generic::Block;
 pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic;
 
diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs
index a5a87ff2e5..ee4ebf711a 100644
--- a/srml/system/benches/bench.rs
+++ b/srml/system/benches/bench.rs
@@ -21,7 +21,7 @@ use runtime_io::{with_externalities, Blake2Hasher};
 use substrate_primitives::H256;
 use primitives::{
 	BuildStorage, traits::{BlakeTwo256, IdentityLookup},
-	testing::{Digest, DigestItem, Header},
+	testing::Header,
 };
 
 mod module {
@@ -62,12 +62,10 @@ impl system::Trait for Runtime {
 	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 {
diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs
index 61db997cfc..73f8c94209 100644
--- a/srml/system/src/lib.rs
+++ b/srml/system/src/lib.rs
@@ -76,10 +76,10 @@ use serde::Serialize;
 use rstd::prelude::*;
 #[cfg(any(feature = "std", test))]
 use rstd::map;
-use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, One, Bounded, Lookup,
-	Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, CurrentHeight, BlockNumberToHash,
-	MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup
-};
+use primitives::{generic, traits::{self, CheckEqual, SimpleArithmetic,
+	SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, CurrentHeight, BlockNumberToHash,
+	MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, One, Bounded, Lookup,
+}};
 #[cfg(any(feature = "std", test))]
 use primitives::traits::Zero;
 use substrate_primitives::storage::well_known_keys;
@@ -89,6 +89,7 @@ use srml_support::{
 };
 use safe_mix::TripletMix;
 use parity_codec::{Encode, Decode};
+use crate::{self as system};
 
 #[cfg(any(feature = "std", test))]
 use runtime_io::{twox_128, TestExternalities, Blake2Hasher};
@@ -165,10 +166,6 @@ pub trait Trait: 'static + Eq + Clone {
 	/// The hashing system (algorithm) being used in the runtime (e.g. Blake2).
 	type Hashing: Hash;
 
-	/// Collection of (light-client-relevant) logs for a block to be included verbatim in the block header.
-	type Digest:
-		Parameter + Member + MaybeSerializeDebugButNotDeserialize + Default + traits::Digest;
-
 	/// The user account identifier type for the runtime.
 	type AccountId: Parameter + Member + MaybeSerializeDebug + MaybeDisplay + Ord + Default;
 
@@ -183,17 +180,17 @@ pub trait Trait: 'static + Eq + Clone {
 	type Header: Parameter + traits::Header<
 		Number = Self::BlockNumber,
 		Hash = Self::Hash,
-		Digest = Self::Digest
 	>;
 
 	/// The aggregated event type of the runtime.
 	type Event: Parameter + Member + From;
-
-	/// A piece of information that can be part of the digest (as a digest item).
-	type Log: From> + Into>;
 }
 
-pub type DigestItemOf = <::Digest as traits::Digest>::Item;
+pub type DigestOf = generic::Digest<::Hash>;
+pub type DigestItemOf = generic::DigestItem<::Hash>;
+
+pub type Key = Vec;
+pub type KeyValue = (Vec, Vec);
 
 decl_module! {
 	pub struct Module for enum Call where origin: T::Origin {
@@ -201,6 +198,35 @@ decl_module! {
 		pub fn deposit_event(event: T::Event) {
 			Self::deposit_event_indexed(&[], event);
 		}
+
+		/// Make some on-chain remark.
+		fn remark(origin, _remark: Vec) {
+			ensure_signed(origin)?;
+		}
+
+		/// Set the number of pages in the WebAssembly environment's heap.
+		fn set_heap_pages(pages: u64) {
+			storage::unhashed::put_raw(well_known_keys::HEAP_PAGES, &pages.encode());
+		}
+
+		/// Set the new code.
+		pub fn set_code(new: Vec) {
+			storage::unhashed::put_raw(well_known_keys::CODE, &new);
+		}
+
+		/// Set some items of storage.
+		fn set_storage(items: Vec) {
+			for i in &items {
+				storage::unhashed::put_raw(&i.0, &i.1);
+			}
+		}
+
+		/// Kill some items from storage.
+		fn kill_storage(keys: Vec) {
+			for key in &keys {
+				storage::unhashed::kill(&key);
+			}
+		}
 	}
 }
 
@@ -262,38 +288,6 @@ impl From> for RawOrigin {
 /// Exposed trait-generic origin type.
 pub type Origin = RawOrigin<::AccountId>;
 
-pub type Log = RawLog<
-	::Hash,
->;
-
-/// A log in this module.
-#[cfg_attr(feature = "std", derive(Serialize, Debug))]
-#[derive(Encode, Decode, PartialEq, Eq, Clone)]
-pub enum RawLog {
-	/// Changes trie has been computed for this block. Contains the root of
-	/// changes trie.
-	ChangesTrieRoot(Hash),
-}
-
-impl RawLog {
-	/// Try to cast the log entry as ChangesTrieRoot log entry.
-	pub fn as_changes_trie_root(&self) -> Option<&Hash> {
-		match *self {
-			RawLog::ChangesTrieRoot(ref item) => Some(item),
-		}
-	}
-}
-
-// Implementation for tests outside of this crate.
-#[cfg(any(feature = "std", test))]
-impl From> for primitives::testing::DigestItem {
-	fn from(log: RawLog) -> primitives::testing::DigestItem {
-		match log {
-			RawLog::ChangesTrieRoot(root) => primitives::generic::DigestItem::ChangesTrieRoot(root),
-		}
-	}
-}
-
 // Create a Hash with 69 for each byte,
 // only used to build genesis config.
 #[cfg(feature = "std")]
@@ -331,7 +325,7 @@ decl_storage! {
 		/// Extrinsics root of the current block, also part of the block header.
 		ExtrinsicsRoot get(extrinsics_root): T::Hash;
 		/// Digest of the current block, also part of the block header.
-		Digest get(digest): T::Digest;
+		Digest get(digest): DigestOf;
 		/// Events deposited for the current block.
 		Events get(events): Vec>;
 		/// The number of events in the `Events` list.
@@ -360,10 +354,13 @@ decl_storage! {
 	}
 	add_extra_genesis {
 		config(changes_trie_config): Option;
+		#[serde(with = "substrate_primitives::bytes")]
+		config(code): Vec;
 
 		build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| {
 			use parity_codec::Encode;
 
+			storage.insert(well_known_keys::CODE.to_vec(), config.code.clone());
 			storage.insert(well_known_keys::EXTRINSIC_INDEX.to_vec(), 0u32.encode());
 
 			if let Some(ref changes_trie_config) = config.changes_trie_config {
@@ -540,7 +537,7 @@ impl Module {
 		number: &T::BlockNumber,
 		parent_hash: &T::Hash,
 		txs_root: &T::Hash,
-		digest: &T::Digest,
+		digest: &DigestOf,
 	) {
 		// populate environment
 		storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32);
@@ -575,8 +572,7 @@ impl Module {
 		// we can't compute changes trie root earlier && put it to the Digest
 		// 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();
+			let item = generic::DigestItem::ChangesTrieRoot(storage_changes_root);
 			digest.push(item);
 		}
 
@@ -592,9 +588,9 @@ impl Module {
 	}
 
 	/// Deposits a log and ensures it matches the block's log data.
-	pub fn deposit_log(item: ::Item) {
+	pub fn deposit_log(item: DigestItemOf) {
 		let mut l = >::get();
-		traits::Digest::push(&mut l, item);
+		l.push(item);
 		>::put(l);
 	}
 
@@ -772,7 +768,7 @@ mod tests {
 	use substrate_primitives::H256;
 	use primitives::BuildStorage;
 	use primitives::traits::{BlakeTwo256, IdentityLookup};
-	use primitives::testing::{Digest, DigestItem, Header};
+	use primitives::testing::Header;
 	use srml_support::impl_outer_origin;
 
 	impl_outer_origin!{
@@ -787,12 +783,10 @@ mod tests {
 		type BlockNumber = u64;
 		type Hash = H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = u16;
-		type Log = DigestItem;
 	}
 
 	impl From for u16 {
diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs
index 24750215d1..e9c0d85a20 100644
--- a/srml/timestamp/src/lib.rs
+++ b/srml/timestamp/src/lib.rs
@@ -335,7 +335,7 @@ mod tests {
 	use substrate_primitives::H256;
 	use runtime_primitives::BuildStorage;
 	use runtime_primitives::traits::{BlakeTwo256, IdentityLookup};
-	use runtime_primitives::testing::{Digest, DigestItem, Header};
+	use runtime_primitives::testing::Header;
 
 	impl_outer_origin! {
 		pub enum Origin for Test {}
@@ -349,12 +349,10 @@ mod tests {
 		type BlockNumber = u64;
 		type Hash = H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = ();
-		type Log = DigestItem;
 	}
 	impl Trait for Test {
 		type Moment = u64;
diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs
index fb3b68a6e9..95fa90f88f 100644
--- a/srml/treasury/src/lib.rs
+++ b/srml/treasury/src/lib.rs
@@ -338,7 +338,7 @@ mod tests {
 	use substrate_primitives::{H256, Blake2Hasher};
 	use runtime_primitives::BuildStorage;
 	use runtime_primitives::traits::{BlakeTwo256, OnFinalize, IdentityLookup};
-	use runtime_primitives::testing::{Digest, DigestItem, Header};
+	use runtime_primitives::testing::Header;
 
 	impl_outer_origin! {
 		pub enum Origin for Test {}
@@ -352,12 +352,10 @@ mod tests {
 		type BlockNumber = u64;
 		type Hash = H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = ();
-		type Log = DigestItem;
 	}
 	impl balances::Trait for Test {
 		type Balance = u64;
diff --git a/subkey/src/main.rs b/subkey/src/main.rs
index 5bd698575d..b38bffd772 100644
--- a/subkey/src/main.rs
+++ b/subkey/src/main.rs
@@ -146,7 +146,8 @@ fn execute(matches: clap::ArgMatches) where
 			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"),
+				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()));
-- 
GitLab


From 53083f16c5e816cf184efd915d045056a035123d Mon Sep 17 00:00:00 2001
From: Stefanie Doll 
Date: Fri, 14 Jun 2019 16:34:49 +0200
Subject: [PATCH 116/140] fixed formatting (#2864)

---
 core/rpc/src/state/mod.rs | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs
index 474dfe10ed..a229dad138 100644
--- a/core/rpc/src/state/mod.rs
+++ b/core/rpc/src/state/mod.rs
@@ -88,7 +88,8 @@ pub trait StateApi {
 	fn child_storage(
 		&self,
 		child_storage_key: StorageKey,
-		key: StorageKey, hash: Option
+		key: StorageKey,
+		hash: Option
 	) -> Result>;
 
 	/// Returns the hash of a child storage entry at a block's state.
@@ -96,7 +97,8 @@ pub trait StateApi {
 	fn child_storage_hash(
 		&self,
 		child_storage_key: StorageKey,
-		key: StorageKey, hash: Option
+		key: StorageKey,
+		hash: Option
 	) -> Result>;
 
 	/// Returns the size of a child storage entry at a block's state.
-- 
GitLab


From bbf0ba12a9325178d451f9ad571ea199e8dce7bf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= 
Date: Sat, 15 Jun 2019 07:41:46 +0200
Subject: [PATCH 117/140] Make `impl_opaque_keys` more scope independent
 (#2873)

---
 core/sr-primitives/Cargo.toml    | 4 ++--
 core/sr-primitives/src/lib.rs    | 2 +-
 core/sr-primitives/src/traits.rs | 4 ++--
 node/runtime/Cargo.toml          | 2 +-
 node/runtime/src/lib.rs          | 3 ---
 5 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/core/sr-primitives/Cargo.toml b/core/sr-primitives/Cargo.toml
index bb6c7b9951..b549b4c71e 100644
--- a/core/sr-primitives/Cargo.toml
+++ b/core/sr-primitives/Cargo.toml
@@ -8,7 +8,7 @@ edition = "2018"
 num-traits = { version = "0.2", default-features = false }
 integer-sqrt = { version = "0.1.2" }
 serde = { version = "1.0", optional = true, features = ["derive"] }
-parity-codec = { version = "3.3", default-features = false, features = ["derive"] }
+codec = { package = "parity-codec", version = "3.5.1", default-features = false, features = ["derive"] }
 substrate-primitives = { path = "../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 }
@@ -26,6 +26,6 @@ std = [
 	"log",
 	"rstd/std",
 	"runtime_io/std",
-	"parity-codec/std",
+	"codec/std",
 	"substrate-primitives/std",
 ]
diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs
index 80948798e0..1ef8bc2275 100644
--- a/core/sr-primitives/src/lib.rs
+++ b/core/sr-primitives/src/lib.rs
@@ -21,7 +21,7 @@
 #![cfg_attr(not(feature = "std"), no_std)]
 
 #[doc(hidden)]
-pub use parity_codec as codec;
+pub use codec;
 #[cfg(feature = "std")]
 #[doc(hidden)]
 pub use serde;
diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs
index a34af862de..3c2b51d7fd 100644
--- a/core/sr-primitives/src/traits.rs
+++ b/core/sr-primitives/src/traits.rs
@@ -868,8 +868,8 @@ macro_rules! impl_opaque_keys {
 			$($rest:tt)*
 		}
 	) => {
-		#[derive(Default, Clone, PartialEq, Eq, Encode, Decode)]
-		#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))]
+		#[derive(Default, Clone, PartialEq, Eq, $crate::codec::Encode, $crate::codec::Decode)]
+		#[cfg_attr(feature = "std", derive(Debug, $crate::serde::Serialize, $crate::serde::Deserialize))]
 		pub struct $name($( pub $t ,)*);
 		impl $crate::traits::OpaqueKeys for $name {
 			fn count() -> usize {
diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml
index b42ecd67ee..a87ce511cd 100644
--- a/node/runtime/Cargo.toml
+++ b/node/runtime/Cargo.toml
@@ -7,7 +7,7 @@ edition = "2018"
 [dependencies]
 integer-sqrt = { version = "0.1.2" }
 safe-mix = { version = "1.0", default-features = false }
-parity-codec = { version = "3.3", default-features = false, features = ["derive"] }
+parity-codec = { version = "3.5.1", default-features = false, features = ["derive"] }
 substrate-primitives = { path = "../../core/primitives", default-features = false }
 client = { package = "substrate-client", path = "../../core/client", default-features = false }
 rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false }
diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs
index 8c5b9c3b1b..0c5a2da317 100644
--- a/node/runtime/src/lib.rs
+++ b/node/runtime/src/lib.rs
@@ -21,7 +21,6 @@
 #![recursion_limit="256"]
 
 use rstd::prelude::*;
-use parity_codec::{Encode, Decode};
 use support::{construct_runtime, parameter_types};
 use substrate_primitives::u32_trait::{_1, _2, _3, _4};
 use node_primitives::{
@@ -132,8 +131,6 @@ parameter_types! {
 }
 
 type SessionHandlers = (Grandpa, Aura);
-#[cfg(feature = "std")]
-use serde::{Serialize, Deserialize};
 impl_opaque_keys! {
 	pub struct SessionKeys(grandpa::AuthorityId, AuraId);
 }
-- 
GitLab


From d1934e98089927e4114152d4f718cd8a155da9b1 Mon Sep 17 00:00:00 2001
From: Niklas Adolfsson 
Date: Sat, 15 Jun 2019 09:01:37 +0200
Subject: [PATCH 118/140] fix(compile warn): &mut Trait -> dyn &mut Trait
 (#2872)

---
 core/client/db/src/lib.rs         | 2 +-
 core/network/src/protocol/sync.rs | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs
index b44953a80f..b1c0596a0e 100644
--- a/core/client/db/src/lib.rs
+++ b/core/client/db/src/lib.rs
@@ -715,7 +715,7 @@ impl> Backend {
 	}
 
 	#[cfg(any(test, feature = "test-helpers"))]
-	pub fn new_test_db(keep_blocks: u32, canonicalization_delay: u64, db: Arc) -> Self {
+	pub fn new_test_db(keep_blocks: u32, canonicalization_delay: u64, db: Arc) -> Self {
 
 		let db_setting = DatabaseSettings {
 			cache_size: None,
diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs
index 0f78348b18..751e3f872e 100644
--- a/core/network/src/protocol/sync.rs
+++ b/core/network/src/protocol/sync.rs
@@ -587,7 +587,7 @@ impl ChainSync {
 	/// 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, protocol: &mut Context, processed_blocks: Vec, has_error: bool) {
+	pub fn blocks_processed(&mut self, protocol: &mut dyn Context, processed_blocks: Vec, has_error: bool) {
 		for hash in processed_blocks {
 			self.queue_blocks.remove(&hash);
 		}
-- 
GitLab


From 16ffaf76de4c5061cb7636c06ad902372f90d0cc Mon Sep 17 00:00:00 2001
From: Wei Tang 
Date: Sat, 15 Jun 2019 10:26:22 +0200
Subject: [PATCH 119/140] Maintain TotalIssurance integrity in case of sudo
 set_balance (#2871)

* Maintain TotalInsurance integrity in case of sudo set_balance

* Fix set_balance docs

* Update impl_version
---
 node/runtime/src/lib.rs  |  2 +-
 srml/balances/src/lib.rs | 34 ++++++++++++++++++++++++++--------
 2 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs
index 0c5a2da317..3719130eda 100644
--- a/node/runtime/src/lib.rs
+++ b/node/runtime/src/lib.rs
@@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
 	impl_name: create_runtime_str!("substrate-node"),
 	authoring_version: 10,
 	spec_version: 94,
-	impl_version: 94,
+	impl_version: 95,
 	apis: RUNTIME_API_VERSIONS,
 };
 
diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs
index 3c3762833b..72ec997206 100644
--- a/srml/balances/src/lib.rs
+++ b/srml/balances/src/lib.rs
@@ -142,11 +142,15 @@
 //! ## Genesis config
 //!
 //! The Balances module depends on the [`GenesisConfig`](./struct.GenesisConfig.html).
+//!
+//! ## Assumptions
+//!
+//! * Total issued balanced of all accounts should be less than `Trait::Balance::max_value()`.
 
 #![cfg_attr(not(feature = "std"), no_std)]
 
 use rstd::prelude::*;
-use rstd::{cmp, result};
+use rstd::{cmp, result, mem};
 use parity_codec::{Codec, Encode, Decode};
 use srml_support::{StorageValue, StorageMap, Parameter, decl_event, decl_storage, decl_module};
 use srml_support::traits::{
@@ -373,10 +377,10 @@ decl_module! {
 
 		/// Set the balances of a given account.
 		///
-		/// This will alter `FreeBalance` and `ReservedBalance` in storage.
+		/// This will alter `FreeBalance` and `ReservedBalance` in storage. it will
+		/// also decrease the total issuance of the system (`TotalIssuance`).
 		/// If the new free or reserved balance is below the existential deposit,
-		/// it will also decrease the total issuance of the system (`TotalIssuance`)
-		/// and reset the account nonce (`system::AccountNonce`).
+		/// it will reset the account nonce (`system::AccountNonce`).
 		///
 		/// The dispatch origin for this call is `root`.
 		///
@@ -386,12 +390,26 @@ decl_module! {
 		/// # 
 		fn set_balance(
 			who: ::Source,
-			#[compact] free: T::Balance,
-			#[compact] reserved: T::Balance
+			#[compact] new_free: T::Balance,
+			#[compact] new_reserved: T::Balance
 		) {
 			let who = T::Lookup::lookup(who)?;
-			Self::set_free_balance(&who, free);
-			Self::set_reserved_balance(&who, reserved);
+
+			let current_free = >::get(&who);
+			if new_free > current_free {
+				mem::drop(PositiveImbalance::::new(new_free - current_free));
+			} else if new_free < current_free {
+				mem::drop(NegativeImbalance::::new(current_free - new_free));
+			}
+			Self::set_free_balance(&who, new_free);
+
+			let current_reserved = >::get(&who);
+			if new_reserved > current_reserved {
+				mem::drop(PositiveImbalance::::new(new_reserved - current_reserved));
+			} else if new_reserved < current_reserved {
+				mem::drop(NegativeImbalance::::new(current_reserved - new_reserved));
+			}
+			Self::set_reserved_balance(&who, new_reserved);
 		}
 	}
 }
-- 
GitLab


From a672bac41eda32ef2a8b5521bf11bedf5055ce1b Mon Sep 17 00:00:00 2001
From: Gavin Wood 
Date: Sat, 15 Jun 2019 10:29:34 +0200
Subject: [PATCH 120/140] Disable validators but don't kick them (#2870)

* Disable validators but don't kick them

* Bump runtime

* Remove stray printlns
---
 core/sr-primitives/src/traits.rs |  2 +-
 node/runtime/src/lib.rs          |  2 +-
 srml/session/src/lib.rs          |  8 +++++++-
 srml/staking/src/lib.rs          |  3 +--
 srml/staking/src/mock.rs         | 34 ++++++++++++++++++++++++++++----
 srml/staking/src/tests.rs        | 14 ++++++-------
 6 files changed, 47 insertions(+), 16 deletions(-)

diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs
index 3c2b51d7fd..b2bb7ab805 100644
--- a/core/sr-primitives/src/traits.rs
+++ b/core/sr-primitives/src/traits.rs
@@ -819,7 +819,7 @@ pub trait ValidateUnsigned {
 
 /// Opaque datatype that may be destructured into a series of raw byte slices (which represent
 /// individual keys).
-pub trait OpaqueKeys {
+pub trait OpaqueKeys: Clone {
 	/// Return the number of encoded keys.
 	fn count() -> usize { 0 }
 	/// Get the raw bytes of key with index `i`.
diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs
index 3719130eda..42d89c57ad 100644
--- a/node/runtime/src/lib.rs
+++ b/node/runtime/src/lib.rs
@@ -58,7 +58,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
 	spec_name: create_runtime_str!("node"),
 	impl_name: create_runtime_str!("substrate-node"),
 	authoring_version: 10,
-	spec_version: 94,
+	spec_version: 95,
 	impl_version: 95,
 	apis: RUNTIME_API_VERSIONS,
 };
diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs
index a74edf52d7..3ae7c98012 100644
--- a/srml/session/src/lib.rs
+++ b/srml/session/src/lib.rs
@@ -359,10 +359,16 @@ impl Module {
 	}
 
 	/// Disable the validator of index `i`.
-	pub fn disable(i: usize) {
+	pub fn disable_index(i: usize) {
 		T::SessionHandler::on_disabled(i);
 		>::put(true);
 	}
+
+	/// Disable the validator identified by `c`. (If using with the staking module, this would be
+	/// their *controller* account.)
+	pub fn disable(c: &T::AccountId) -> rstd::result::Result<(), ()> {
+		Self::validators().iter().position(|i| i == c).map(Self::disable_index).ok_or(())
+	}
 }
 
 impl OnFreeBalanceZero for Module {
diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs
index 1f6e023d18..086f78bd53 100644
--- a/srml/staking/src/lib.rs
+++ b/srml/staking/src/lib.rs
@@ -1210,8 +1210,7 @@ impl Module {
 					.map(|x| x.min(slash_exposure))
 					.unwrap_or(slash_exposure);
 				let _ = Self::slash_validator(&stash, slash);
-				>::remove(&stash);
-				let _ = Self::apply_force_new_era();
+				let _ = >::disable(&controller);
 
 				RawEvent::OfflineSlash(stash.clone(), slash)
 			} else {
diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs
index 5eca0d524a..ea4fcbd8f9 100644
--- a/srml/staking/src/mock.rs
+++ b/srml/staking/src/mock.rs
@@ -16,6 +16,7 @@
 
 //! Test utilities
 
+use std::{collections::HashSet, cell::RefCell};
 use primitives::{BuildStorage, Perbill};
 use primitives::traits::{IdentityLookup, Convert, OpaqueKeys, OnInitialize};
 use primitives::testing::{Header, UintAuthorityId};
@@ -39,15 +40,32 @@ impl Convert for CurrencyToVoteHandler {
 	}
 }
 
+thread_local! {
+	static SESSION: RefCell<(Vec, HashSet)> = RefCell::new(Default::default());
+}
+
 pub struct TestSessionHandler;
 impl session::SessionHandler for TestSessionHandler {
-	fn on_new_session(_changed: bool, _validators: &[(AccountId, Ks)]) {
+	fn on_new_session(_changed: bool, validators: &[(AccountId, Ks)]) {
+		SESSION.with(|x|
+			*x.borrow_mut() = (validators.iter().map(|x| x.0.clone()).collect(), HashSet::new())
+		);
 	}
 
-	fn on_disabled(_validator_index: usize) {
+	fn on_disabled(validator_index: usize) {
+		SESSION.with(|d| {
+			let mut d = d.borrow_mut();
+			let value = d.0[validator_index];
+			println!("on_disabled {} -> {}", validator_index, value);
+			d.1.insert(value);
+		})
 	}
 }
 
+pub fn is_disabled(validator: AccountId) -> bool {
+	SESSION.with(|d| d.borrow().1.contains(&validator))
+}
+
 impl_outer_origin!{
 	pub enum Origin for Test {}
 }
@@ -167,9 +185,10 @@ impl ExtBuilder {
 		} else {
 			1
 		};
+		let validators = if self.validator_pool { vec![10, 20, 30, 40] } else { vec![10, 20] };
 		let _ = session::GenesisConfig::{
 			// NOTE: if config.nominate == false then 100 is also selected in the initial round.
-			validators: if self.validator_pool { vec![10, 20, 30, 40] } else { vec![10, 20] },
+			validators,
 			keys: vec![],
 		}.assimilate_storage(&mut t, &mut c);
 		let _ = balances::GenesisConfig::{
@@ -225,7 +244,14 @@ impl ExtBuilder {
 		let _ = timestamp::GenesisConfig::{
 			minimum_period: 5,
 		}.assimilate_storage(&mut t, &mut c);
-		t.into()
+		let mut ext = t.into();
+		runtime_io::with_externalities(&mut ext, || {
+			let validators = Session::validators();
+			SESSION.with(|x|
+				*x.borrow_mut() = (validators.clone(), HashSet::new())
+			);
+		});
+		ext
 	}
 }
 
diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs
index 555248493e..1124261989 100644
--- a/srml/staking/src/tests.rs
+++ b/srml/staking/src/tests.rs
@@ -154,7 +154,7 @@ fn invulnerability_should_work() {
 }
 
 #[test]
-fn offline_should_slash_and_kick() {
+fn offline_should_slash_and_disable() {
 	// Test that an offline validator gets slashed and kicked
 	with_externalities(&mut ExtBuilder::default().build(), || {
 		// Give account 10 some balance
@@ -169,6 +169,8 @@ fn offline_should_slash_and_kick() {
 		assert_eq!(Staking::slash_count(&11), 0);
 		// Account 10 has the funds we just gave it
 		assert_eq!(Balances::free_balance(&11), 1000);
+		// Account 10 is not yet disabled.
+		assert!(!is_disabled(10));
 		// Report account 10 as offline, one greater than unstake threshold
 		Staking::on_offline_validator(10, 4);
 		// Confirm user has been reported
@@ -176,10 +178,8 @@ fn offline_should_slash_and_kick() {
 		// Confirm balance has been reduced by 2^unstake_threshold * offline_slash() * amount_at_stake.
 		let slash_base = Staking::offline_slash() * Staking::stakers(11).total;
 		assert_eq!(Balances::free_balance(&11), 1000 - 2_u64.pow(3) * slash_base);
-		// Confirm account 10 has been removed as a validator
-		assert!(!>::exists(&11));
-		// A new era is forced due to slashing
-		assert!(Staking::forcing_new_era());
+		// Confirm account 10 has been disabled.
+		assert!(is_disabled(10));
 	});
 }
 
@@ -218,7 +218,7 @@ fn offline_grace_should_delay_slashing() {
 		// User gets slashed
 		assert!(Balances::free_balance(&11) < 70);
 		// New era is forced
-		assert!(Staking::forcing_new_era());
+		assert!(is_disabled(10));
 	});
 }
 
@@ -723,7 +723,7 @@ fn nominators_also_get_slashed() {
 		assert_eq!(Balances::total_balance(&2), initial_balance - nominator_slash);
 		check_exposure_all();
 		// Because slashing happened.
-		assert!(Staking::forcing_new_era());
+		assert!(is_disabled(10));
 	});
 }
 
-- 
GitLab


From 3569b4a90c8bd67f896cfc215aa400a7654f1bda Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= 
Date: Sat, 15 Jun 2019 10:30:04 +0200
Subject: [PATCH 121/140] Fix several warnings and remove some forbid(warnings)
 (#2874)

---
 core/consensus/aura/src/lib.rs     | 2 +-
 core/consensus/babe/src/lib.rs     | 4 +---
 core/finality-grandpa/src/lib.rs   | 6 +-----
 core/finality-grandpa/src/tests.rs | 6 +++---
 core/network/src/service/tests.rs  | 6 +++---
 srml/staking/src/tests.rs          | 8 ++++----
 6 files changed, 13 insertions(+), 19 deletions(-)

diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs
index dc8a5ca2e4..896b2d4b00 100644
--- a/core/consensus/aura/src/lib.rs
+++ b/core/consensus/aura/src/lib.rs
@@ -889,7 +889,7 @@ mod tests {
 			.map(|_| ())
 			.map_err(|_| ());
 
-		runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap();
+		let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap();
 	}
 
 	#[test]
diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs
index 8a81612183..3e1f38077f 100644
--- a/core/consensus/babe/src/lib.rs
+++ b/core/consensus/babe/src/lib.rs
@@ -24,7 +24,6 @@
 //! 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;
 mod digest;
 use digest::CompatibleDigestItem;
@@ -434,7 +433,6 @@ fn find_pre_digest(header: &B::Header) -> Result(
 	client: &C,
 	slot_now: u64,
@@ -950,7 +948,7 @@ mod tests {
 			.map(drop)
 			.map_err(drop);
 
-		runtime.block_on(wait_for.select(drive_to_completion).map_err(drop)).unwrap();
+		let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(drop)).unwrap();
 	}
 
 	#[test]
diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs
index 02cdd2cfd1..e7410ca44a 100644
--- a/core/finality-grandpa/src/lib.rs
+++ b/core/finality-grandpa/src/lib.rs
@@ -51,15 +51,11 @@
 //! 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)]
 
 use futures::prelude::*;
 use log::{debug, info, warn};
 use futures::sync::mpsc;
-use client::{
-	BlockchainEvents, CallExecutor, Client, backend::Backend,
-	error::Error as ClientError,
-};
+use client::{BlockchainEvents, CallExecutor, Client, backend::Backend, error::Error as ClientError};
 use client::blockchain::HeaderBackend;
 use parity_codec::Encode;
 use runtime_primitives::traits::{
diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs
index 95ed722d3f..8afa495334 100644
--- a/core/finality-grandpa/src/tests.rs
+++ b/core/finality-grandpa/src/tests.rs
@@ -534,7 +534,7 @@ fn run_to_completion_with(
 		.map(|_| ())
 		.map_err(|_| ());
 
-	runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap();
+	let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap();
 
 	let highest_finalized = *highest_finalized.read();
 	highest_finalized
@@ -628,7 +628,7 @@ fn finalize_3_voters_1_full_observer() {
 		.map(|_| ())
 		.map_err(|_| ());
 
-	runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap();
+	let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap();
 }
 
 #[test]
@@ -802,7 +802,7 @@ fn transition_3_voters_twice_1_full_observer() {
 		.map(|_| ())
 		.map_err(|_| ());
 
-	runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap();
+	let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap();
 }
 
 #[test]
diff --git a/core/network/src/service/tests.rs b/core/network/src/service/tests.rs
index 1bcd4e90f9..f18f471e7a 100644
--- a/core/network/src/service/tests.rs
+++ b/core/network/src/service/tests.rs
@@ -88,7 +88,7 @@ fn basic_two_nodes_connectivity() {
 	});
 
 	let combined = fut1.select(fut2).map_err(|(err, _)| err);
-	tokio::runtime::Runtime::new().unwrap().block_on_all(combined).unwrap();
+	let _ = tokio::runtime::Runtime::new().unwrap().block_on_all(combined).unwrap();
 }
 
 #[test]
@@ -141,7 +141,7 @@ fn two_nodes_transfer_lots_of_packets() {
 	});
 
 	let combined = fut1.select(fut2).map_err(|(err, _)| err);
-	tokio::runtime::Runtime::new().unwrap().block_on(combined).unwrap();
+	let _ = tokio::runtime::Runtime::new().unwrap().block_on(combined).unwrap();
 }
 
 #[test]
@@ -255,7 +255,7 @@ 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();
+	let _ = tokio::runtime::Runtime::new().unwrap().block_on_all(combined).unwrap();
 }
 
 #[test]
diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs
index 1124261989..180ce130ae 100644
--- a/srml/staking/src/tests.rs
+++ b/srml/staking/src/tests.rs
@@ -1272,7 +1272,7 @@ fn on_free_balance_zero_stash_removes_validator() {
 		assert!(>::exists(&11));
 
 		// Reduce free_balance of controller to 0
-		Balances::slash(&10, u64::max_value());
+		let _ = Balances::slash(&10, u64::max_value());
 
 		// Check the balance of the stash account has not been touched
 		assert_eq!(Balances::free_balance(&11), 256000);
@@ -1287,7 +1287,7 @@ fn on_free_balance_zero_stash_removes_validator() {
 		assert!(>::exists(&11));
 
 		// Reduce free_balance of stash to 0
-		Balances::slash(&11, u64::max_value());
+		let _ = Balances::slash(&11, u64::max_value());
 		// Check total balance of stash
 		assert_eq!(Balances::total_balance(&11), 0);
 
@@ -1328,7 +1328,7 @@ fn on_free_balance_zero_stash_removes_nominator() {
 		assert!(>::exists(&11));
 
 		// Reduce free_balance of controller to 0
-		Balances::slash(&10, u64::max_value());
+		let _ = Balances::slash(&10, u64::max_value());
 		// Check total balance of account 10
 		assert_eq!(Balances::total_balance(&10), 0);
 
@@ -1344,7 +1344,7 @@ fn on_free_balance_zero_stash_removes_nominator() {
 		assert!(>::exists(&11));
 
 		// Reduce free_balance of stash to 0
-		Balances::slash(&11, u64::max_value());
+		let _ = Balances::slash(&11, u64::max_value());
 		// Check total balance of stash
 		assert_eq!(Balances::total_balance(&11), 0);
 
-- 
GitLab


From 6252a6733495d6a78842d9e0d43af0c6c3e36746 Mon Sep 17 00:00:00 2001
From: Wei Tang 
Date: Sat, 15 Jun 2019 10:30:36 +0200
Subject: [PATCH 122/140] Add assumptions that must be held in assets module
 (#2867)

* Add assumptions that must be held in assets module

* Update srml/assets/src/lib.rs

Co-Authored-By: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com>

* Update srml/assets/src/lib.rs

Co-Authored-By: DemiMarie-parity <48690212+DemiMarie-parity@users.noreply.github.com>
---
 srml/assets/src/lib.rs | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs
index ad6a1ec549..d563db3b14 100644
--- a/srml/assets/src/lib.rs
+++ b/srml/assets/src/lib.rs
@@ -114,6 +114,14 @@
 //! }
 //! ```
 //!
+//! ## Assumptions
+//!
+//! Below are assumptions that must be held when using this module.  If any of
+//! them are violated, the behavior of this module is undefined.
+//!
+//! * The total count of assets should be less than
+//!   `Trait::AssetId::max_value()`.
+//!
 //! ## Related Modules
 //!
 //! * [`System`](../srml_system/index.html)
-- 
GitLab


From 3c1c8da5357cfad708d20e0d807a94821029f4cb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= 
Date: Sat, 15 Jun 2019 15:07:08 +0200
Subject: [PATCH 123/140] Expose `srml-system` in metadata as well (#2876)

---
 srml/support/src/metadata.rs | 10 ----------
 1 file changed, 10 deletions(-)

diff --git a/srml/support/src/metadata.rs b/srml/support/src/metadata.rs
index 0e33d77272..9a6b671f77 100644
--- a/srml/support/src/metadata.rs
+++ b/srml/support/src/metadata.rs
@@ -82,16 +82,6 @@ macro_rules! __runtime_modules_to_metadata {
 #[macro_export]
 #[doc(hidden)]
 macro_rules! __runtime_modules_to_metadata_calls_call {
-	// skip system
-	(
-		system,
-		$skip_module: ident $( <$instance:ident> )?,
-		$skip_runtime: ident,
-		with Call
-		$(with $kws:ident)*
-	) => {
-		None
-	};
 	(
 		$mod: ident,
 		$module: ident $( <$instance:ident> )?,
-- 
GitLab


From b78dc0024439cbf4d5ce4f6cbd937eb7707f6831 Mon Sep 17 00:00:00 2001
From: Pierre Krieger 
Date: Sat, 15 Jun 2019 15:44:04 +0200
Subject: [PATCH 124/140] Handle RPC requests in the substrate-service (#2866)

* Rework RPC queries

* Remove SyncProvider trait

* Fix RPC tests
---
 core/cli/src/informant.rs      |   2 +-
 core/network/src/lib.rs        |   2 +-
 core/network/src/service.rs    |  59 ++++++-----------
 core/rpc/Cargo.toml            |   1 +
 core/rpc/src/helpers.rs        |  15 +++++
 core/rpc/src/system/mod.rs     |  67 ++++++++++---------
 core/rpc/src/system/tests.rs   | 113 +++++++++++++++++----------------
 core/service/src/components.rs |   9 ++-
 core/service/src/lib.rs        |  43 ++++++++++++-
 core/service/test/src/lib.rs   |   2 +-
 10 files changed, 180 insertions(+), 133 deletions(-)

diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs
index a6aca5edb0..7c8ec3ac1e 100644
--- a/core/cli/src/informant.rs
+++ b/core/cli/src/informant.rs
@@ -22,7 +22,7 @@ use std::time;
 use futures::{Future, Stream};
 use service::{Service, Components};
 use tokio::runtime::TaskExecutor;
-use network::{SyncState, SyncProvider};
+use network::SyncState;
 use client::{backend::Backend, BlockchainEvents};
 use log::{info, warn};
 
diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs
index 2ef682f33f..105b021315 100644
--- a/core/network/src/lib.rs
+++ b/core/network/src/lib.rs
@@ -43,7 +43,7 @@ pub mod test;
 pub use chain::{Client as ClientHandle, FinalityProofProvider};
 pub use service::{
 	NetworkService, NetworkWorker, FetchFuture, TransactionPool, ManageNetwork,
-	NetworkMsg, SyncProvider, ExHashT, ReportHandle,
+	NetworkMsg, ExHashT, ReportHandle,
 };
 pub use config::{NodeKeyConfig, Secret, Secp256k1Secret, Ed25519Secret};
 pub use protocol::{ProtocolStatus, PeerInfo, Context, consensus_gossip, message, specialization};
diff --git a/core/network/src/service.rs b/core/network/src/service.rs
index 7009310a8d..59618aa5b4 100644
--- a/core/network/src/service.rs
+++ b/core/network/src/service.rs
@@ -46,7 +46,7 @@ use crate::protocol::specialization::NetworkSpecialization;
 
 mod tests;
 
-/// Interval at which we send status updates on the SyncProvider status stream.
+/// Interval at which we send status updates on the 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);
@@ -56,23 +56,6 @@ pub use 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.
-	///
-	/// > **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;
-}
-
 /// Minimum Requirements for a Hash within Networking
 pub trait ExHashT:
 	::std::hash::Hash + Eq + ::std::fmt::Debug + Clone + Send + Sync + 'static
@@ -382,35 +365,19 @@ impl> NetworkService {
 	}
 
 	/// Are we in the process of downloading the chain?
-	/// Used by both SyncProvider and SyncOracle.
-	fn is_major_syncing(&self) -> bool {
+	pub fn is_major_syncing(&self) -> bool {
 		self.is_major_syncing.load(Ordering::Relaxed)
 	}
-}
-
-impl> ::consensus::SyncOracle for NetworkService {
-	fn is_major_syncing(&self) -> bool {
-		self.is_major_syncing()
-	}
-
-	fn is_offline(&self) -> bool {
-		self.is_offline.load(Ordering::Relaxed)
-	}
-}
-
-impl> SyncProvider for NetworkService {
-	fn is_major_syncing(&self) -> bool {
-		self.is_major_syncing()
-	}
 
 	/// Get sync status
-	fn status(&self) -> mpsc::UnboundedReceiver> {
+	pub fn status(&self) -> mpsc::UnboundedReceiver> {
 		let (sink, stream) = mpsc::unbounded();
 		self.status_sinks.lock().push(sink);
 		stream
 	}
 
-	fn network_state(&self) -> NetworkState {
+	/// Get network state.
+	pub fn network_state(&self) -> NetworkState {
 		let mut swarm = self.network.lock();
 		let open = swarm.user_protocol().open_peers().cloned().collect::>();
 
@@ -465,12 +432,26 @@ impl> SyncProvider for Netwo
 		}
 	}
 
-	fn peers_debug_info(&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.
+	pub 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()
 	}
 }
 
+impl> ::consensus::SyncOracle for NetworkService {
+	fn is_major_syncing(&self) -> bool {
+		self.is_major_syncing()
+	}
+
+	fn is_offline(&self) -> bool {
+		self.is_offline.load(Ordering::Relaxed)
+	}
+}
+
 /// Trait for managing network
 pub trait ManageNetwork {
 	/// Set to allow unreserved peers to connect
diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml
index 6ef9af2a0a..e72f62e500 100644
--- a/core/rpc/Cargo.toml
+++ b/core/rpc/Cargo.toml
@@ -6,6 +6,7 @@ edition = "2018"
 
 [dependencies]
 derive_more = "0.14.0"
+futures = "0.1"
 jsonrpc-core = "12.0.0"
 jsonrpc-core-client = "12.0.0"
 jsonrpc-pubsub = "12.0.0"
diff --git a/core/rpc/src/helpers.rs b/core/rpc/src/helpers.rs
index e579c743ac..ccfde6afb5 100644
--- a/core/rpc/src/helpers.rs
+++ b/core/rpc/src/helpers.rs
@@ -14,6 +14,21 @@
 // You should have received a copy of the GNU General Public License
 // along with Substrate.  If not, see .
 
+use futures::{prelude::*, sync::oneshot};
+
+/// Wraps around `oneshot::Receiver` and adjusts the error type to produce an internal error if the
+/// sender gets dropped.
+pub struct Receiver(pub oneshot::Receiver);
+
+impl Future for Receiver {
+	type Item = T;
+	type Error = jsonrpc_core::Error;
+
+	fn poll(&mut self) -> Poll {
+		self.0.poll().map_err(|_| jsonrpc_core::Error::internal_error())
+	}
+}
+
 /// Unwraps the trailing parameter or falls back with the closure result.
 pub fn unwrap_or_else(or_else: F, optional: Option) -> Result where
 	F: FnOnce() -> Result,
diff --git a/core/rpc/src/system/mod.rs b/core/rpc/src/system/mod.rs
index d6f2b75515..d0578590ae 100644
--- a/core/rpc/src/system/mod.rs
+++ b/core/rpc/src/system/mod.rs
@@ -22,7 +22,8 @@ pub mod helpers;
 #[cfg(test)]
 mod tests;
 
-use std::sync::Arc;
+use crate::helpers::Receiver;
+use futures::sync::{mpsc, oneshot};
 use jsonrpc_derive::rpc;
 use network;
 use runtime_primitives::traits::{self, Header as HeaderT};
@@ -56,39 +57,49 @@ pub trait SystemApi {
 	/// Node is considered healthy if it is:
 	/// - connected to some peers (unless running in dev mode)
 	/// - not performing a major sync
-	#[rpc(name = "system_health")]
-	fn system_health(&self) -> Result;
+	#[rpc(name = "system_health", returns = "Health")]
+	fn system_health(&self) -> Receiver;
 
 	/// Returns currently connected peers
-	#[rpc(name = "system_peers")]
-	fn system_peers(&self) -> Result>>;
+	#[rpc(name = "system_peers", returns = "Vec>")]
+	fn system_peers(&self) -> Receiver>>;
 
 	/// Returns current state of the network.
 	///
 	/// **Warning**: This API is not stable.
 	// TODO: make this stable and move structs https://github.com/paritytech/substrate/issues/1890
-	#[rpc(name = "system_networkState")]
-	fn system_network_state(&self) -> Result;
+	#[rpc(name = "system_networkState", returns = "network::NetworkState")]
+	fn system_network_state(&self) -> Receiver;
 }
 
 /// System API implementation
 pub struct System {
 	info: SystemInfo,
-	sync: Arc>,
-	should_have_peers: bool,
+	send_back: mpsc::UnboundedSender>,
+}
+
+/// Request to be processed.
+pub enum Request {
+	/// Must return the health of the network.
+	Health(oneshot::Sender),
+	/// Must return information about the peers we are connected to.
+	Peers(oneshot::Sender::Number>>>),
+	/// Must return the state of the network.
+	NetworkState(oneshot::Sender),
 }
 
 impl System {
-	/// Creates new `System` given the `SystemInfo`.
+	/// Creates new `System`.
+	///
+	/// The `send_back` will be used to transmit some of the requests. The user is responsible for
+	/// reading from that channel and answering the requests.
 	pub fn new(
 		info: SystemInfo,
-		sync: Arc>,
-		should_have_peers: bool,
+		send_back: mpsc::UnboundedSender>
 	) -> Self {
 		System {
 			info,
-			should_have_peers,
-			sync,
+			send_back,
 		}
 	}
 }
@@ -110,25 +121,21 @@ impl SystemApi::Number> for Sy
 		Ok(self.info.properties.clone())
 	}
 
-	fn system_health(&self) -> Result {
-		Ok(Health {
-			peers: self.sync.peers_debug_info().len(),
-			is_syncing: self.sync.is_major_syncing(),
-			should_have_peers: self.should_have_peers,
-		})
+	fn system_health(&self) -> Receiver {
+		let (tx, rx) = oneshot::channel();
+		let _ = self.send_back.unbounded_send(Request::Health(tx));
+		Receiver(rx)
 	}
 
-	fn system_peers(&self) -> Result::Number>>> {
-		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,
-			best_hash: p.best_hash,
-			best_number: p.best_number,
-		}).collect())
+	fn system_peers(&self) -> Receiver::Number>>> {
+		let (tx, rx) = oneshot::channel();
+		let _ = self.send_back.unbounded_send(Request::Peers(tx));
+		Receiver(rx)
 	}
 
-	fn system_network_state(&self) -> Result {
-		Ok(self.sync.network_state())
+	fn system_network_state(&self) -> Receiver {
+		let (tx, rx) = oneshot::channel();
+		let _ = self.send_back.unbounded_send(Request::NetworkState(tx));
+		Receiver(rx)
 	}
 }
diff --git a/core/rpc/src/system/tests.rs b/core/rpc/src/system/tests.rs
index 14cd421fd1..2dc4139da3 100644
--- a/core/rpc/src/system/tests.rs
+++ b/core/rpc/src/system/tests.rs
@@ -16,11 +16,12 @@
 
 use super::*;
 
-use network::{self, ProtocolStatus, PeerId, PeerInfo as NetworkPeerInfo};
+use network::{self, PeerId};
 use network::config::Roles;
 use test_client::runtime::Block;
 use assert_matches::assert_matches;
-use futures::sync::mpsc;
+use futures::{prelude::*, sync::mpsc};
+use std::thread;
 
 struct Status {
 	pub peers: usize,
@@ -40,55 +41,61 @@ impl Default for Status {
 	}
 }
 
-impl network::SyncProvider for Status {
-	fn status(&self) -> mpsc::UnboundedReceiver> {
-		let (_sink, stream) = mpsc::unbounded();
-		stream
-	}
-
-	fn network_state(&self) -> network::NetworkState {
-		network::NetworkState {
-			peer_id: String::new(),
-			listened_addresses: Default::default(),
-			external_addresses: Default::default(),
-			connected_peers: Default::default(),
-			not_connected_peers: Default::default(),
-			average_download_per_sec: 0,
-			average_upload_per_sec: 0,
-			peerset: serde_json::Value::Null,
-		}
-	}
-
-	fn peers_debug_info(&self) -> Vec<(PeerId, NetworkPeerInfo)> {
-		let mut peers = vec![];
-		for _peer in 0..self.peers {
-			peers.push(
-				(self.peer_id.clone(), NetworkPeerInfo {
-					roles: Roles::FULL,
-					protocol_version: 1,
-					best_hash: Default::default(),
-					best_number: 1
-				})
-			);
-		}
-		peers
-	}
-
-	fn is_major_syncing(&self) -> bool {
-		self.is_syncing
-	}
-}
-
-
 fn api>>(sync: T) -> System {
 	let status = sync.into().unwrap_or_default();
 	let should_have_peers = !status.is_dev;
+	let (tx, rx) = mpsc::unbounded();
+	thread::spawn(move || {
+		tokio::run(rx.for_each(move |request| {
+			match request {
+				Request::Health(sender) => {
+					let _ = sender.send(Health {
+						peers: status.peers,
+						is_syncing: status.is_syncing,
+						should_have_peers,
+					});
+				},
+				Request::Peers(sender) => {
+					let mut peers = vec![];
+					for _peer in 0..status.peers {
+						peers.push(PeerInfo {
+							peer_id: status.peer_id.to_base58(),
+							roles: format!("{:?}", Roles::FULL),
+							protocol_version: 1,
+							best_hash: Default::default(),
+							best_number: 1,
+						});
+					}
+					let _ = sender.send(peers);
+				}
+				Request::NetworkState(sender) => {
+					let _ = sender.send(network::NetworkState {
+						peer_id: String::new(),
+						listened_addresses: Default::default(),
+						external_addresses: Default::default(),
+						connected_peers: Default::default(),
+						not_connected_peers: Default::default(),
+						average_download_per_sec: 0,
+						average_upload_per_sec: 0,
+						peerset: serde_json::Value::Null,
+					});
+				}
+			};
+
+			Ok(())
+		}))
+	});
 	System::new(SystemInfo {
 		impl_name: "testclient".into(),
 		impl_version: "0.2.0".into(),
 		chain_name: "testchain".into(),
 		properties: Default::default(),
-	}, Arc::new(status), should_have_peers)
+	}, tx)
+}
+
+fn wait_receiver(rx: Receiver) -> T {
+	let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap();
+	runtime.block_on(rx).unwrap()
 }
 
 #[test]
@@ -126,7 +133,7 @@ fn system_properties_works() {
 #[test]
 fn system_health() {
 	assert_matches!(
-		api(None).system_health().unwrap(),
+		wait_receiver(api(None).system_health()),
 		Health {
 			peers: 0,
 			is_syncing: false,
@@ -135,12 +142,12 @@ fn system_health() {
 	);
 
 	assert_matches!(
-		api(Status {
+		wait_receiver(api(Status {
 			peer_id: PeerId::random(),
 			peers: 5,
 			is_syncing: true,
 			is_dev: true,
-		}).system_health().unwrap(),
+		}).system_health()),
 		Health {
 			peers: 5,
 			is_syncing: true,
@@ -149,12 +156,12 @@ fn system_health() {
 	);
 
 	assert_eq!(
-		api(Status {
+		wait_receiver(api(Status {
 			peer_id: PeerId::random(),
 			peers: 5,
 			is_syncing: false,
 			is_dev: false,
-		}).system_health().unwrap(),
+		}).system_health()),
 		Health {
 			peers: 5,
 			is_syncing: false,
@@ -163,12 +170,12 @@ fn system_health() {
 	);
 
 	assert_eq!(
-		api(Status {
+		wait_receiver(api(Status {
 			peer_id: PeerId::random(),
 			peers: 0,
 			is_syncing: false,
 			is_dev: true,
-		}).system_health().unwrap(),
+		}).system_health()),
 		Health {
 			peers: 0,
 			is_syncing: false,
@@ -181,12 +188,12 @@ fn system_health() {
 fn system_peers() {
 	let peer_id = PeerId::random();
 	assert_eq!(
-		api(Status {
+		wait_receiver(api(Status {
 			peer_id: peer_id.clone(),
 			peers: 1,
 			is_syncing: false,
 			is_dev: true,
-		}).system_peers().unwrap(),
+		}).system_peers()),
 		vec![PeerInfo {
 			peer_id: peer_id.to_base58(),
 			roles: "FULL".into(),
@@ -200,7 +207,7 @@ fn system_peers() {
 #[test]
 fn system_network_state() {
 	assert_eq!(
-		api(None).system_network_state().unwrap(),
+		wait_receiver(api(None).system_network_state()),
 		network::NetworkState {
 			peer_id: String::new(),
 			listened_addresses: Default::default(),
diff --git a/core/service/src/components.rs b/core/service/src/components.rs
index c095bdb7f4..85ab9feb99 100644
--- a/core/service/src/components.rs
+++ b/core/service/src/components.rs
@@ -34,6 +34,7 @@ use crate::config::Configuration;
 use primitives::{Blake2Hasher, H256};
 use rpc::{self, apis::system::SystemInfo};
 use parking_lot::Mutex;
+use futures::sync::mpsc;
 
 // Type aliases.
 // These exist mainly to avoid typing `::Foo` all over the code.
@@ -139,8 +140,7 @@ pub trait StartRPC {
 
 	fn start_rpc(
 		client: Arc>,
-		network: Arc>>,
-		should_have_peers: bool,
+		system_send_back: mpsc::UnboundedSender>>,
 		system_info: SystemInfo,
 		rpc_http: Option,
 		rpc_ws: Option,
@@ -159,8 +159,7 @@ impl StartRPC for C where
 
 	fn start_rpc(
 		client: Arc>,
-		network: Arc>>,
-		should_have_peers: bool,
+		system_send_back: mpsc::UnboundedSender>>,
 		rpc_system_info: SystemInfo,
 		rpc_http: Option,
 		rpc_ws: Option,
@@ -178,7 +177,7 @@ impl StartRPC for C where
 				client.clone(), transaction_pool.clone(), subscriptions
 			);
 			let system = rpc::apis::system::System::new(
-				rpc_system_info.clone(), network.clone(), should_have_peers
+				rpc_system_info.clone(), system_send_back.clone()
 			);
 			rpc::rpc_handler::, ComponentExHash, _, _, _, _>(
 				state,
diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs
index 1a3c00e4e7..644341f91a 100644
--- a/core/service/src/lib.rs
+++ b/core/service/src/lib.rs
@@ -41,7 +41,6 @@ use primitives::Pair;
 use runtime_primitives::generic::BlockId;
 use runtime_primitives::traits::{Header, SaturatedConversion};
 use substrate_executor::NativeExecutor;
-use network::SyncProvider;
 use sysinfo::{get_current_pid, ProcessExt, System, SystemExt};
 use tel::{telemetry, SUBSTRATE_INFO};
 
@@ -384,10 +383,10 @@ impl Service {
 			impl_version: config.impl_version.into(),
 			properties: config.chain_spec.properties(),
 		};
+		let (system_rpc_tx, system_rpc_rx) = mpsc::unbounded();
 		let rpc = Components::RuntimeServices::start_rpc(
 			client.clone(),
-			network.clone(),
-			has_bootnodes,
+			system_rpc_tx,
 			system_info,
 			config.rpc_http,
 			config.rpc_ws,
@@ -396,6 +395,11 @@ impl Service {
 			task_executor.clone(),
 			transaction_pool.clone(),
 		)?;
+		task_executor.spawn(build_system_rpc_handler::(
+			network.clone(),
+			system_rpc_rx,
+			has_bootnodes
+		));
 
 		let telemetry_connection_sinks: Arc>>> = Default::default();
 
@@ -611,6 +615,39 @@ impl network::TransactionPool, ComponentBlock<
 	}
 }
 
+/// Builds a never-ending `Future` that answers the RPC requests coming on the receiver.
+fn build_system_rpc_handler(
+	network: Arc>,
+	rx: mpsc::UnboundedReceiver>>,
+	should_have_peers: bool,
+) -> impl Future {
+	rx.for_each(move |request| {
+		match request {
+			rpc::apis::system::Request::Health(sender) => {
+				let _ = sender.send(rpc::apis::system::Health {
+					peers: network.peers_debug_info().len(),
+					is_syncing: network.is_major_syncing(),
+					should_have_peers,
+				});
+			},
+			rpc::apis::system::Request::Peers(sender) => {
+				let _ = sender.send(network.peers_debug_info().into_iter().map(|(peer_id, p)| rpc::apis::system::PeerInfo {
+					peer_id: peer_id.to_base58(),
+					roles: format!("{:?}", p.roles),
+					protocol_version: p.protocol_version,
+					best_hash: p.best_hash,
+					best_number: p.best_number,
+				}).collect());
+			}
+			rpc::apis::system::Request::NetworkState(sender) => {
+				let _ = sender.send(network.network_state());
+			}
+		};
+
+		Ok(())
+	})
+}
+
 /// Constructs a service factory with the given name that implements the `ServiceFactory` trait.
 /// The required parameters are required to be given in the exact order. Some parameters are followed
 /// by `{}` blocks. These blocks are required and used to initialize the given parameter.
diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs
index e007641255..d3d9677bb2 100644
--- a/core/service/test/src/lib.rs
+++ b/core/service/test/src/lib.rs
@@ -34,7 +34,7 @@ use service::{
 	Roles,
 	FactoryExtrinsic,
 };
-use network::{multiaddr, Multiaddr, SyncProvider, ManageNetwork};
+use network::{multiaddr, Multiaddr, ManageNetwork};
 use network::config::{NetworkConfiguration, NodeKeyConfig, Secret, NonReservedPeerMode};
 use sr_primitives::generic::BlockId;
 use consensus::{ImportBlock, BlockImport};
-- 
GitLab


From e4dd6d0db862e2f8fcee5dfb6950ac9d7b0d435f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= 
Date: Mon, 17 Jun 2019 14:37:00 +0200
Subject: [PATCH 125/140] Re-expose system events (#2881)

---
 node/runtime/src/lib.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs
index 42d89c57ad..15b81b4cc5 100644
--- a/node/runtime/src/lib.rs
+++ b/node/runtime/src/lib.rs
@@ -247,7 +247,7 @@ construct_runtime!(
 		NodeBlock = node_primitives::Block,
 		UncheckedExtrinsic = UncheckedExtrinsic
 	{
-		System: system::{Module, Call, Storage, Config},
+		System: system::{default, Config},
 		Aura: aura::{Module, Config, Inherent(Timestamp)},
 		Timestamp: timestamp::{Module, Call, Storage, Config, Inherent},
 		Indices: indices,
-- 
GitLab


From 1f40a2e3ecba2d21eb4c88f8c36ab58c65f9c0a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Silva?= 
Date: Mon, 17 Jun 2019 18:31:24 +0100
Subject: [PATCH 126/140] node: update flaming fir chainspec (#2891)

---
 node/cli/res/flaming-fir.json | 189 ++++++++++++++++------------------
 1 file changed, 88 insertions(+), 101 deletions(-)

diff --git a/node/cli/res/flaming-fir.json b/node/cli/res/flaming-fir.json
index 018593b150..3ff5495c9b 100644
--- a/node/cli/res/flaming-fir.json
+++ b/node/cli/res/flaming-fir.json
@@ -22,121 +22,108 @@
 	"consensusEngine": null,
 	"genesis": {
 		"raw": {
-			"0x68c8d2f39c4605e65218c22c5664917047e4900c797b7dd33999d94213c75049": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f",
-			"0x579ab55d37b1220812be3c3df29d4858": "0x0000000000000000",
-			"0x75f6361fd25fec35714be80f2d9870af8c92e73cb6d299ba4774f5b0ad842275": "0x00",
+			"0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300",
 			"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",
+			"0x366a192e1ce90bf109f11cf4d4bdab1ce310d835c09411b1be3ad53814e33196": "0x0c000001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65",
 			"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",
+			"0x656abc4530eb4c1692051ca24c867220aa8d62e4a9686b432f760de7455e8f95": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce4405633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440",
+			"0x7c79972b34b7e51bdd5f168ba3accd35fbec396be75dfad19dd1121327f1a1ad": "0x0c000168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde7800",
 			"0xfe7030fd433199728c516e4392091aa5": "0x0080c6a47e8d03000000000000000000",
-			"0x90e2849b965314409e8bc00011f3004f": "0x04000000",
-			"0x24b2518f9a9ee24ab0b62346d83d90b0": "0x11080000",
 			"0x686f6c72b7b80bad8dba022335cb7c9e4556ac7ea200008da8046e3178eb89c1": "0x0f0000c16ff286230f0000c16ff2862300",
-			"0x2dce29f1a768624dc5343063cb77f77d": "0x07000000",
-			"0xfff675c76ad8a5dfbd7db9a4e80f7c0ece595ad1878d2b6fca6086b2483a055b": "0x0000c16ff28623000000000000000000",
-			"0x2ec6e5652282d579398fb8fdfa531ef6": "0x0000000000000000",
+			"0x121725e2f949944d00a8c011c0db54ae07b84a6ca772adf3c65417345d91522d": "0x0000c16ff28623000000000000000000",
+			"0xeecb67c20ca6cc8ba4d4434687f61309": "0x109becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe969933201000000000000007932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f01000000000000005633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce44001000000000000003919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef0100000000000000",
+			"0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000",
+			"0x4ac2684a5a20e7a5adf17ed7aa792a3f6334a0505f02b2a44c3934d36cc4ee0a": "0xc8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e",
+			"0x125dc846383907f5846f72ce53ca0e4b": "0x00ca9a3b000000000000000000000000",
+			"0x763c9e671e9c7ff51644a965ea0f2707": "0x0000000000000000",
+			"0x75f6361fd25fec35714be80f2d9870af8c92e73cb6d299ba4774f5b0ad842275": "0x00",
+			"0x0c41b62474c49057a4476d0b96853c6d44e9c86c5fa130b0da3831c5eef546a0": "0x00",
+			"0xdee5bbb035d9ebc2c9338b5aedf744d7": "0x4038000000000000",
+			"0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000",
+			"0x15b569617561081f097bbc5c5a059d2f7ccf6d23be534cffa33fb544946a6a92": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef",
 			"0xf541ffd8c90d7124a5298d6c1e2c0d40": "0x0300000000000000",
-			"0x8366297e853b97a38cca0f62019a717b": "0x00000000000000000000000000000000",
-			"0xc98362e2ca21b342cc749022ed9b560e4d29ec9862a960c2538c314f1d279635": "0x149ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e3180973474718099c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663",
-			"0x26ac4a74e1ba94e0e7dbfc3b2aea083cf3c0f0d80eb999c7cebb340ee8934da9": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde780f0000c16ff286230f0000c16ff2862300",
-			"0x93940e78496482b15b64783020bbdfa0": "0x6400000000000000",
+			"0x3a636f6465": "0x0061736d01000000019f022760027f7f0060017f0060037f7f7f017f60027f7f017f60037f7f7f0060047f7f7f7f0060057f7f7f7f7f0060057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f0060047f7f7f7f017f60017e0060017f017f60000060017e017f60037f7e7e0060057f7e7f7f7e0060027f7e0060047f7f7e7e0060067f7f7e7e7e7f0060037f7f7e0060027e7e017e60087f7f7f7f7f7f7f7f0060047f7f7f7f017e60087f7f7e7e7f7f7f7f0060097f7f7f7e7e7f7f7f7f0060057f7f7f7e7e0060057f7f7e7e7f0060037f7e7f0060037e7f7f017f60037f7e7f017f60017f017e60047f7e7e7e0060027f7f017e60087f7f7f7f7f7e7e7f0060057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f000286061d03656e760c6578745f74776f785f313238000403656e76146578745f6765745f73746f726167655f696e746f000703656e760e6578745f626c616b65325f323536000403656e76116578745f636c6561725f73746f72616765000003656e760f6578745f7365745f73746f72616765000503656e76166578745f73616e64626f785f6d656d6f72795f6e6577000303656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000103656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000103656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e76156578745f7365745f6368696c645f73746f72616765000a03656e76176578745f636c6561725f6368696c645f73746f72616765000503656e76166578745f6b696c6c5f6368696c645f73746f72616765000003656e76166578745f73616e64626f785f6d656d6f72795f676574000b03656e760e6578745f7072696e745f75746638000003656e76166578745f73616e64626f785f6d656d6f72795f736574000b03656e76126578745f737232353531395f766572696679000b03656e76126578745f656432353531395f766572696679000b03656e76166578745f6368696c645f73746f726167655f726f6f74000203656e76196578745f6765745f616c6c6f63617465645f73746f72616765000203656e76106578745f73746f726167655f726f6f74000103656e76186578745f73746f726167655f6368616e6765735f726f6f74000203656e760d6578745f7072696e745f686578000003656e76106578745f636c6561725f707265666978000003656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000503656e760d6578745f7072696e745f6e756d000c03656e760a6578745f6d616c6c6f63000d03656e76086578745f667265650001038104ff030e0e0f0000000101000d020004001004110f0000000600000112000000010101000000000000000000000000000000000000010000000000000e0400000b1300000000030014150000000000010100000000010000000000000004000013011604130001040004000101000006000300000500000e04000101030803020404040404010003000000040000000000000d000400000003020301051705050505050505050505050505050505050505050505051800040e04010406040003040013000110010419040e060e1a0404030400000100010100000000000000000001000110010013131b131c03000c000000010000000000001300000012000404060000000000000000000000000000000003030406041d00000001010100000000000000000000000004050001030503031e0c0415011f04000101002001040003030001010e010000010e010101001e02000c01210101010101010101010101010404000e01010101010101002222010004050c00222200040000002222220022222222220422222222040101010000000300010101000101010000000d01010123010003000503030400000003000d04000404060506040404040405030303040504020303030204030404000004040303030301030300040001000d01020d0e0302030301200b0503030d0303050102010303010203030202020224242525260407017001ab01ab0105030100120619037f01418080c0000b7f0041adb1c5000b7f0041adb1c5000b07a30414066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010a5f5f646174615f656e6403020c436f72655f76657273696f6e00880312436f72655f657865637574655f626c6f636b00890315436f72655f696e697469616c697a655f626c6f636b009003114d657461646174615f6d657461646174610091031c426c6f636b4275696c6465725f6170706c795f65787472696e7369630097031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00980320426c6f636b4275696c6465725f696e686572656e745f65787472696e736963730099031c426c6f636b4275696c6465725f636865636b5f696e686572656e7473009b0318426c6f636b4275696c6465725f72616e646f6d5f73656564009c032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e009d03214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572009e03214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765009f03204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500a1031e4772616e6470614170695f6772616e6470615f617574686f72697469657300a20315417572614170695f736c6f745f6475726174696f6e00a30313417572614170695f617574686f72697469657300a40309cb02010041010baa0160bf03db02dc029601cb02a101b801b901ba01bb01bc01bd01be01bf01c001c101c201c301c401c501c601c701c801c901ca01cb01cc01cd01ce01cf01ca02c802ac03c203c303ac02b2019801e103d803d903da03e403df038804fc03840485048004b802f20140b1033e3d7473727170f90180018201788101fa01f801f701f601f501f401f301bf02be02bd02bc02bb02ba02b902e302e202e902df02e102de02f1028003e702e802e602b303b403b203f202fd01ff01fb01f302ba03bb03b903f4026a6f69f5023b3c3af602f001f101ee01f702af03b003ae03f8029501810382038303f902a703a803a603fa02b602b702b502fb02840385038603f0028703a903d601d701da01d901d501db01bd03e501e901eb01ea01e801ec018f04f003e003f103eb03ee03ed03ec03fd03fe03ff0381048c048b048d048e049004910492040acdca39ff030500101e000b0a0041f481c500104f000be11204077f037e037f117e230041c0026b2201240041082102200141b8016a41086a22034200370300200142003703b80141fc88c0004115200141b8016a100020014198016a41086a2003290300370300200120012903b8013703980141002104024002400240024002400240024020014198016a411041a886c500410041001001417f460d002001421037022c200120014198016a360228200141b8016a200141286a102020012802b8012202450d0220012802bc0121054198012103200141c0016a28020022044198016c2206450d010c030b41002105419801210341004198016c22060d020b200141003602302001200236022c200120023602282001200141b8026a36023420040d020c030b41d4aac10041331021000b200220066a2106200141b8016a20022802701022200220036a21030240024020012802c8012207450d00200141186a20012903b801200141b8016a41086a290300200141d0016a3502004200109804200141186a41086a29030021082001290318210920012802cc01450d01200710230c010b42002109420021080b200141013602302001200636022c200120033602282001200141b8026a36023402402002450d002002ad422086210a024020032006460d0020044198016c41e87e6a2106200141c8016a210b200141d0016a210c200141cc016a210d4201210e0340200141b8016a200341f0006a280200102202400240200b2802002207450d00200141086a20012903b801200141b8016a41086a290300200c3502004200109804200141086a41086a290300210f20012903082110200d280200450d01200710230c010b420021104200210f0b024020092010562008200f562008200f511b0d002003ad422086200e84210a20102109200f21080b20034198016a2103200e42017c210e200641e87e6a22060d000b0b200a4280808080105a0d030b2004450d010b20044198016c21062002210303402003102420034198016a2103200641e87e6a22060d000b0b02402005450d00200210230b200141c0026a240041a489c0000f0b024002400240024002402004200aa722034d0d0020022004417f6a22074198016c6a220641e0006a2903002110200641e8006a2903002109200641f0006a290300210a200641f8006a2903002111200641c0006a2903002112200641c8006a2903002113200641d0006a2903002114200641d8006a2903002115200641206a2903002116200641286a2903002117200641306a2903002118200641386a29030021192006290300211a2006290308211b2006290310211c200220034198016c6a220341186a220b290300211d20064190016a290300210f20064188016a290300210820064180016a290300210e200b200641186a2903003703002003290310211e2003201c3703102003290308211c2003201b3703082003290300211b2003201a370300200341386a2206290200211a20062019370200200341306a2206290200211920062018370200200341286a2206290200211820062017370200200341206a2206290200211720062016370200200341d8006a2206290200211620062015370200200341d0006a2206290200211520062014370200200341c8006a2206290200211420062013370200200341c0006a2206290200211320062012370200200341f8006a2011370200200341f0006a2206280200210b2006200a370200200341e8006a2206290200210a20062009370200200341e0006a220629020021092006201037020020034180016a200e37020020034188016a2008370200200141b8016a41086a2206200837030020034190016a200f370200200141b8016a41106a200f3703002001200e3703b801200141286a41e8006a200a370300200141286a41e0006a2009370300200141286a41d8006a2016370300200141286a41d0006a2015370300200141286a41c8006a2014370300200141286a41c0006a2013370300200141286a41386a201a370300200141286a41306a2019370300200141286a41286a2018370300200141286a41206a2017370300200141286a41186a201d3703002001201e3703382001201c3703302001201b370328200120073602b002200120053602ac02200120023602a80220064200370300200142003703b80141fc88c0004115200141b8016a100020014198016a41086a2006290300370300200120012903b80137039801200141103602bc01200120014198016a3602b801200141a8026a200141b8016a102502402007450d0020044198016c41e87e6a21062002210303402003102420034198016a2103200641e87e6a22060d000b0b02402005450d00200210230b411310262203450d01410021072003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272203450d022003200b360013200141b8016a41186a22064200370300200141b8016a41106a22024200370300200141b8016a41086a220c4200370300200142003703b80120034117200141b8016a100220014198016a41186a200629030037030020014198016a41106a200229030037030020014198016a41086a200c290300370300200120012903b8013703980102400240024020014198016a412041a886c500410041001001417f460d00200120014198016a3602a802200141203602ac02200142003703c001200142003703b8012001410020014198016a4120200141b8016a41104100100122062006417f461b2206411020064110491b3602b0022006410f4d0d02200141c0016a290300210f20012903b8012108200141b8016a200141a8026a102820012802b8012207450d0220012902bc01210e20014198016a41201003200e422088a72102200ea7210c200310232007450d010c060b2003102341000d050b200141286a10240c050b41d4aac10041331021000b419489c000200320041029000b41134101102a000b41264101102a000b024020024105742206450d0020072103034020032008200f102b200341206a2103200641606a22060d000b0b200141e0016a200f370300200141d8016a2008370300200141d0016a2002360200200141cc016a200c360200200141c8016a2007360200200141c4016a200b360200200141c0016a41013a0000200141053a00b80141a886c5004100200141b8016a102c200141b8016a200141286a41f0001094041a20014198016a20004280e20e7c200141b8016a41004280e90f102d2001280298014101470d00200128029c012103200141c0026a240020030f0b200141c0026a240041000bb40803027f017e107f230041b0046b22022400200241086a2001104a02400240024002400240024002400240024002402002280208450d00200228020c2203ad4298017e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241b0046a24000f0b4108210620030d030b4100210f4100210d0c030b101d000b20054108102a000b200241b0026a4104722107200141086a210820024190046a41186a210920024190046a41106a210a4100210b4100210c410021052003210d0340200141046a220e280200210f20082802002110200241003602a003200841002001280200200f200241a0036a410420101001220f200f417f461b220f4104200f410449220f1b20082802006a36020002400240200f0d0020022802a0032111200241a0036a2001102f20022802a003410e460d00200241b0026a200241a0036a41f0001094041a20094200370300200a420037030020024190046a41086a221042003703002002420037039004200841002001280200200e28020020024190046a412020082802001001220f200f417f461b220f4120200f4120491b20082802006a3602000240200f411f4d0d00200241a0016a41186a2009290300370300200241a0016a41106a200a290300370300200241a0016a41086a201029030037030020022002290390043703a00120022802b0022110200241c4016a200741ec001094041a201121120c020b200241b0026a10240b410e21100b200241a0036a200241c4016a41ec001094041a200241b0026a41186a220e200241a0016a41186a290300370300200241b0026a41106a2211200241a0016a41106a290300370300200241b0026a41086a2213200241a0016a41086a290300370300200220022903a0013703b0022010410e460d02200541016a210f200241346a200241a0036a41ec001094041a200241106a41186a2214200e290300370300200241106a41106a220e2011290300370300200241106a41086a22112013290300370300200220022903b00237031002402005200d470d00200b200f200f200b491b220dad4298017e2204422088a70d042004a722134100480d0402402005450d002006200c2013102722060d010c060b201310262206450d050b2006200c6a22052010360200200541046a200241346a41ec001094041a200541f0006a20123602002005418c016a201429030037020020054184016a200e290300370200200541fc006a2011290300370200200541f4006a2002290310370200200b41026a210b200c4198016a210c200f2105200f2003490d000b0b2000200d36020420002006360200200041086a200f360200200241b0046a24000f0b2000410036020002402005450d002006210503402005102420054198016a2105200c41e87e6a220c0d000b0b0240200d450d00200610230b200241b0046a24000f0b101e000b20134108102a000b5e01017f230041306b220224002002200136020c20022000360208200241246a41013602002002410136022c20024201370214200241ccb0c5003602102002200241086a3602282002200241286a360220200241106a41d4b0c5001061000bad0302047f037e230041d0006b2202240002400240411310262203450d002003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041a886c500410041001001417f460d00200220023602202002412036022420024200370338200242003703302002410020024120200241306a41104100100122012001417f461b2201411020014110491b3602282001410f4d0d02200241386a290300210620022903302107200241306a200241206a102820022802302201450d0220022902342108200020063703082000200737030020002008370214200020013602100c010b200041003602100b20031023200241d0006a24000f0b41d4aac10041331021000b41134101102a000b41264101102a000b0700200010f8030bee0601027f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002201410c4b0d0020010e0d01151515020304050615071508010b20002802044101470d14200041086a22002802001024200028020010230f0b200041086a280200220141044b0d0c024020010e051400140e0f140b200041106a280200450d132000410c6a28020010230f0b200041086a280200450d12200028020410230f0b200041086a2d00002201410c4b0d1020014106470d11200041106a280200450d112000410c6a28020010230f0b200041086a2d0000417f6a220141074b0d10024020010e080011111107110809000b2000410c6a22002802001024200028020010230f0b200041086a28020022014102460d0320014101470d0f200041106a280200450d0f2000410c6a28020010230f0b20002d000422014102460d0320014101470d0e200041086a22002802001024200028020010230f0b200041086a280200450d0d200028020410230f0b200041086a2d0000220141054b0d08024020010e060d0d000a0b0d0d0b200041106a280200450d0c2000410c6a28020010230f0b200041106a280200450d0b2000410c6a28020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010230b2001410c6a2101200241746a22020d000b0b200041106a280200450d062000410c6a28020010230f0b200041106a280200450d052000410c6a28020010230f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200241686a22020d000b0b200041106a280200450d042000410c6a28020010230f0b200041d0006a280200450d03200041cc006a28020010230f0b200041346a280200450d02200041306a28020010230f0b200041306a280200450d012000412c6a28020010230f0b200041106a280200450d002000410c6a28020010230f0b0bc80401077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d0020004198016c2104200241086a22052802002100200228020421060340200341f0006a28020021070240024002400240200620006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102722060d020c070b200228020021060c020b200010262206450d050b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200320021039024002400240024020022802042206200528020022076b41204f0d00200741206a22002007490d0620064101742207200020002007491b22004100480d062006450d01200228020020062000102722080d020c080b200228020021080c020b200010262208450d060b200220003602042002200836020020052802002107200021060b2005200741206a2200360200200820076a220741086a200341fc006a290000370000200741106a20034184016a290000370000200741186a2003418c016a2900003700002007200341f4006a29000037000020034198016a2103200441e87e6a22040d000b200128020020012802042008200010042006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100420030d030c040b101e000b20004101102a000b20004101102a000b200810230b200241106a24000b0700200010f7030b0b0020002001200210f9030bdc0403027f017e0d7f230041d0006b22022400200241086a2001104a02400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210d0c030b101d000b20054101102a000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d03402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001001220f200f417f461b220f4120200f4120491b20052802006a360200200f411f4d0d02200c41016a2105200241106a41186a220f2007290300370300200241106a41106a22102008290300370300200241106a41086a2211200e290300370300200220022903303703100240200c200d470d00200a20052005200a491b220dad4205862204422088a70d042004a7220e4100480d040240200c450d002006200b200e102722060d010c060b200e10262206450d050b2006200b6a220c2002290310370000200c41186a200f290300370000200c41106a2010290300370000200c41086a2011290300370000200a41026a210a200b41206a210b2005210c20052003490d000b0b2000200d36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200d450d00200610230b200241d0006a24000f0b101e000b200e4101102a000b6c01017f230041306b2203240020032002360204200320013602002003412c6a41023602002003411c6a4102360200200341023602242003420237020c2003419886c500360208200320033602282003200341046a3602202003200341206a360218200341086a20001061000b0e0041b080c500412210f60300000bdb0604027f017e037f047e230041c0006b22032400024002400240411810262204450d00200441106a410029008db741370000200441086a4100290085b741370000200441002900fdb64137000020044118413810272204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a29000037000042002105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044138200341206a1002200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a2903002109200329032021052004102341142106411410262204450d010c050b4200210920041023411421064114102622040d040b20064101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b200441106a41002800f9b641360000200441086a41002900f1b641370000200441002900e9b641370000024020042006413410272204450d00200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a2900003700004200210a200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044134200341206a1002200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a290300210b2003290320210a0c010b4200210b0b200410232000200a200120052005200156200920025620092002511b22041b22017c220c200b2002200920041b22027c200c200a54ad7c10df012000200520017d200920027d2005200154ad7d10fe01200341c0006a24000f0b41d4aac10041331021000b41344101102a000bd52803087f047e047f230041a0036b22032400410021044101210502400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240418595c300411041a886c500410041001001417f460d002003410036029801418595c300411020034198016a41044100100141016a41044d0d0320032802980121064100210720010d010c020b410121072001450d010b200141057422044100480d13200410262205450d032001410574220841606a410576210941002104034020034198016a41186a200020046a220a41186a290000220b37030020034198016a41106a200a41106a290000220c37030020034198016a41086a200a41086a290000220d3703002003200a290000220e37039801200520046a220a41106a200c370000200a41086a200d370000200a41186a200b370000200a200e3700002008200441206a2204470d000b200941016a21040b20034184016a20063602002003200736028001200341106a200241f0001094041a20034190016a20043602002003418c016a20013602002003200536028801200341b0026a41086a22044200370300200342003703b00241c19dc3004111200341b0026a1000200341e8026a41086a2004290300370300200320032903b0023703e8024100210f0240200341e8026a411041a886c500410041001001417f460d002003410036029801200341e8026a411020034198016a41044100100141016a41044d0d02200328029801210f0b0240200f41016a220a200f4f0d00200341106a10d802200341a0036a24000f0b200341b0026a41086a22044200370300200342003703b00241c19dc3004111200341b0026a1000200341e8026a41086a22052004290300370300200320032903b0023703e8022003200a36029801200341e8026a411020034198016a4104100420034198016a200341106a4188011094041a20044200370300200342003703b00241b49dc300410d200341b0026a100020052004290300370300200320032903b0023703e802200341003602b002200341e8026a4110200341b0026a1014210a0240024002400240024002400240024020032802b0022204417f460d00200a450d00200320043602a802200320043602a4022003200a3602a0022004450d01200320043602b4022003200a3602b002200341086a200341b0026a104502402003280208450d004101210a200328020c220541016a220820054f0d030b410021040c140b200341003602a802200342013703a0020b200341003602b802200342013703b002200341013602e802200341e8026a200341b0026a10410240024002402003280288024101470d0020032802b402200341b8026a2802002204470d01200441016a220a2004490d1b20044101742205200a200a2005491b22054100480d1b2004450d0420032802b002200420051027220a450d050c120b20032802b402200341b8026a2802002204470d01200441016a220a2004490d1a20044101742205200a200a2005491b22054100480d1a2004450d0520032802b002200420051027220a450d060c0f0b20032802b002210a0c110b20032802b002210a0c0e0b0240200541c000490d004102210a200541808001490d00410441052005418080808004491b210a0b410121050240200841c000490d0041022105200841808001490d00410441052008418080808004491b21050b2005200a470d042003200341a0026a3602b0022008200341b0026a200a10d90220034198016a200341a0026a10da02200341a8026a280200210520032802a402210820032802a00222040d130c180b20051026220a0d0d0b20054101102a000b20051026220a0d090b20054101102a000b20042005200a6b6a2204417f4c0d0f024002402004450d002004102622020d0120044101102a000b410121020b200320043602880320032004360284032003200236028003200320034180036a3602b0022008200341b0026a200510d90220042005490d0320032802880322082004490d04200341a8026a2802002208200a490d05200328028003210220032802a00221062003200420056b22043602900320032008200a6b22083602940320042008470d06200220056a2006200a6a20041094041a20034198016a20034180036a10da0220034188036a28020021052003280284032108200328028003210420032802a402450d0d20032802a002102320040d0e0c130b41d4aac10041331021000b41d4aac10041331021000b20044101102a000b200520041048000b20042008108c01000b200a20081048000b200320034190036a36029803200320034194036a36029c03200341b0026a41146a4100360200200341e8026a41146a4103360200200341f4026a4104360200200341d0026a41146a4103360200200341a886c5003602c002200342013702b402200341a881c5003602b002200341043602ec02200342033702d402200341d480c5003602d0022003200341b0026a3602f80220032003419c036a3602f002200320034198036a3602e8022003200341e8026a3602e002200341d0026a41e481c5001061000b200320053602b4022003200a3602b002200341b8026a28020021040b200341b8026a2205200441016a360200200a20046a41003a00002003418c026a28020021080240024002400240024020032802b402220a200528020022046b41044f0d00200441046a22052004490d0e200a4101742204200520052004491b22044100480d0e200a450d0120032802b002200a20041027220a450d020c030b20032802b002210a0c030b20041026220a0d010b20044101102a000b200320043602b4022003200a3602b002200341b8026a28020021040b200341b8026a200441046a360200200a20046a20083600000c020b200320053602b4022003200a3602b002200341b8026a28020021040b200341b8026a200441016a360200200a20046a41013a00000b20034198016a200341b0026a10dd0220032802900221042003200328029802220a3602e802200341e8026a200341b0026a10410240200a450d00200a4105742106200341b0026a41086a2207280200210520032802b402210803400240024002400240200820056b41204f0d00200541206a220a2005490d0c20084101742205200a200a2005491b22054100480d0c2008450d0120032802b00220082005102722020d020c0b0b20032802b00221022005210a0c020b200510262202450d090b200320053602b402200320023602b0022007280200210a200521080b2007200a41206a22053602002002200a6a220a41086a200441086a290000370000200a41106a200441106a290000370000200a41186a200441186a290000370000200a2004290000370000200441206a2104200641606a22060d000b0b200341b8026a280200210520032802b402210820032802b002210420032802a402450d010b20032802a00210230b2004450d050b4200210c200341b0026a41086a220a4200370300200342003703b00241b49dc300410d200341b0026a1000200341e8026a41086a2202200a290300370300200320032903b0023703e802200341e8026a411020042005100402402008450d00200410230b20034198016a10d802200a4200370300200342003703b00241af98c300410d200341b0026a10002002200a290300370300200320032903b0023703e8020240200341e8026a411041a886c500410041001001417f460d002003420037039801200341e8026a411020034198016a41084100100141016a41084d0d02200329039801210c0b02402001450d0020014105742110200341d0026a41086a2111024003402011200f3602002003200c3703d0020240024002400240024002400240024002400240024002400240024002400240411210262204450d00200441106a41002f00e29d433b0000200441086a41002900da9d43370000200441002900d29d4337000020034198016a41186a2208420037030020034198016a41106a2202420037030020034198016a41086a220a420037030020034200370398012004411220034198016a1002200341b0026a41186a22062008290300370300200341b0026a41106a22072002290300370300200341b0026a41086a2201200a29030037030020032003290398013703b002412010262205450d01200520032903b002370000200541186a2006290300370000200541106a2007290300370000200541086a2001290300370000200410232008420037030020024200370300200a420037030020034200370398012000412020034198016a100220062008290300370300200720022903003703002001200a29030037030020032003290398013703b0022005412041c00010272204450d02200420032903b002370020200441386a2006290300370000200441306a2007290300370000200441286a20012903003700002003410036029801200441c00020034198016a101421050240024002400240024002400240024002400240024002400240024002400240024002402003280298012208417f460d00200341a0026a41086a22022008360200200320083602a402200320053602a0022008450d012003200836029c012003200536029801200320034198016a10452003280200450d02410021052003280204220a41016a2207200a490d0641012105410121060240200a41c000490d0041022106200a41808001490d0041044105200a418080808004491b21060b0240200741c000490d0041022105200741808001490d00410441052007418080808004491b21050b20052006470d082003200341a0026a36029801200720034198016a200610d90220032903d002210b20032802a40222052002280200220a6b41084f0d09200a41086a2208200a490d282005410174220a20082008200a491b220a4100480d282005450d0c20032802a0022005200a102722050d0d0c1c0b200341a0026a41086a4100360200200342013703a0020b200a41003602002003420137039801200341013602b002200341b0026a20034198016a104120032903d002210b0240200328029c012208200a28020022026b41084f0d00200241086a22052002490d2720084101742206200520052006491b22064100480d272008450d0220032802980120082006102722050d030c140b20032802980121050c030b4100210520032802a4020d040c1d0b200610262205450d110b2003200636029c012003200536029801200621080b200a200241086a2206360200200520026a200b370000201128020021070240024002400240200820066b41034b0d00200641046a22012006490d2620084101742209200120012009491b22094100480d262008450d01200520082009102722050d020c140b200821090c020b200910262205450d120b2003200936029c0120032005360298010b200a2002410c6a2212360200200520066a20073600000b20032802a402450d190b20032802a00210230c180b2008200520066b6a2208417f4c0d1c2008450d012008102622010d020c0e0b20032802a00221050c040b410121010b20034180036a41086a220a200836020020032008360284032003200136028003200320034180036a36029801200720034198016a200510d90220082005490d0c200a28020022072008490d0d200228020022022006490d0e200328028003210720032802a00221012003200820056b2208360290032003200220066b22023602940320082002470d0f200720056a200120066a20081094041a20032903d002210b02402003280284032208200a28020022056b41084f0d00200541086a22022005490d1d20084101742205200220022005491b22054100480d1d2008450d0420032802800320082005102722080d050c130b20032802800321080c050b200a10262205450d0f0b2003200a3602a402200320053602a0022002280200210a0b2002200a41086a3602002005200a6a200b37000020112802002108024002400240024020032802a40222052002280200220a6b41044f0d00200a41046a2206200a490d1d2005410174220a20062006200a491b220a4100480d1d2005450d0120032802a0022005200a102722050d020c120b20032802a00221050c020b200a10262205450d100b2003200a3602a402200320053602a0022002280200210a0b2002200a41046a3602002005200a6a20083600002002280200211220032802a402210920032802a00222050d120c140b200510262208450d0e0b20032005360284032003200836028003200a28020021050b200a200541086a360200200820056a200b3700002011280200210202400240024002402003280284032208200a28020022056b41044f0d00200541046a22062005490d1a20084101742205200620062005491b22054100480d1a2008450d0120032802800320082005102722080d020c110b20032802800321080c020b200510262208450d0f0b20032005360284032003200836028003200a28020021050b200a200541046a360200200820056a2002360000200a28020021122003280284032109200328028003210520032802a402450d0e20032802a002102320050d0f0c110b41124101102a000b41204101102a000b41c0004101102a000b20064101102a000b20094101102a000b20084101102a000b200520081048000b20082007108c01000b200620021048000b200320034190036a36029803200320034194036a36029c0320034198016a41146a4100360200200341e8026a41146a4103360200200341f4026a4104360200200341b0026a41146a4103360200200341a886c5003602a8012003420137029c01200341a881c50036029801200341043602ec02200342033702b402200341d480c5003602b002200320034198016a3602f80220032003419c036a3602f002200320034198036a3602e8022003200341e8026a3602c002200341b0026a41e481c5001061000b200a4101102a000b200a4101102a000b20054101102a000b20054101102a000b2005450d020b200441c00020052012100402402009450d00200510230b200041206a210020041023201041606a22100d000c020b0b200410230b200341a0036a24000f0b101d000b41d4aac10041331021000b20054101102a000b101e000b20034198016a10d802200341a0036a24000b8d0c03037f017e037f230041b0026b2205240020054188016a41086a22064200370300200542003703880141a387c000411920054188016a1000200541086a20062903003703002005200529038801370300410021060240024002400240024002400240024002400240024002400240024002402005411041a886c500410041001001417f460d0020054100360288012005411020054188016a41044100100141016a41044d0d0120052802880121060b024002402006417f6a220720064d0d002005410e3602080c010b2005200710382005280208410e460d0020054188016a20054188011094041a200529038801210820054188016a41086a102420082001580d00200041b588c00036020420004101360200200041086a41c70036020020021024200541b0026a24000f0b20054188016a41086a22074200370300200542003703880141a387c000411920054188016a1000200541086a200729030037030020052005290388013703002005200641016a360288012005411020054188016a4104100420052001370388012007200241f0001094042109200520033a0088022005200437038002411a10262207450d01200741186a41002f00dc86403b0000200741106a41002900d48640370000200741086a41002900cc8640370000200741002900c486403700002007411a413410272202450d022002200636001a200541186a220a4200370300200541106a220b4200370300200541086a22074200370300200542003703002002411e2005100220054190026a41186a200a29030037030020054190026a41106a200b29030037030020054190026a41086a200729030037030020052005290300370390022005410036020820054201370300200529038801210141081026220a450d032005410836020420072007280200220b41086a3602002005200a360200200a200b6a20013700002009200510390240024002400240024002400240024002400240024020054188026a2d000022074101460d0020074102470d012005280204200541086a2802002207470d03200741016a220a2007490d162007410174220b200a200a200b491b220b4100480d162007450d0720052802002007200b1027220a450d080c130b2005280204200541086a2802002207470d01200741016a220a2007490d152007410174220b200a200a200b491b220b4100480d152007450d0420052802002007200b1027220a450d050c100b2005280204200541086a2802002207470d02200741016a220a2007490d142007410174220b200a200a200b491b220b4100480d142007450d0720052802002007200b1027220a450d080c0d0b2005280200210a0c0f0b2005280200210a0c100b2005280200210a0c0b0b200b1026220a0d0b0b200b4101102a000b200b1026220a0d0b0b200b4101102a000b200b1026220a0d050b200b4101102a000b41d4aac10041331021000b411a4101102a000b41344101102a000b41084101102a000b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41003a00000c040b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41013a00000c020b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41023a00000b20054180026a29030021010240024002402005280204220a200541086a28020022076b41084f0d00200741086a220b2007490d03200a4101742207200b200b2007491b22074100480d03200a450d012005280200200a20071027220a450d020c040b2005280200210a0c040b20071026220a0d020b20074101102a000b101e000b200520073602042005200a360200200541086a28020021070b200541086a220b200741086a360200200a20076a20013700002005280204210720054190026a41202005280200220a200b280200100402402007450d00200a10230b200210232009102420054194016a200636020020054191016a20033a000020054188016a41086a41033a0000200541053a00880141a886c500410020054188016a102c2000410036020020002006360204200541b0026a24000bf10401047f230041c0046b22012400200141d0036a41086a22024200370300200142003703d003418388c0004116200141d0036a1000200141d8016a41086a2002290300370300200120012903d0033703d8010240024002400240200141d8016a411041a886c500410041001001417f460d00200142103702ec012001200141d8016a3602e801200141d0036a200141e8016a102f20012802d003410e460d03200141e0026a200141d0036a41f0001094041a200141003a00f40120012802e80120012802ec01200141f4016a4101200141f0016a22022802001001210320022002280200200341016a41014b22036a3602002003450d0220012d00f401220341034f0d0220012802e0022102200141f4016a200141e0026a41047241ec001094041a2002410e460d03200141d0036a200141f4016a41ec001094041a200141d8016a411010030c010b410e21020b200141ec006a200141d0036a41ec001094041a02402002410e470d00200141c0046a2400419988c0000f0b2001200141ec006a41ec00109404220141013a00e002200141d0036a41086a22044200370300200142003703d00341f186c000411f200141d0036a1000200141d8016a41086a2004290300370300200120012903d0033703d801200141d8016a4110200141e0026a41011004200441023a0000200141053a00d0034100210441a886c5004100200141d0036a102c200120023602d003200141d0036a410472200141ec001094041a200141e0026a20004280e20e7c200141d0036a20034280e90f102d024020012802e0024101470d0020012802e40221040b200141c0046a240020040f0b200141e0026a10240b41d4aac10041331021000b965605047f057e0a7f027e047f230041b0086b22022400200241003a00d00620012802002001280204200241d0066a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00d0062203410d4b0d0e024020030e0e00090607030a0c080e050d02040b000b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d6120022d00bc05220341044b0d61024020030e050029252624000b20022001104a2002280200450d6120022802042203417f4c0d622003450d4d200310ac012205450d6c200141086a2204200341002001280200200141046a280200200520032004280200100122012001417f461b2201200120034b1b220120042802006a36020020012003470d4e0c760b2000410e360200200241b0086a24000f0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d2020022d00bc05220341044b0d20024020030e05001f1d1e1c000b200241b0036a2001104c20022903b003a7450d20200241c0036a290300210620022903b8032107200241d0066a200110c20220022d00d00622034102460d20200241ec066a2902002108200241e4066a290200210920022f00d106210120022d00d306210420022902d406210a2002200241dc066a2902003703e8052002200a3703e005200220093703f00520012004411074722101410121040c1f0b41002103200241003a00bc052001280200200141046a280200200241bc056a4101200410012104200141086a220b200b280200200441016a41014b22046a220b3602002004450d5120022d00bc050d51200241e8066a220c4200370300200241e0066a4200370300200241d0066a41086a220d4200370300200242003703d006200141086a220341002001280200200141046a220e280200200241d0066a4120200b100122042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d50200241e0056a41086a200d290300370300200220022903d0063703e005200c290300210620022903e0062107200220022f00e1053b01bc0520022d00e005210420022800e305210b20022800e705211020022800eb05211120022d00ef052105200220022f01bc053b01f804200c4200370300200d4200370300200242003703e006200242003703d006200341002001280200200e280200200241d0066a4120200f1001220c200c417f461b220c4120200c4120491b20032802006a360200200c411f4d0d50200241e0056a41086a200241d0066a41086a290300370300200220022903d0063703e005200241e8066a2903002108200241e0066a2903002109200220022f00e10522033b01bc05200241eb056a280000210c200241ef056a2d0000210d20022d00e005210e20022800e305210f20022800e7052112200220033b019805200220033b01de05200220022f01f8043b01b00420024180016a2001104a200228028001450d502002280284012213417f4c0d5f2013450d4e201310ac012203450d6b200141086a2214201341002001280200200141046a280200200320132014280200100122012001417f461b2201200120134b1b220120142802006a36020020012013470d4f0c710b200241c0076a200110c00220022d00c0072101200241d0066a200241c0076a41017241e7001094041a20014107470d0b2000410e360200200241b0086a24000f0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6e20022d00d006450d0c0c6e0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22012001280200200341016a41014b6a3602002000410e360200200241b0086a24000f0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d0f20022d00bc0522034101460d0d20030d0f200241c0076a200110c20220022d00c00722034102460d0f20022d00c307211020022f00c1072111200241cc076a2902002106200241dc076a2902002107200241d8076a2802002104200241d4076a280200210b20022902c4072108200241386a2001104c2002280238450d0f20112010411074722101200241386a41106a2903002109410121102002290340210a0c0e0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d3320022d00bc05220341094b0d33024020030e0a00272425222a2b262d23000b200241d0066a200110a60220022802d0062203450d3320022902d406210620024188026a2001104a2006a72104200228028802450d32200228028c022110200141046a2802002111200141086a220b2802002105200241003602d006200b410020012802002011200241d0066a41042005100122012001417f461b2201410420014104491b200b2802006a360200200141034d0d3220064220882106200441087621012003410876210c20022802d006210d4101210e0c270b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6920022d00d006450d090c690b200241003a00bc054104210b2001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a22103602002003450d5220022d00bc05220d410c4b0d520240200d0e0d00383a51343c3d3b3e363f3335000b200241d0066a200110c20220022d00d00622044102460d5220022d00d306211020022f00d106210c200241dc066a2902002106200241ec066a2902002107200241e8066a2802002111200241e4066a280200210320022902d406210820024188016a2001104c200229038801a7450d5220024188016a41106a290300210a2002290390012109200241003a00bc052001280200200141046a280200200241bc056a4101200141086a22012802001001210b20012001280200200b41016a41014b220b6a360200200b450d5220022d00bc05220541034f0d52200c201041107472210c4101210b0c500b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d0d20022d00d00622034101460d0c20030d0d200241c0076a2001102f20022802c0072103200241d0066a200241c0076a41047241ec001094041a2003410e460d0d200241e0056a200241d0066a41ec001094041a41f00010262201450d5d20012003360200200141046a200241e0056a41ec001094041a20024198056a41186a200241bc056a41186a29020037030020024198056a41106a200241bc056a41106a29020037030020024198056a41086a200241bc056a41086a290200370300200220022902bc053703980520014108762104410121030c1c0b200241d0066a20011049200220022f01d2063b01e0052002200241f2066a2f01003b01bc0520022d00d00622014111470d042000410e360200200241b0086a24000f0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6420022d00d006450d060c640b200241003a00bc05410421032001280200200141046a280200200241bc056a4101200410012104200141086a220b200b280200200441016a41014b22046a220b3602002004450d0d20022d00bc0522044102460d0c20044101460d0b20040d0d200241c0076a2001102f4104210320022802c0072101200241d0066a200241c0076a41047241ec001094041a2001410e460d0d200241e0056a200241d0066a41ec001094041a41f00010262204450d5c20042001360200200441046a200241e0056a41ec001094041a200220022f0198053b01de05200220022f01bc053b01ae04410121030c0e0b2000410e360200200241b0086a24000f0b200241e0056a200241d0066a41e7001094041a200041086a20013a00002000410c360200200041096a200241e0056a41e7001094041a200241b0086a24000f0b200241d0066a41196a2900002106200241d0066a41116a2900002107200241d0066a41216a2d00002103200241d0066a41106a2d00002104200241d0066a410c6a280200210b200241d0066a41086a280200211020022802d406211120022d00d1062105200220022f01e0053b01b004200220022f01bc053b019805200241f4066a280200210c200041216a2006370000200041196a2007370000200020053a0009200041086a20013a000020004106360200200020033a0029200041186a20043a0000200041146a200b360200200041106a20103602002000410c6a20113602002000412c6a200c360200200020022f01b0043b000a200020022f0198053b012a200041306a20022903c007370300200041386a200241c0076a41086a290300370300200041c0006a200241c0076a41106a290300370300200041c8006a200241c0076a41186a290300370300200041d0006a200241e0076a290300370300200041d8006a200241e8076a290300370300200041e0006a200241c0076a41306a290300370300200041e8006a200241c0076a41386a290300370300200241b0086a24000f0b20024198036a2001104b200229039803a7450d6120022903a003210620004109360200200041086a2006370300200041106a200241c0076a41e0001094041a200241b0086a24000f0b200241286a2001104b2002290328a7450d5f2002290330210620004101360200200041086a2006370300200041106a200241c0076a41e0001094041a200241b0086a24000f0b200241a8036a2001104a20022802a803450d5d20022802ac032203417f4c0d4e2003450d24200310ac012204450d55200141086a220b200341002001280200200141046a28020020042003200b280200100122012001417f461b2201200120034b1b2201200b2802006a36020020012003470d250c5c0b200241c0076a200110c20220022d00c00722034102460d0120022d00c307211020022f00c1072111200241cc076a2902002106200241dc076a2902002107200241d8076a2802002104200241d4076a280200210b20022902c4072108200241e8006a2001104c2002290368a7450d01200241e8006a41106a29030021092002290370210a200241d0006a2001104c2002290350a7450d0120112010411074722101200241e0006a290300211520022903582116410221100b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2015370200200041c0006a2016370200200041386a2009370200200041306a200a370200200041186a2006370000200041106a2008370000200041286a2007370000200041246a2004360000200041206a200b3600002000410c6a20033a0000200041086a2010360200200041d0006a20022903d006370300200041d8006a200241d0066a41086a290300370300200041e0006a200241d0066a41106a290300370300200041e8006a200241d0066a41186a290300370300200241b0086a24000f0b2000410e360200200241b0086a24000f0b200241c0076a200110c202200241d0066a41086a220b200241cc076a290200370300200241d0066a41106a2210200241d4076a290200370300200241d0066a41186a2211200241dc076a290200370300200220022902c4073703d0064102210320022d00c00722014102470d0e0b2000410e360200200241b0086a24000f0b20024188036a2001104a200228028803450d01200228028c032104200241c0076a2001102f4104210320022802c0072101200241d0066a200241c0076a41047241ec001094041a2001410e460d01200241e0056a200241d0066a41ec001094041a41f0001026220b450d51200b2001360200200b41046a200241e0056a41ec001094041a200220022f0198053b01de05200220022f01ce053b01ae04410221030c020b200241e8066a22114200370300200241e0066a4200370300200241d0066a41086a4200370300200242003703d00641042103200141086a221041002001280200200141046a280200200241d0066a4120200b100122042004417f461b2204412020044120491b20102802006a3602002004411f4d0d00200220022f00d1063b01bc052011290300210720022903e006210620022d00d006210520022800d306210420022800d706210b20022800db06211020022d00df062111200220022f01bc053b01980520024190036a2001104a200228029003450d00200228029403210c200241003a00c007410421032001280200200141046a280200200241c0076a4101200141086a22012802001001210d20012001280200200d41016a41014b220d6a360200200d450d0020022d00c0072101200220022f01980522033b01f804200220033b01de05410321030c010b0b200220022f01de053b01e005200220022f01ae043b01bc05024020034104470d002000410e360200200241b0086a24000f0b200220022f01e0053b01ac04200220022f01bc053b01aa042000411d6a2007370000200041156a2006370000200020053a0005200020033a000420004108360200200020013a0025200041146a20113a0000200041106a20103602002000410c6a200b360200200041086a2004360200200041286a200c360200200020022f01ac043b0006200020022f01aa043b01262000412c6a200241b0046a41c4001094041a200241b0086a24000f0b200241a0046a2001104a20022802a004450d0420022802a4042203410876210141052104420021080c030b20024190046a2001104a200228029004450d032002280294042103200241f8036a2001104c20022903f803a7450d0320024188046a29030021062002290380042107200241e8036a2001104b20022903e803a7450d0320022903f0032108200241e0036a2001104a20022802e003450d0320022802e4032101200241f0056a2006370300200220073703e805200220013602e00520034108762101410321040c020b20024198046a2001104a200228029804450d02200228029c042203410876210141042104420021080c010b200241c8036a2001104c20022903c803a7450d01200241d8036a2903002106200220022903d0033703e005200220063703e805410221040b200241d0066a41106a200241e0056a41106a2903002209370300200241d0066a41086a200241e0056a41086a290300220a370300200241b0046a41086a220b200a370300200241b0046a41106a22102009370300200220022903e00522093703b004200220093703d006200041386a2006370200200041306a20073702002000410c6a2001410874200341ff017172360200200041086a20043602002000410b360200200041286a2008370200200041106a20022903b004370200200041186a200b290300370200200041206a2010290300370200200041c0006a20022903c007370300200041c8006a200241c0076a41086a290300370300200041d0006a200241c0076a41106a290300370300200041d8006a200241c0076a41186a290300370300200041e0006a200241c0076a41206a290300370300200041e8006a200241c0076a41286a290300370300200241b0086a24000f0b200241d0066a41106a200241e0056a41106a290300370300200241d0066a41086a200241e0056a41086a290300370300200220022903e0053703d0062000410e360200200241b0086a24000f0b200241d0066a200110a80220022802d0062205450d3d20022902d4062106410521010c530b200241086a2001104a2002280208450d3c200228020c2203417f4c0d3d2003450d26200310ac012205450d48200141086a2204200341002001280200200141046a280200200520032004280200100122012001417f461b2201200120034b1b220120042802006a36020020012003470d270c4a0b200241206a2001104a2002280220450d3b20022802242214ad42187e2206422088a70d3c2006a72203417f4c0d3c2003450d292003102622050d2a20034104102a000b20022f00c10720022d00c30741107472210420024198056a41186a201129030037030020024198056a41106a201029030037030020024198056a41086a200b290300370300200220022903d006370398050b200241f8046a41186a220b20024198056a41186a290300370300200241f8046a41106a221020024198056a41106a290300370300200241f8046a41086a221120024198056a41086a29030037030020022002290398053703f804200041086a2004410874200141ff017172360200200020033602042000410d3602002000410c6a20022903f804370200200041146a20112903003702002000411c6a2010290300370200200041246a200b2903003702002000412c6a200241b0046a41c4001094041a200241b0086a24000f0b200242003703d006200141086a220341002001280200200141046a280200200241d0066a41082004100122012001417f461b2201410820014108491b20032802006a360200200141074d0d3820022903d0062106410221010c4e0b200241b8026a2001104a20022802b802450d1120022802bc022203410876210c4105210e0c090b200241f8026a2001104b20022903f802a7450d10200229038003220742208821062007a722044108762101410a210e0c0a0b200241a8026a2001104a20022802a802450d0f20022802ac022103200241d0066a200110c20220022d00d00622044102460d0f20022d00d306211020022f00d1062111200241dc066a2902002109200241ec066a2902002107200241e8066a280200210c200241e4066a280200210b20022902d4062106200241a0026a2001104a20022802a002450d0f20022802a402210520024198026a2001104a200228029802450d0f20112010411074722101200228029c02210d2002200c3602e0052003410876210c2006422088a72110200220073702e4052007422088a7210f2009422088a7211120022903e0052107200dad21082009a7210d420021094103210e0c0b0b200241b0026a2001104a20022802b002450d0e20022802b4022203410876210c4104210e0c060b200241d0066a200110c20220022d00d00622034102460d0d20022902d406220742208821064108210e2007a72204410876210120022f00d10620022d00d30641107472210c200241dc066a2902002208422088a7210d200241e4066a2802002111200241e8066a280200210b200241ec066a29020021072008a721100c020b200241d0066a200110a60220022802d0062203450d0c20022902d406210620024190026a2001104a2006a72104200228029002450d0b2002280294022110200141046a2802002111200141086a220b2802002105200241003602d006200b410020012802002011200241d0066a41042005100122012001417f461b2201410420014104491b200b2802006a360200200141034d0d0b20064220882106200441087621012003410876210c20022802d006210d4102210e0b0b0c060b200241d0066a200110c20220022d00d00622034102460d0920022d00d306210420022f00d1062110200241dc066a290200210a200241ec066a2902002107200241e8066a280200210b200241e4066a280200211120022902d4062116200241c8026a2001104c20022903c802a7450d09200241c8026a41106a290300210920022903d0022108200241c0026a2001104a20022802c002450d092010200441107472210c20022802c402210f201642208821062016a722044108762101200a422088a7210d200aa721104106210e0c050b200241e0026a2001104a20022802e002450d0820022802e4022203410876210c4107210e0b42002106410021010c020b200241e8026a2001104b20022903e802a7450d0620022903f002220742208821062007a7220441087621014109210e0b0b0b20004107360200200041c0006a2009370200200041386a2008370200200041346a2005360200200041306a200f360200200041286a2007370200200041246a200b360200200041206a20113602002000411c6a200d360200200041186a2010360200200041086a200e360200200041c8006a20022903c0073703002000410c6a200c410874200341ff017172360200200041d0006a200241c0076a41086a290300370300200041d8006a200241c0076a41106a290300370300200041e0006a200241c0076a41186a290300370300200041e8006a200241c0076a41206a290300370300200041106a20064220862001ad42ffffff07834208862004ad42ff01838484370200200241b0086a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d370b2003450d37200410230c370b2004450d00200310230b2000410e360200200241b0086a24000f0b20024180026a2001104a200228028002450d1f2002280284022104200220022f0198053b01b0042004410876210c410c210b0c030b200241e8016a2001104a20022802e801450d1e20022802ec012103200241d0016a2001104c20022903d001a7450d1e200241e0016a290300210620022903d8012108200220022f01d0063b01b0044105210b4100210c0c040b200241d0066a2001102820022802d0062204450d1d20022902d4062108200220022f0198053b01b0042004410876210c410d210b0c180b200241f8016a2001104a20022802f801450d1c20022802fc012104200220022f01d0063b01b0042004410876210c410a210b0b420021060c090b200241a0016a2001104c20022903a001a7450d1a200241b0016a290300210620022903a8012108200220022f01d0063b01b00420022802e005210320022802e405211120022903e80521074102210b4100210c0b0c160b200241b8016a2001104c20022903b801a7450d18200241c8016a290300210620022903c0012108200220022f01e0053b01b004200241e8066a290300210a20022903e006210920022802d006210320022802d406211120022903d80621074103210b4100210c0c150b200241003a00bc052001280200200141046a280200200241bc056a4101201010012103200141086a22012001280200200341016a41014b22016a3602002001450d1720022d00bc05220541034f0d17200220022f01d0063b01b0044108210b420021064100210c0c150b200241f0016a2001104a20022802f001450d1620022802f4012213ad42247e2206422088a70d1c2006a72203417f4c0d1c2003450d0f2003102622040d1020034104102a000b4107210b0c020b200241d0066a200110c20220022d00d00622044102460d14200241dc066a290200210620022902d4062108200241e4066a2802002103200241e8066a2802002111200241ec066a290200210720022f00d106210120022d00d306210b200220022f01e0053b01b0042001200b41107472210c4109210b0c110b410b210b0b0b0c0d0b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d230b20030d130c140b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d280b20030d110c120b410421050b024002402014450d0042002106200141086a2111200141046a21124100210d4100210341002110201421130340200241186a2001104a2002280218450d11200228021c220b417f4c0d1402400240200b450d00200b10ac01220e450d1b2011200b410020012802002012280200200e200b2011280200100122042004417f461b22042004200b4b1b220420112802006a3602002004200b460d010c120b4101210e2001280200201228020041014100201128020010011a4100200b470d110b200241106a2001104a2002280210450d1020022802142204417f4c0d14024002402004450d00200410ac01220f450d1a20112004410020012802002012280200200f200420112802001001220c200c417f461b220c200c20044b1b220c20112802006a360200200c2004460d010c110b4101210f2001280200201228020041014100201128020010011a41002004470d100b201041016a210c024020102013470d00200d200c200c200d491b2213ad42187e2207422088a70d162007a722174100480d1602402010450d00200520032017102722050d010c180b201710262205450d170b200520036a2210200e360200201041146a2004360200201041106a20043602002010410c6a200f360200201041046a200bad220742208620078437020020064280808080107c2106200d41026a210d200341186a2103200c2110200c2014490d000c020b0b41002113420021060b2005450d1020062013ad842106410421010c260b410121032001280200200141046a28020041014100200141086a28020010011a41002013460d220b2013450d00200310230b410021030b0c200b410421040b024002402013450d0042002106200241d0066a410c6a2114200241d0066a411c6a2117200241d0066a41186a2118200241d0066a41146a2119410021114100211041002103201321120340200241d0066a200110c20220022d00d00622054102460d07200341016a210b20022d00d306210c20022f00d106210d20142902002107201729020021082018280200210e2019280200210f20022902d4062109024020032012470d002011200b200b2011491b2212ad42247e220a422088a70d10200aa7221a4100480d1002402003450d0020042010201a102722040d010c130b201a10262204450d120b200420106a220320053a0000200341036a200d200c4110747222054110763a0000200341016a20053b00002003410c6a2007370000200341046a20093700002003411c6a2008370000200341186a200e360000200341146a200f36000020064280808080107c2106201141026a2111201041246a2110200b2103200b2013490d000c020b0b41002112420021060b2004450d0520062012ad842108200220022f01e0053b01b0042004410876210c4106210b0b0b0b0b200220022f01b00422013b01d006200220013b01f804200041386a200a370000200041306a2009370000200041186a2006370000200041106a2008370000200020053a0009200041086a200b3a000020004105360200200041286a2007370000200041246a2011360000200041206a20033600002000410c6a200c410874200441ff017172360000200020022f01f8043b000a200041c0006a20022903c007370300200041c8006a200241c0076a41086a290300370300200041d0006a200241c0076a41106a290300370300200041d8006a200241c0076a41186a290300370300200041e0006a200241c0076a41206a290300370300200041e8006a200241c0076a41286a290300370300200241b0086a24000f0b2012450d00200410230b200220022f01b0043b01d0062000410e360200200241b0086a24000f0b2004450d00200f10230b200b450d00200e10230b02402010450d002005210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200341686a22030d000b0b2013450d010b200510230b2000410e360200200241b0086a24000f0b101d000b101e000b20174104102a000b201a4104102a000b20044101102a000b200b4101102a000b41f0004108102a000b20034101102a000b41f0004108102a000b41f0004108102a000b20034101102a000b20034101102a000b20134101102a000b2003ad22064220862006842106410321010c070b200020043602042000410a360200200041086a2003ad2206422086200684370200200041106a200241c0076a41e0001094041a200241b0086a24000f0b2000410e360200200241b0086a24000f0b2000410e360200200241b0086a24000f0b2000410e360200200241b0086a24000f0b200220022f01b0043b01ae04200220022f01de053b01ac042013ad220a422086200a84210a0b200220022f01ae043b01d006200220022f01ac043b01e00502402003450d00200220022f01d0063b01aa04200220022f01e0053b01a804200041286a2006370000200041206a2007370000200041c8006a2008370000200041c0006a2009370000200041106a20043a0000200041086a200a3702002000200336020420004104360200200041306a200e3a0000200020053a001f2000201136001b200041176a2010360000200041136a200b3600002000200d3a003f2000200c36003b200041376a2012360000200041336a200f360000200020022f01aa043b0011200020022f01a8043b0031200041e8006a200241d8076a290300370300200041e0006a200241c0076a41106a290300370300200041d8006a200241c0076a41086a290300370300200041d0006a20022903c007370300200241b0086a24000f0b2000410e360200200241b0086a24000f0b2003ad22064220862006842106410121010b20004100360200200041106a20063702002000410c6a2005360200200041086a2001360200200041186a200241c0076a41d8001094041a200241b0086a24000bd20201047f230041d0006b22022400024002400240411310262203450d002003410f6a41002800e28740360000200341086a41002900db8740370000200341002900d3874037000020034113412610272203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a102820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031023200241d0006a24000f0b41134101102a000b41264101102a000b41d4aac10041331021000ba70301047f230041c0006b22022400024002400240411010262203450d00200341086a410029009886403700002003410029009086403700002001280200210420034110412010272203450d01200320043600102003412041c00010272203450d02200320012900043700142003412c6a2001411c6a290000370000200341246a200141146a2900003700002003411c6a2001410c6a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034134200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290320370300410021010240024002402002412041a886c500410041001001417f460d00200241003a002020024120200241206a41014100100141016a41014d0d0220022d0020220441ff0071220141064f0d02200441077621040c010b410021040b20031023200020013a0001200020043a0000200241c0006a24000f0b41d4aac10041331021000b41104101102a000b41204101102a000b41c0004101102a000bb81604047f047e107f087e230041b0046b22052400024002400240024002400240024002400240024002402004450d0020054190046a41186a2206420037030020054190046a41106a2207420037030020054190046a41086a22084200370300200542003703900441e687c000411d20054190046a1002200541e8026a41186a2006290300370300200541e8026a41106a2007290300370300200541e8026a41086a200829030037030020052005290390043703e802410021070240200541e8026a412041a886c500410041001001417f460d00200541d0036a41186a4200370300200541d0036a41106a4200370300200541d0036a41086a4200370300200542003703d003200541e8026a4120200541d0036a4120410010012206417f460d0a2006411f4d0d0a200541a0026a41186a200541d0036a41186a290300370300200541a0026a41106a200541d0036a41106a290300370300200541a0026a41086a200541d0036a41086a290300370300200520052903d0033703a002410121070b412810262206450d0a200620073a0004200641a886c500360200200620052903a002370005200620052f00e8023b00252006410d6a200541a8026a290300370000200641156a200541b0026a2903003700002006411d6a200541b8026a290300370000200641276a200541ea026a2d00003a0000200541a0026a20061033420021094200210a4200210b4200210c20052d00e0024106460d022004417f6a210d200541e8026a41206a2108200541e8026a41c0006a220e2002460d01200541e8026a41186a210f200541e8026a41106a2110200541c8036a2111200341ff017121124200210b4200210c420021094200210a0340200f200c3703002010200b370300200520093703e8022005200a3703f0022008200541a0026a41c10010940421040240200e200241201096040d00200541f0036a41186a2213200441186a2214290200370300200541f0036a41106a2215200441106a2216290200370300200541f0036a41086a2217200441086a2218290200370300200520042902003703f003411010262207450d06200741086a4100290098864037000020074100290090864037000020074110412010272207450d09200720013600102007412041c00010272207450d0a200720052903f0033700142007412c6a2013290300370000200741246a20152903003700002007411c6a201729030037000020054190046a41186a2219420037030020054190046a41106a221a420037030020054190046a41086a221b420037030020054200370390042007413420054190046a1002200541d0036a41186a2019290300370300200541d0036a41106a201a290300370300200541d0036a41086a201b29030037030020052005290390043703d003200541d0036a412041a886c500410041001001211c20071023201c417f470d0020112d00002107201320142900003703002015201629000037030020172018290000370300200520042900003703f00302404100417f4101200720124b1b20072012461b41016a41014b0d00200321070b20054190026a200541f0036a103420054190026a41086a290300211d200529039002211e02400240200741ff0171450d00200541d0016a201d42002007ad42ff0183221f4200109804200541e0016a201e4200201f420010980420192013290300370300201a2015290300370300201b2017290300370300200520052903f00337039004200541f0016a200120054190046a2007200d1032200541c0016a42004200201e4200109804427f200541e0016a41086a290300221f20052903d00120052903c0017c7c222020052903d80120052903c801844200522020201f547222041b2120427f20052903e00120041b211f200541f0016a41186a2903002121200541f0016a41086a2903002122200529038002212320052903f00121240c010b20054190016a201e201d420a420010970420192013290300370300201a2015290300370300201b2017290300370300200520052903f00337039004200541a0016a200120054190046a4100200d1032200541a0016a41186a2903002121200541a0016a41086a290300212220052903b001212320052903a0012124200529039001221f211e20054190016a41086a2903002220211d0b201d200c7c201e200b7c220c201e54ad7c20217c200c20237c220b200c54ad7c210c2020200a7c201f20097c220a201f54ad7c20227c200a20247c2209200a54ad7c210a0b200541a0026a20061033200541a0026a41c0006a2d00004106470d000c030b0b4200210b4200210c420021094200210a0c020b200541c8036a211a200341ff017121194200210b4200210c420021094200210a0340200541e8026a41186a200c370300200541e8026a41106a200b370300200520093703e8022005200a3703f0022008200541a0026a41c100109404210f200541f0036a41186a2207200541a0026a41186a290300370300200541f0036a41106a2202200541a0026a41106a290300370300200541f0036a41086a220e200541a0026a41086a290300370300200520052903a0023703f003411010262204450d03200441086a4100290098864037000020044100290090864037000020044110412010272204450d04200420013600102004412041c00010272204450d05200420052903f0033700142004412c6a2007290300370000200441246a20022903003700002004411c6a200e29030037000020054190046a41186a2210420037030020054190046a41106a2213420037030020054190046a41086a2215420037030020054200370390042004413420054190046a1002200541d0036a41186a2010290300370300200541d0036a41106a2013290300370300200541d0036a41086a201529030037030020052005290390043703d003200541d0036a412041a886c50041004100100121172004102302402017417f470d00201a2d000021042007200f41186a2900003703002002200f41106a290000370300200e200f41086a2900003703002005200f2900003703f00302404100417f4101200420194b1b20042019461b41016a41014b0d00200321040b20054180016a200541f0036a103420054180016a41086a290300211d200529038001211e02400240200441ff0171450d00200541c0006a201d42002004ad42ff0183221f4200109804200541d0006a201e4200201f420010980420102007290300370300201320022903003703002015200e290300370300200520052903f00337039004200541e0006a200120054190046a2004200d1032200541306a42004200201e4200109804427f200541d0006a41086a290300221f200529034020052903307c7c222020052903482005290338844200522020201f547222041b2120427f200529035020041b211f200541e0006a41186a2903002121200541e0006a41086a290300212220052903702123200529036021240c010b2005201e201d420a420010970420102007290300370300201320022903003703002015200e290300370300200520052903f00337039004200541106a200120054190046a4100200d1032200541106a41186a2903002121200541106a41086a290300212220052903202123200529031021242005290300221f211e200541086a2903002220211d0b201d200c7c201e200b7c220c201e54ad7c20217c200c20237c220b200c54ad7c210c2020200a7c201f20097c220a201f54ad7c20227c200a20247c2209200a54ad7c210a0b200541a0026a20061033200541a0026a41c0006a2d00004106470d000b0b200610230b2000200b37031020002009370300200041186a200c3703002000200a370308200541b0046a24000f0b41104101102a000b41204101102a000b41c0004101102a000b41204101102a000b41c0004101102a000b41d4aac10041331021000b41284104102a000b8d0903037f047e067f230022022103200241e0026b416071220224002001411c6a22042902002105200420022903f801370200200141146a22042902002106200420022903f0013702002001410c6a22042902002107200420022903e801370200200241003a00e00120012902042108200120022903e00137020420022005370378200220063703702002200737036820022008370360200141246a2d00002109200241e0016a41176a22042002290078370000200241e0016a41106a220a2002290071370300200241e0016a41086a220b2002290069370300200220022900613703e001024002400240024002402008a741ff01714101470d00200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b290300370300200220022903e001370318411510262204450d012004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272204450d0220042002290318370015200420093a00342004412c6a2002412f6a290000370000200441256a200241186a41106a2903003700002004411d6a200241186a41086a290300370000200241e0016a41186a220a4200370300200241e0016a41106a220b4200370300200241e0016a41086a220c4200370300200242003703e00120044135200241e0016a1002200241386a41186a200a290300370300200241386a41106a200b290300370300200241386a41086a200c290300370300200220022903e001370338200241386a412041a886c500410041001001417f460d03200242203702d4012002200241386a3602d001200241e0016a200241d0016a105920022d0081024102460d04200241a8016a41206a220a200241e0016a41206a2d00003a0000200241a8016a41186a220b200241e0016a41186a290300370300200241a8016a41106a220c200241e0016a41106a290300370300200241a8016a41086a220d200241e0016a41086a290300370300200220022903e0013703a801200241e0006a20024182026a41c1001094041a200241386a41206a220e200a2d00003a0000200241386a41186a220a200b290300370300200241386a41106a220b200c290300370300200241386a41086a220c200d290300370300200220022903a801370338200241e0016a200241e0006a41c1001094041a200141246a200241e0016a41c0006a2d00003a00002001411c6a200241e0016a41386a290000370000200141146a200241e0016a41306a2900003700002001410c6a200241e0016a41286a290000370000200120022900800237000420002002290318370000200041086a200241186a41086a290300370000200041106a200241186a41106a290300370000200041176a200241186a41176a290000370000200020093a001f200041c0006a200e2d00003a0000200041386a200a290300370000200041306a200b290300370000200041286a200c2903003700002000200229033837002020041023200324000f0b200041063a0040200324000f0b41154101102a000b41354101102a000b41faccc40041d7001021000b41d4aac10041331021000ba40604027f017e037f037e230041c0006b22022400024002400240411410262203450d00200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22054200370300200241206a41106a22064200370300200241206a41086a220742003703002002420037032020034134200241206a1002200241186a2005290300370300200241106a2006290300370300200241086a2007290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012205417f460d022005410f4d0d02200241286a29030021082002290320210420031023411810262203450d010c050b42002108200310234118102622030d040b41184101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b200341106a410029008db741370000200341086a4100290085b741370000200341002900fdb641370000024020034118413810272203450d0020032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a29000037000042002109200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034138200241206a1002200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a290300210a200229032021090c010b4200210a0b200310232000200920047c22043703002000200a20087c2004200954ad7c370308200241c0006a24000f0b41d4aac10041331021000b41384101102a000b8507010d7f230041e0006b220124000240024002400240411a10262202450d00200241186a41002f00dc86403b0000200241106a41002900d48640370000200241086a41002900cc8640370000200241002900c486403700002002411a413410272202450d012002200036001a200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002411e200141c0006a1002200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100320021023411310262202450d022002410f6a41002800e28740360000200241086a41002900db8740370000200241002900d3874037000020024113412610272202450d0320022000360013200141c0006a41186a22044200370300200141c0006a41106a22054200370300200141c0006a41086a220342003703002001420037034020024117200141c0006a1002200141206a41186a22062004290300370300200141206a41106a22072005290300370300200141206a41086a200329030037030020012001290340370320200141206a4120100320021023200141c0006a200010302001280244210820012802402109024002400240024020012802482202450d002002410574210a200921030340200141186a220b200341186a290000370300200141106a220c200341106a290000370300200141086a220d200341086a29000037030020012003290000370300411010262202450d02200241086a4100290098864037000020024100290090864037000020024110412010272202450d03200220003600102002412041c00010272202450d04200341206a2103200220012903003700142002412c6a200b290300370000200241246a200c2903003700002002411c6a200d2903003700002004420037030020054200370300200141c0006a41086a220b42003703002001420037034020024134200141c0006a10022006200429030037030020072005290300370300200141206a41086a200b29030037030020012001290340370320200141206a4120100320021023200a41606a220a0d000b0b02402008450d00200910230b200141e0006a24000f0b41104101102a000b41204101102a000b41c0004101102a000b411a4101102a000b41344101102a000b41134101102a000b41264101102a000bd20201057f230041d0006b22022400024002400240411710262203450d002003410f6a41002900cb8740370000200341086a41002900c48740370000200341002900bc874037000020034117412e10272203450d0120032001370017200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a22064200370300200242003703302003411f200241306a1002200241186a2004290300370300200241106a2005290300370300200241086a200629030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a103720022802302204450d0420002002290234370204200020043602000c010b20004100360208200042083702000b20031023200241d0006a24000f0b41174101102a000b412e4101102a000b41d4aac10041331021000beb0603027f017e0b7f230041c0046b22022400200241086a2001104a02400240024002400240024002400240024002400240024002402002280208450d00200228020c2203ad42f8007e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241c0046a24000f0b4108210620030d030b4100210d4100210b0c030b101d000b20054108102a000b200241d8026a4104722107200141086a210541002108410021094100210a2003210b0340200241003a00c8032001280200200141046a220c280200200241c8036a410120052802001001210d20052005280200200d41016a41014b220d6a360200200d450d040240024020022d00c803220d4101460d00200d0d06200241c8036a20024180016a41ec001094041a410e210c0c010b200241c8036a2001102f20022802c803410e460d04200241d8026a200241c8036a41f0001094041a200c280200210d2005280200210c200241003602bc04200541002001280200200d200241bc046a4104200c1001220d200d417f461b220d4104200d4104491b20052802006a360200200d41034d0d0320022802bc04210e20022802d802210c200241ec016a200741ec001094041a200241c8036a200241ec016a41ec001094041a200c410e460d0520024180016a200241c8036a41ec001094041a200241c8036a20024180016a41ec001094041a200c410f460d060b200a41016a210d200241146a200241c8036a41ec001094041a0240200a200b470d002008200d200d2008491b220bad42f8007e2204422088a70d072004a7220f4100480d070240200a450d0020062009200f102722060d010c090b200f10262206450d080b200620096a220a200c360200200a41046a200241146a41ec001094041a200a41f0006a200e360200200841026a2108200941f8006a2109200d210a200d2003490d000b0b2000200b36020420002006360200200041086a200d360200200241c0046a24000f0b200241d8026a10240b200241c8036a200241ec016a41ec001094041a0b200241c8036a20024180016a41ec001094041a0b200041003602000240200a450d0020062105034002402005280200410e460d00200510240b200541f8006a2105200941887f6a22090d000b0b0240200b450d00200610230b200241c0046a24000f0b101e000b200f4108102a000beb0604047f017e027f017e23004180046b220224000240024002400240411a10262203450d00200341186a41002f00dc86403b0000200341106a41002900d48640370000200341086a41002900cc8640370000200341002900c486403700002003411a413410272203450d012003200136001a200241a0026a41186a22014200370300200241a0026a41106a22044200370300200241a0026a41086a22054200370300200242003703a0022003411e200241a0026a1002200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a2005290300370300200220022903a002370308024002400240200241086a412041a886c500410041001001417f460d002002200241086a3602282002412036022c200242003703a00220024100200241086a4120200241a0026a41084100100122012001417f461b2201410820014108491b360230200141074d0d0620022903a0022106200241a0026a200241286a102f20022802a002210120024194036a200241a0026a41047241ec001094041a2001410e460d06200241b4016a20024194036a41ec001094041a20022001360240200241c0006a410472200241b4016a41ec001094042104200241003a00a0022002280228200228022c200241a0026a4101200241306a22012802001001210520012001280200200541016a41014b22056a22073602002005450d0220022d00a002220541034f0d02200242003703a002200241286a41086a220841002002280228200228022c200241a0026a41082007100122012001417f461b2201410820014108491b20082802006a360200200141074d0d0520022903a002210920022802402101200241a0026a200441ec001094041a20022002413c6a2800003600970320022002280039360294032001410e460d06200241c0006a200241a0026a41ec001094041a20022002280097033600b70120022002280294033602b40120002001360208200020063703002000410c6a200241c0006a41ec001094041a20004180016a20053a0000200041f8006a2009370200200020022802b4013600810120004184016a20022800b7013600000c010b2000410e3602080b2003102320024180046a24000f0b200241c0006a102441d4aac10041331021000b411a4101102a000b41344101102a000b200241c0006a10240b41d4aac10041331021000bc6c00102097f027e230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000280200417f6a2203410c4b0d00024002400240024002400240024002400240024020030e0d0008050602090b070d040c0103000b200141046a280200200141086a2802002203470d14200341016a22042003490d6220034101742205200420042005491b22054100480d622003450d2920012802002003200510272204450d2a0c600b200141046a280200200141086a2802002203470d0c200341016a22042003490d5a20034101742205200420042005491b22054100480d5a2003450d1a20012802002003200510272204450d1b0c4e0b200141046a2206280200200141086a22042802002203470d0c200341016a22052003490d6020034101742207200520052007491b22074100480d602003450d1b20012802002003200710272205450d1c0c4b0b200141046a280200200141086a2802002203470d0c200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d1c20012802002003200510272204450d1d0c480b200141046a280200200141086a2802002203470d0c200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d1d20012802002003200510272204450d1e0c450b200141046a280200200141086a2802002203470d0c200341016a22042003490d5d20034101742205200420042005491b22054100480d5d2003450d1e20012802002003200510272204450d1f0c420b200141046a280200200141086a2802002203470d0c200341016a22042003490d5c20034101742205200420042005491b22054100480d5c2003450d1f20012802002003200510272204450d200c3f0b200141046a280200200141086a2802002203470d0c200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d2020012802002003200510272204450d210c3c0b200141046a280200200141086a2802002200470d0d200041016a22032000490d5a20004101742204200320032004491b22044100480d5a2000450d2320012802002000200410272203450d240c390b200141046a2206280200200141086a22042802002203470d0d200341016a22052003490d5920034101742207200520052007491b22074100480d592003450d2420012802002003200710272205450d250c360b200141046a280200200141086a2802002203470d0d200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d2520012802002003200510272204450d260c330b200141046a280200200141086a2802002203470d0d200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d2620012802002003200510272204450d270c300b200141046a280200200141086a2802002203470d0d200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d2720012802002003200510272204450d280c2d0b200141046a280200200141086a2802002203470d0d200341016a22042003490d4e20034101742205200420042005491b22054100480d4e2003450d2820012802002003200510272204450d290c2a0b200128020021040c420b200128020021050c3f0b200128020021040c3c0b200128020021040c390b200128020021040c360b200128020021040c330b200128020021040c300b200128020021040c4c0b200128020021030c2c0b200128020021050c290b200128020021040c260b200128020021040c230b200128020021040c200b200128020021040c1d0b2005102622040d330b20054101102a000b2007102622050d2f0b20074101102a000b2005102622040d2b0b20054101102a000b2005102622040d270b20054101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d360b20054101102a000b2004102622030d150b20044101102a000b2007102622050d110b20074101102a000b2005102622040d0d0b20054101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a0000200041086a280200417f6a220341044b0d1602400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d3d20034101742205200420042005491b22054100480d3d2003450d0f20012802002003200510272204450d100c1b0b200141046a280200200141086a2802002203470d03200341016a22042003490d3c20034101742205200420042005491b22054100480d3c2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d3b20034101742205200420042005491b22054100480d3b2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d3a20034101742205200420042005491b22054100480d3a2003450d0a20012802002003200510272204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d3920034101742205200420042005491b22054100480d392003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110412002200041186a36020c2002410c6a20011066200041286a2001109802200041106a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a36020c2002410c6a200110662000410c6a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200041086a280200417f6a220341094b0d1402400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b200141046a280200200141086a2802002203470d0e200341016a22042003490d6020034101742205200420042005491b22054100480d602003450d1d20012802002003200510272204450d1e0c390b200141046a280200200141086a2802002203470d08200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d1220012802002003200510272204450d130c360b200141046a280200200141086a2802002203470d08200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d1320012802002003200510272204450d140c330b200141046a280200200141086a2802002203470d08200341016a22042003490d5620034101742205200420042005491b22054100480d562003450d1420012802002003200510272204450d150c300b200141046a280200200141086a2802002203470d08200341016a22042003490d5520034101742205200420042005491b22054100480d552003450d1520012802002003200510272204450d160c2d0b200141046a280200200141086a2802002203470d08200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d1620012802002003200510272204450d170c2a0b200141046a280200200141086a2802002203470d09200341016a22042003490d5320034101742205200420042005491b22054100480d532003450d1920012802002003200510272204450d1a0c270b200141046a280200200141086a2802002203470d09200341016a22042003490d5220034101742205200420042005491b22054100480d522003450d1a20012802002003200510272204450d1b0c240b200141046a280200200141086a2802002203470d09200341016a22042003490d5120034101742205200420042005491b22054100480d512003450d1b20012802002003200510272204450d1c0c210b200141046a280200200141086a2802002203470d09200341016a22042003490d5020034101742205200420042005491b22054100480d502003450d1c20012802002003200510272204450d1d0c1e0b200128020021040c2e0b200128020021040c2b0b200128020021040c280b200128020021040c250b200128020021040c220b200128020021040c2b0b200128020021040c1e0b200128020021040c1b0b200128020021040c180b200128020021040c150b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d170b20054101102a000b2005102622040d130b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d0d0b20054101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a200110ec022002200041386a36020c2002410c6a20011066200041306a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001104102400240024002402007450d00200141046a210903400240024002400240200928020020052802002203470d00200341016a22062003490d332003410174220a20062006200a491b220a4100480d332003450d0120012802002003200a102722060d020c060b200128020021060c020b200a10262206450d040b200120063602002009200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a200110412000411c6a2802002104024002400240200141046a2802002203200528020022006b41044f0d00200041046a22052000490d3020034101742200200520052000491b22004100480d302003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b200a4101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a2004360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011041200041106a200110ec02200041346a20011041200041386a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001104102400240024002402007450d00200141046a210903400240024002400240200928020020052802002203470d00200341016a22062003490d272003410174220a20062006200a491b220a4100480d272003450d0120012802002003200a102722060d020c060b200128020021060c020b200a10262206450d040b200120063602002009200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a200110412000411c6a2802002104024002400240200141046a2802002203200528020022006b41044f0d00200041046a22052000490d2420034101742200200520052000491b22004100480d242003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b200a4101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a2004360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a280200417f6a220341044b0d1202400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d4020034101742205200420042005491b22054100480d402003450d0f20012802002003200510272204450d100c1b0b200141046a280200200141086a2802002203470d03200341016a22042003490d3f20034101742205200420042005491b22054100480d3f2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d3e20034101742205200420042005491b22054100480d3e2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d3d20034101742205200420042005491b22044100480d3d2003450d0a20012802002003200410272205450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d3c20034101742205200420042005491b22054100480d3c2003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021050c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2004102622050d070b20044101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041106a290300210b02400240024002400240200141046a2802002203200528020022006b41084f0d00200041086a22042000490d3020034101742200200420042000491b22004100480d302003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200320006a200b370000200241106a24000f0b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41033a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d182003200041186c6a2108200141046a2106024002400340200328020021092002200341086a280200220036020c2002410c6a20011041024002400240024020062802002207200428020022056b20004f0d00200520006a220a2005490d3020074101742205200a200a2005491b22054100480d302007450d01200128020020072005102722070d020c050b200128020021070c020b200510262207450d030b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200920001094041a2003410c6a28020021092002200341146a280200220036020c2002410c6a20011041024002400240024020062802002207200428020022056b20004f0d00200520006a220a2005490d3020074101742205200a200a2005491b22054100480d302007450d01200128020020072005102722070d020c060b200128020021070c020b200510262207450d040b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200920001094041a200341186a22032008470d000c1b0b0b20054101102a000b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2c20044101742203200520052003491b22034100480d2c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00002000410c6a28020021042002200041146a280200220036020c2002410c6a200110412000450d1420042000410c6c6a2108200141046a210902400340200428020021072002200441086a280200220036020c2002410c6a20011041024002400240024020092802002206200528020022036b20004f0d00200320006a220a2003490d2b20064101742203200a200a2003491b22034100480d2b2006450d01200128020020062003102722060d020c050b200128020021060c020b200310262206450d030b2001200636020020092003360200200528020021030b2005200320006a360200200620036a200720001094041a2004410c6a22042008470d000c160b0b20034101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2820044101742203200520052003491b22034100480d282004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41063a0000200041086a22032d0000417f6a2205410f4b0d1002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e10000a0608030b0d090f050e02040c0107000b200628020020042802002203470d18200341016a22042003490d800120034101742205200420042005491b22054100480d80012003450d3120012802002003200510272204450d320c5d0b200628020020042802002200470d0e200041016a22052000490d7f20004101742207200520052007491b22074100480d7f2000450d1e20012802002000200710272205450d1f0c5a0b200628020020042802002200470d0e200041016a22052000490d7e20004101742207200520052007491b22074100480d7e2000450d1f20012802002000200710272205450d200c570b200628020020042802002203470d0e200341016a22052003490d7d20034101742207200520052007491b22074100480d7d2003450d2020012802002003200710272205450d210c540b200628020020042802002200470d0e200041016a22032000490d7c20004101742205200320032005491b22054100480d7c2000450d2120012802002000200510272203450d220c510b200628020020042802002203470d0e200341016a22042003490d7b20034101742205200420042005491b22054100480d7b2003450d2220012802002003200510272204450d230c4e0b200628020020042802002205470d0e200541016a22062005490d7a20054101742207200620062007491b22074100480d7a2005450d2320012802002005200710272206450d240c4b0b200628020020042802002200470d0e200041016a22032000490d7920004101742205200320032005491b22054100480d792000450d2420012802002000200510272203450d250c480b200628020020042802002205470d0e200541016a22062005490d7820054101742207200620062007491b22074100480d782005450d2520012802002005200710272206450d260c450b200628020020042802002203470d0e200341016a22042003490d7720034101742205200420042005491b22054100480d772003450d2620012802002003200510272204450d270c420b200628020020042802002203470d0f200341016a22042003490d7620034101742205200420042005491b22054100480d762003450d2920012802002003200510272204450d2a0c3f0b200628020020042802002203470d0f200341016a22052003490d7520034101742207200520052007491b22074100480d752003450d2a20012802002003200710272205450d2b0c3c0b200628020020042802002200470d0f200041016a22052000490d7420004101742207200520052007491b22074100480d742000450d2b20012802002000200710272205450d2c0c390b200628020020042802002203470d0f200341016a22042003490d7320034101742205200420042005491b22054100480d732003450d2c20012802002003200510272204450d2d0c360b200628020020042802002203470d0f200341016a22042003490d7220034101742205200420042005491b22054100480d722003450d2d20012802002003200510272204450d2e0c330b200628020020042802002200470d0f200041016a22052000490d7120004101742207200520052007491b22074100480d712000450d2e20012802002000200710272205450d2f0c300b200128020021050c4c0b200128020021050c490b200128020021050c460b200128020021030c430b200128020021040c400b200128020021060c3d0b200128020021030c3a0b200128020021060c370b200128020021040c340b200128020021040c450b200128020021040c300b200128020021050c2d0b200128020021050c2a0b200128020021040c270b200128020021040c240b200128020021050c210b2007102622050d3b0b20074101102a000b2007102622050d370b20074101102a000b2007102622050d330b20074101102a000b2005102622030d2f0b20054101102a000b2005102622040d2b0b20054101102a000b2007102622060d270b20074101102a000b2005102622030d230b20054101102a000b2007102622060d1f0b20074101102a000b2005102622040d1b0b20054101102a000b2005102622040d2b0b20054101102a000b2005102622040d150b20054101102a000b2007102622050d110b20074101102a000b2007102622050d0d0b20074101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2007102622050d010b20074101102a000b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a41083a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d4420054101742200200620062000491b22004100480d442005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041186a20011098022000410c6a20011041200041106a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a28020020011039200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410d3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d3e20054101742200200620062000491b22004100480d3e2005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41053a00002000410c6a28020021050240024002400240024020062802002203200428020022006b41044f0d00200041046a22062000490d3c20034101742200200620062000491b22004100480d3c2003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a2005360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a28020020011039200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41033a00002000410c6a2001104120032d00012105200341026a2d0000210602400240024002400240200141046a28020020072802002200470d00200041016a22032000490d3620004101742207200320032007491b22074100480d362000450d0120012802002000200710272203450d020c030b200128020021030c030b2007102622030d010b20074101102a000b20012003360200200141046a2007360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410f3a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41023a00002000410c6a2001104120032d00012105200341026a2d0000210602400240024002400240200141046a28020020072802002200470d00200041016a22032000490d3220004101742207200320032007491b22074100480d322000450d0120012802002000200710272203450d020c030b200128020021030c030b2007102622030d010b20074101102a000b20012003360200200141046a2007360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a20011041200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410c3a0000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200520036a41043a00002000410c6a28020020011039024002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200628020020042802002203470d03200341016a22052003490d3920034101742207200520052007491b22074100480d392003450d0720012802002003200710272205450d080c0f0b200628020020042802002203470d01200341016a22052003490d3820034101742207200520052007491b22074100480d382003450d0420012802002003200710272205450d050c0c0b200628020020042802002203470d02200341016a22052003490d3720034101742207200520052007491b22074100480d372003450d0720012802002003200710272205450d080c090b200128020021050c0b0b200128020021050c0c0b200128020021050c070b2007102622050d070b20074101102a000b2007102622050d070b20074101102a000b2007102622050d010b20074101102a000b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41003a00000c040b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41013a00000c020b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41023a00000b200041106a290300210b0240024002400240024020062802002205200428020022036b41084f0d00200341086a22072003490d2c20054101742203200720072003491b22034100480d2c2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341086a360200200520036a200b370000200041186a290300210b0240024002400240024020062802002203200428020022006b41084f0d00200041086a22052000490d2c20034101742200200520052000491b22004100480d2c2003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a200b3700000c160b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410b3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d2a20054101742200200620062000491b22004100480d2a2005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410e3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22042000490d2820054101742200200420042000491b22004100480d282005450d0120012802002005200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a29000037000020002003290001370000200341216a2d00002001103f200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a280200200110392002200041106a36020c2002410c6a20011066200241106a24000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a00000240024002400240024002400240024002400240024002400240024002400240200041046a22042d000022034103460d00024020034102460d0020034101470d1d200141046a280200200141086a2802002203470d04200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0920012802002003200510272204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d2620034101742205200420042005491b22054100480d262003450d0420012802002003200510272204450d050c0c0b200141046a28020020052802002203470d01200341016a22052003490d2520034101742206200520052006491b22064100480d252003450d0520012802002003200610272205450d060c090b200128020021040c0b0b200128020021050c080b200128020021040c0b0b2005102622040d070b20054101102a000b2006102622050d030b20064101102a000b2005102622040d050b20054101102a000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41023a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d1f20054101742203200620062003491b22034100480d1f2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a29000037000020032004290001370000200041286a2001104102400240024002400240200141046a28020020062802002200470d00200041016a22032000490d1f20004101742205200320032005491b22054100480d1f2000450d0120012802002000200510272203450d020c030b200128020021030c030b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a200441216a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110412000410c6a28020020011039200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a28020020011039200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041106a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041306a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a280200210620022000410c6a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240024002400240024002400240200041086a28020022034102460d0020034101470d13200141046a280200200141086a2802002203470d01200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0320012802002003200510272204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110ec022002200041306a36020c2002410c6a200110662002200041c0006a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110ec022002200041306a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1520034101742205200420042005491b22054100480d152003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041046a280200210620022000410c6a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a000002400240024002400240024002400240024002400240200028020422034102460d0020034101470d0f200141046a280200200141086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0320012802002003200510272204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d1820034101742205200420042005491b22054100480d182003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a28020020011039200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41053a0000200041086a2d0000417f6a2203410c4b0d0202400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0d0008050602090a070c040b0103000b200628020020042802002203470d13200341016a22052003490d6020034101742207200520052007491b22074100480d602003450d2720012802002003200710272205450d280c4b0b200628020020042802002203470d0b200341016a22042003490d5f20034101742205200420042005491b22054100480d5f2003450d1820012802002003200510272204450d190c480b200628020020042802002203470d0b200341016a22042003490d5e20034101742205200420042005491b22054100480d5e2003450d1920012802002003200510272204450d1a0c450b200628020020042802002203470d0b200341016a22052003490d5d20034101742207200520052007491b22074100480d5d2003450d1a20012802002003200710272205450d1b0c420b200628020020042802002203470d0b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c2003450d1b20012802002003200510272204450d1c0c3f0b200628020020042802002203470d0b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b2003450d1c20012802002003200510272204450d1d0c3c0b200628020020042802002200470d0b200041016a22032000490d5a20004101742205200320032005491b22054100480d5a2000450d1d20012802002000200510272203450d1e0c390b200628020020042802002203470d0b200341016a22052003490d5920034101742207200520052007491b22074100480d592003450d1e20012802002003200710272205450d1f0c360b200628020020042802002203470d0c200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d2120012802002003200510272204450d220c330b200628020020042802002203470d0c200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d2220012802002003200510272204450d230c300b200628020020042802002200470d0c200041016a22032000490d5620004101742205200320032005491b22054100480d562000450d2320012802002000200510272203450d240c2d0b200628020020042802002200470d0c200041016a22032000490d5520004101742205200320032005491b22054100480d552000450d2420012802002000200510272203450d250c2a0b200628020020042802002203470d0c200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d2520012802002003200510272204450d260c270b200128020021040c3d0b200128020021040c3a0b200128020021050c370b200128020021040c340b200128020021040c310b200128020021030c2e0b200128020021050c2b0b200128020021050c380b200128020021040c270b200128020021040c240b200128020021030c210b200128020021030c1e0b200128020021040c1b0b2005102622040d2f0b20054101102a000b2005102622040d2b0b20054101102a000b2007102622050d270b20074101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622030d1b0b20054101102a000b2007102622050d170b20074101102a000b2007102622050d230b20074101102a000b2005102622040d110b20054101102a000b2005102622040d0d0b20054101102a000b2005102622030d090b20054101102a000b2005102622030d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110ec02200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410a3a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41063a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d14200041246c210003402003200110ec02200341246a21032000415c6a22000d000c150b0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41073a000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200628020020042802002200470d03200041016a22032000490d3220004101742205200320032005491b22054100480d322000450d0720012802002000200510272203450d080c0f0b200628020020042802002200470d01200041016a22032000490d3120004101742205200320032005491b22054100480d312000450d0420012802002000200510272203450d050c0c0b200628020020042802002200470d02200041016a22032000490d3020004101742205200320032005491b22054100480d302000450d0720012802002000200510272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102622030d070b20054101102a000b2005102622030d070b20054101102a000b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41033a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a20011041200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a220a200341016a360200200520036a410c3a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d0820004105742107200141046a210802400340024002400240024020062802002205200428020022006b41204f0d00200041206a22092000490d1f20054101742200200920092000491b22004100480d1f2005450d01200128020020052000102722050d020c050b200128020021050c020b200010262205450d030b2001200536020020082000360200200a28020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000c0a0b0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a200110412002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a20011041200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200520036a41003a00002000410c6a200110ec022002200041306a36020c2002410c6a2001106602400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200628020020042802002200470d03200041016a22032000490d2420004101742205200320032005491b22054100480d242000450d0720012802002000200510272203450d080c0f0b200628020020042802002200470d01200041016a22032000490d2320004101742205200320032005491b22054100480d232000450d0420012802002000200510272203450d050c0c0b200628020020042802002200470d02200041016a22032000490d2220004101742205200320032005491b22054100480d222000450d0720012802002000200510272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102622030d070b20054101102a000b2005102622030d070b20054101102a000b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a0000200041086a22032d0000417f6a220441054b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000402030105000b200141046a280200200141086a2802002203470d08200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d1120012802002003200510272204450d120c260b200141046a280200200141086a2802002200470d04200041016a22042000490d2220004101742205200420042005491b22054100480d222000450d0a20012802002000200510272204450d0b0c200b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0b20012802002003200510272204450d0c0c1d0b200141046a280200200141086a2802002204470d04200441016a22052004490d2020044101742206200520052006491b22064100480d202004450d0c20012802002004200610272205450d0d0c1a0b200141046a280200200141086a2802002203470d05200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0f20012802002003200510272204450d100c170b200141046a280200200141086a2802002204470d05200441016a22052004490d1e20044101742206200520052006491b22064100480d1e2004450d1020012802002004200610272205450d110c120b200128020021040c1c0b200128020021040c190b200128020021050c160b200128020021040c1e0b200128020021040c120b200128020021050c0d0b2005102622040d150b20054101102a000b2005102622040d110b20054101102a000b2006102622050d0d0b20064101102a000b2005102622040d140b20054101102a000b2005102622040d070b20054101102a000b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41053a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341216a220341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200041e0006a290300210b200041d8006a290300210c02400240024002400240200141046a2802002204200628020022036b41104f0d00200341106a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b200141086a2204200341106a360200200520036a2203200b3700082003200c370000200041cc006a28020021032002200041d4006a280200220036020c2002410c6a200110412000450d0020004105742106200141046a21070340024002400240024020072802002205200428020022006b41204f0d00200041206a22092000490d0f20054101742200200920092000491b22004100480d0f2005450d01200128020020052000102722050d020c060b200128020021050c020b200010262205450d040b2001200536020020072000360200200428020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000b0b200241106a24000f0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a20011098022000410c6a28020021062002200041146a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022006b20034f0d00200020036a22052000490d0b20044101742200200520052000491b22004100480d0b2004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200620031094041a200241106a24000f0b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41033a00002002200041386a36020c2002410c6a20011066200041c8006a200110980202400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0920054101742204200620062004491b22044100480d092005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a290000370000200420032900013700002000412c6a28020021052002200041346a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200628020022006b20034f0d00200020036a22062000490d0920044101742200200620062000491b22004100480d092004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200520031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a200110ec022002200041c0006a36020c2002410c6a20011066200041d0006a2001109802200041306a28020021062002200041386a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022006b20034f0d00200020036a22052000490d0720044101742200200520052000491b22004100480d072004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200620031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41043a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0520044101742200200520052000491b22004100480d052004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a2205200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000002400240024002400240024002400240024002400240200341216a2d00004101470d00200141046a28020020052802002200470d01200041016a22042000490d0b20004101742205200420042005491b22054100480d0b2000450d0320012802002000200510272204450d040c090b200141046a28020020052802002200470d01200041016a22032000490d0a20004101742204200320032004491b22044100480d0a2000450d0420012802002000200410272203450d050c060b200128020021040c080b200128020021030c050b2005102622040d050b20054101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41013a0000024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0320044101742200200520052000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220141186a200341226a220041186a290000370000200141106a200041106a290000370000200141086a200041086a29000037000020012000290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041106a200110b202200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000024002400240200141046a28020020052802002203470d00200341016a22042003490d0320034101742205200420042005491b22054100480d032003450d0120012802002003200510272204450d020c040b200128020021040c040b2005102622040d020b20054101102a000b101e000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109802200241106a24000b130020004110360204200041888ac0003602000b130020004109360204200041e2a2c0003602000b13002000410f360204200041eca2c0003602000b9e0101047f23004190016b220224002002410e360208200241003602880120024201370380010240410110262203450d002002200336028001200320024180016a41086a220428020022056a41003a0000200241013602840120002002290380013702002004200541016a2203360200200041086a200336020002402002280208410e460d00200241086a10240b20024190016a24000f0b41014101102a000bcb0101057f230041306b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030020024100360228200242013703200240412010262206450d0020062002290300370000200641086a2005290300370000200641106a2004290300370000200641186a2003290300370000200242a08080808004370224200220063602204100200241206a103f200041086a200241206a41086a28020036020020002002290320370200200241306a24000f0b41204101102a000ba50801027f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041ff0171417f6a220041044b0d000240024002400240024020000e050004020301000b200141046a280200200141086a2802002200470d08200041016a22022000490d1720004101742203200220022003491b22034100480d172000450d1120012802002000200310272202450d120c220b200141046a280200200141086a2802002200470d04200041016a22022000490d1620004101742203200220022003491b22034100480d162000450d0a20012802002000200310272202450d0b0c1f0b200141046a280200200141086a2802002200470d04200041016a22022000490d1520004101742203200220022003491b22034100480d152000450d0b20012802002000200310272202450d0c0c1c0b200141046a280200200141086a2802002200470d04200041016a22022000490d1420004101742203200220022003491b22034100480d142000450d0c20012802002000200310272202450d0d0c190b200141046a280200200141086a2802002200470d05200041016a22022000490d1320004101742203200220022003491b22034100480d132000450d0f20012802002000200310272202450d100c160b200141046a280200200141086a2802002200470d05200041016a22022000490d1220004101742203200220022003491b22034100480d122000450d1020012802002000200310272202450d110c130b200128020021020c1b0b200128020021020c180b200128020021020c150b200128020021020c1a0b200128020021020c110b200128020021020c0e0b2003102622020d140b20034101102a000b2003102622020d100b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d100b20034101102a000b2003102622020d060b20034101102a000b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41023a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41043a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41033a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41053a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41013a00000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a20021041200041086a200228020836020020002002290300370200200241106a24000b9d0701037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002202413f4b0d00200141046a280200200141086a2802002200470d01200041016a22032000490d1120004101742204200320032004491b22044100480d112000450d0520012802002000200410272203450d060c170b2002418080014f0d01200141046a2802002203200141086a28020022006b41024f0d02200041026a22042000490d1020034101742200200420042000491b22004100480d102003450d0820012802002003200010272203450d090c140b200128020021030c160b20024180808080044f0d01200141046a2802002203200141086a28020022006b41044f0d04200041046a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d08200128020020032000102722030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102722030d0a0c0e0b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2000102622030d0b0b20004101102a000b200010262203450d060b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b200410262203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200028020021030240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0420024101742200200420042000491b22004100480d042002450d01200128020020022000102722020d020c070b200128020021020c020b200010262202450d050b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b101e000b20004101102a000b20044101102a000b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000b8b0401047f230041e0006b2202240002400240410f10262203450d00200341076a41002900a78640370000200341002900a086403700002003410f412f10272203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412f200241c0006a1002200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041a886c500410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031023200241e0006a24000f0b41d4aac10041331021000b410f4101102a000b412f4101102a000bed2604077f017e017f017e230041f0036b22022400200241003a00940220024194026a200128020022032001280204220441004722051094041a024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d0094022204410f4b0d10024020040e10000b0709040c0e0a0f061003050d0208000b20024180036a20011044200228028003210420024194026a20024180036a41047241ec001094041a2004410e470d15200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b22033602002001200520046a22043602002006411f4d0d0f200241a8016a41186a220520024194026a41186a290000370300200241a8016a41106a220620024194026a41106a290000370300200241a8016a41086a220720024194026a41086a29000037030020022002290094023703a80120024180036a41186a2208200529030037030020024180036a41106a2205200629030037030020024180036a41086a22062007290300370300200220022903a8013703800320024188016a41186a200829030037030020024188016a41106a200529030037030020024188016a41086a2006290300370300200220022903800337038801200241003a00940220024194026a2004200341004722051094041a20032005490d29200141046a200320056b3602002001200420056a3602002003450d1d20022d009402220141064f0d1d200241e8006a41186a220420024188016a41186a290300370300200241e8006a41106a220520024188016a41106a290300370300200241e8006a41086a220320024188016a41086a29030037030020022002290388013703682000410f3a0000200041216a20013a000020002002290368370001200041096a2003290300370000200041116a2005290300370000200041196a2004290300370000200041226a2002280160360100200041266a200241e4006a2f01003b0100200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a3602002006411f4d0d0f200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024180036a41186a2203200129030037030020024180036a41106a2201200429030037030020024180036a41086a22042005290300370300200220022903a8013703800320024188016a41186a2205200329030037030020024188016a41106a2203200129030037030020024188016a41086a220120042903003703002002200229038003370388012000410c3a00002000200229038801370001200041096a2001290300370000200041116a2003290300370000200041196a2005290300370000200041216a2002280068360000200041246a200241eb006a280000360000200241f0036a24000f0b20024180036a20011044200228028003210420024194026a20024180036a41047241ec001094041a2004410e470d0f200041113a0000200241f0036a24000f0b2000410d3a0000200241f0036a24000f0b200241386a200110452002280238450d14200228023c2101200020022f0094023b00012000410a3a0000200041046a2001360200200041086a200229038003370300200041036a20024196026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241286a200110452002280228450d14200228022c2107200141046a22032802002104200241003a00940220024194026a20012802002206200441004722051094041a20042005490d222003200420056b3602002001200620056a36020002402004450d0020022d009402220141ff007122044106490d1c0b200041113a0000200241f0036a24000f0b200041103a0000200241f0036a24000f0b200241306a200110452002280230450d1320022802342107200141046a22032802002104200241003a00940220024194026a20012802002206200441004722051094041a20042005490d212003200420056b3602002001200620056a36020002402004450d0020022d009402220141ff007122044106490d1b0b200041113a0000200241f0036a24000f0b20024180036a20011044200228028003210120024194026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b200241206a200110452002280220450d1220022802242101200020022f0094023b0001200041023a0000200041046a2001360200200041086a200229038003370300200041036a20024194026a41026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241003602940220024194026a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d0a2002280294022101200041063a0000200041046a2001360200200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a3602002006411f4d0d0a200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024180036a41186a2203200129030037030020024180036a41106a2201200429030037030020024180036a41086a22042005290300370300200220022903a8013703800320024188016a41186a2205200329030037030020024188016a41106a2203200129030037030020024188016a41086a220120042903003703002002200229038003370388012000410e3a00002000200229038801370001200041096a2001290300370000200041116a2003290300370000200041196a2005290300370000200041216a2002280068360000200041246a200241eb006a280000360000200241f0036a24000f0b20024180036a20011044200228028003210120024194026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b4100210320024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a36020002402006411f4d0d00200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024188016a41186a200129030037030020024188016a41106a200429030037030020024188016a41086a2005290300370300200220022903a80137038801410121030b20024180036a41186a220120024188016a41186a29030037030020024180036a41106a220420024188016a41106a29030037030020024180036a41086a220520024188016a41086a2903003703002002200229038801370380032003450d0a200241e8006a41186a22032001290300370300200241e8006a41106a22012004290300370300200241e8006a41086a220420052903003703002002200229038003370368200041093a000020002002290368370001200041096a2004290300370000200041116a2001290300370000200041196a2003290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b200241d0006a200110462002290350a7450d0e20022903582109200241c8006a200110452002280248450d11200228024c2104200241c0006a200110452002280240450d1520022802442101200020022f0094023b00012000410b3a0000200041106a2009370300200041086a2001360200200041046a2004360200200041186a200229038003370300200041036a20024196026a2d00003a0000200041206a20024180036a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262205450d1820052004360200200541046a200241a8016a41ec001094041a200141046a22072802002104200241003a00940220024194026a20012802002208200441004722031094041a20042003490d192007200420036b22063602002001200820036a22033602002004450d0c20022d009402220841034f0d0c200242003703800320024180036a20032006410820064108491b22041094041a200141046a220a200620046b22073602002001200320046a2204360200200641074d0d122002290380032109200242003703800320024180036a20042007410820074108491b22031094041a200a200720036b3602002001200420036a360200200741074d0d13200041106a200229038003370300200041086a2009370300200041046a2005360200200020083a0001200041053a0000200041186a200229038801370300200041206a20024188016a41086a290300370300200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262204450d1920042001360200200441046a200241a8016a41ec001094041a200041083a0000200041046a2004360200200020022f00683b0001200041036a200241ea006a2d00003a0000200041086a200229038801370300200041106a20024188016a41086a290300370300200041186a20024188016a41106a290300370300200041206a20024188016a41186a290300370300200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262205450d1920052004360200200541046a200241a8016a41ec001094041a200241086a200110472002290308a7450d0e200241086a41106a29030021092002290310210b200020022f00683b0001200041013a0000200041086a200b370300200041046a2005360200200041186a200229038801370300200041106a2009370300200041036a200241ea006a2d00003a0000200041206a20024188016a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262204450d1720042001360200200441046a200241a8016a41ec001094041a200041073a0000200041046a2004360200200020022f00683b0001200041036a200241ea006a2d00003a0000200041086a200229038801370300200041106a20024188016a41086a290300370300200041186a20024188016a41106a290300370300200041206a20024188016a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c100b200041113a0000200241f0036a24000f0b200041033a0000200041046a2007360200200041026a20043a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041043a0000200041046a2007360200200041026a20043a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041113a00002005102420051023200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c0a0b200041113a00000c090b200520041048000b200520041048000b200520041048000b200520031048000b41f0004108102a000b200320041048000b41f0004108102a000b41f0004108102a000b41f0004108102a000b2005102420051023200241f0036a24000bc35c05067f057e047f027e087f230041d0086b22022400200241003a00f006200241f0066a200128020022032001280204220441004722051094041a0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d00f0062204410d4b0d0e024020040e0e00090607030a0c080e050d02040b000b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6a200141046a200620046b22033602002001200520046a22043602002006450d6620022d00ff05220541044b0d66024020050e050025232422000b200241086a200110452002280208450d66200228020c2204417f4c0d682004450d4f200410ac012206450d870120062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d88012003200720056b3602002001200128020020056a36020020052004470d500c9a010b2000410e360200200241d0086a24000f0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d69200141046a200620046b3602002001200520046a3602002006450d1e20022d00ff05220441044b0d1e024020040e05001d1b1c1a000b200241d0036a2001104720022903d003a7450d1e200241e0036a290300210820022903d8032109200241f0066a200110950220022d00f00622044102460d1e2002418c076a290200210a20024184076a290200210b20022f00f106210120022d00f306210520022902f406210c2002200241fc066a290200370388062002200c370380062002200b3703900620012005411074722101410121050c1d0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d69200141046a200620046b22033602002001200520046a22043602002006450d5520022d00ff050d55200241f0066a2003412020034120491b22056a41004100412020056b2005411f4b1b1093041a200241f0066a200420051094041a200141046a2207200320056b22063602002001200420056a22053602002003411f4d0d5520024188076a22032903002109200229038007210a20022903f0062108200220022903f806370388062002200837038006200241f0066a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a200241f0066a200520041094041a2007200620046b3602002001200520046a3602002006411f4d0d552003290300210820024180076a290300210b200241f0066a41086a290300210c20022802f406210320022802f0062107200241d0046a41086a20024180066a41086a29030037030020022002290380063703d00420024198016a20011045200228029801450d55200228029c012204417f4c0d652004450d53200410ac012206450d880120062001280200200141046a220d2802002205200420052004491b22051094041a200d280200220e2005490d8901200d200e20056b3602002001200128020020056a36020020052004470d540c95010b200241e0076a200110c30220022d00e0072101200241f0066a200241e0076a41017241e7001094041a20014107470d0b2000410e360200200241d0086a24000f0b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d920120022d00f006450d0c0c92010b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002000410e360200200241d0086a24000f0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d0f20022d00ff0522044101460d0d20040d0f200241e0076a200110950220022d00e00722044102460d0f20022d00e307210320022f00e1072107200241ec076a2902002108200241fc076a2902002109200241f8076a2802002105200241f4076a280200210620022902e407210a200241d0006a200110472002280250450d0f20072003411074722101200241d0006a41106a290300210b410121032002290358210c0c0e0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d3120022d00ff05220441094b0d31024020040e0a00252223202829242b21000b200241f0066a200110a50220022802f0062204450d3120022902f4062108200241a8026a200110452008a7210520022802a802450d3020022802ac022103200241003602f006200241f0066a2001280200220d200141046a220e2802002206410420064104491b22071094041a200e200620076b3602002001200d20076a360200200641034d0d30200842208821082005410876210e2004410876210f20022802f0062110410121010c250b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d8d0120022d00f006450d090c8d010b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6841042103200141046a200620046b220f3602002001200520046a22103602002006450d850120022d00ff05220d410c4b0d85010240200d0e0d0036388901323a3b393c343d3133000b200241f0066a200110950220022d00f00622044102460d850120022d00f306210f20022f00f1062110200241fc066a290200210a2002418c076a290200210920024188076a280200210720024184076a280200210520022902f4062108200241a0016a2001104720022903a001a7450d8501200241a0016a41106a290300210c20022903a801210b200141046a220d2802002106200241003a00ff05200241ff056a2001280200220e200641004722031094041a20062003490d8301200d200620036b3602002001200e20036a3602002006450d850120022d00ff05220641034f0d85012010200f41107472210e410121030c88010b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d0d20022d00f00622044101460d0c20040d0d200241e0076a2001104420022802e0072104200241f0066a200241e0076a41047241ec001094041a2004410e460d0d20024180066a200241f0066a41ec001094041a41f00010262201450d7520012004360200200141046a20024180066a41ec001094041a200241b8056a41186a200241d8056a41186a290200370300200241b8056a41106a200241d8056a41106a290200370300200241b8056a41086a200241d8056a41086a290200370300200220022902d8053703b80520014108762105410121040c1b0b200241f0066a20011043200220022f01f2063b018006200220024192076a2f01003b01d80520022d00f00622014111470d042000410e360200200241d0086a24000f0b200241003a00f006200241f0066a2005200641004722041094041a20062004490d67200141046a200620046b3602002001200520046a3602002006450d880120022d00f006450d060c88010b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6741042103200141046a200620046b22073602002001200520046a22053602002006450d4620022d00ff0522044102460d0c20044101460d0b20040d46200241e0076a200110444104210320022802e0072101200241f0066a200241e0076a41047241ec001094041a2001410e460d4620024180066a200241f0066a41ec001094041a41f00010262204450d7520042001360200200441046a20024180066a41ec001094041a200220022f01b8053b019805200220022f01d8053b01ce04410121030c470b2000410e360200200241d0086a24000f0b20024180066a200241f0066a41e7001094041a200041086a20013a00002000410c360200200041096a20024180066a41e7001094041a200241d0086a24000f0b200241f0066a41196a2900002108200241f0066a41116a2900002109200241f0066a41216a2d00002104200241f0066a41106a2d00002105200241f0066a410c6a2802002106200241f0066a41086a280200210320022802f406210720022d00f106210d200220022f0180063b01d004200220022f01d8053b01b80520024194076a280200210e200041216a2008370000200041196a20093700002000200d3a0009200041086a20013a000020004106360200200020043a0029200041186a20053a0000200041146a2006360200200041106a20033602002000410c6a20073602002000412c6a200e360200200020022f01d0043b000a200020022f01b8053b012a200041306a20022903e007370300200041386a200241e0076a41086a290300370300200041c0006a200241e0076a41106a290300370300200041c8006a200241e0076a41186a290300370300200041d0006a20024180086a290300370300200041d8006a20024188086a290300370300200041e0006a200241e0076a41306a290300370300200041e8006a200241e0076a41386a290300370300200241d0086a24000f0b200241b8036a2001104620022903b803a7450d850120022903c003210820004109360200200041086a2008370300200041106a200241e0076a41e0001094041a200241d0086a24000f0b200241c0006a200110462002290340a7450d83012002290348210820004101360200200041086a2008370300200041106a200241e0076a41e0001094041a200241d0086a24000f0b200241c8036a2001104520022802c803450d810120022802cc032204417f4c0d542004450d22200410ac012206450d6d20062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d6e2003200720056b3602002001200128020020056a36020020052004470d230c80010b200241e0076a200110950220022d00e00722044102460d0120022d00e307210320022f00e1072107200241ec076a2902002108200241fc076a2902002109200241f8076a2802002105200241f4076a280200210620022902e407210a20024180016a20011047200229038001a7450d0120024180016a41106a290300210b200229038801210c200241e8006a200110472002290368a7450d0120072003411074722101200241f8006a290300211120022903702112410221030b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2011370200200041c0006a2012370200200041386a200b370200200041306a200c370200200041186a2008370000200041106a200a370000200041286a2009370000200041246a2005360000200041206a20063600002000410c6a20043a0000200041086a2003360200200041d0006a20022903f006370300200041d8006a200241f0066a41086a290300370300200041e0006a200241f0066a41106a290300370300200041e8006a200241f0066a41186a290300370300200241d0086a24000f0b2000410e360200200241d0086a24000f0b200241e0076a2001109502200241f0066a41086a2206200241ec076a290200370300200241f0066a41106a2203200241f4076a290200370300200241f0066a41186a2207200241fc076a290200370300200220022902e4073703f0064102210420022d00e00722014102470d0d0b2000410e360200200241d0086a24000f0b200241a8036a2001104520022802a803450d3a20022802ac032104200241e0076a200110444104210320022802e0072105200241f0066a200241e0076a41047241ec001094041a2005410e460d3a20024180066a200241f0066a41ec001094041a41f00010262201450d6a20012005360200200141046a20024180066a41ec001094041a200220022f01b8053b019805200220022f01ea053b01ce04410221030c3b0b200241f0066a2007412020074120491b22046a41004100412020046b2004411f4b1b1093041a200241f0066a200520041094041a41042103200141046a200720046b3602002001200520046a3602002007411f4d0d3920024188076a2902002109200229028007210820022902f806210a20022802f406210720022802f0062105200241b0036a2001104520022802b003450d3920022802b4032106200141046a220d2802002104200241003a00e007200241e0076a2001280200220e200441004722031094041a20042003490d6a200d200420036b3602002001200e20036a3602002004450d3820022d00e007210e20022005360280062002200736028406200220022f0081063b0198052002200a37038806200a423888a7210d200a421888a7210720022800870621012002280083062104410321030c3a0b200241c0046a2001104520022802c004450d0420022802c40422044108762101410521054200210a0c030b200241b0046a2001104520022802b004450d0320022802b404210420024198046a20011047200229039804a7450d03200241a8046a290300210820022903a004210920024188046a20011046200229038804a7450d03200229039004210a20024180046a20011045200228028004450d03200228028404210120024190066a20083703002002200937038806200220013602800620044108762101410321050c020b200241b8046a2001104520022802b804450d0220022802bc0422044108762101410421054200210a0c010b200241e8036a2001104720022903e803a7450d01200241f8036a2903002108200220022903f003370380062002200837038806410221050b200241f0066a41106a20024180066a41106a290300220b370300200241f0066a41086a20024180066a41086a290300220c370300200241d0046a41086a2206200c370300200241d0046a41106a2203200b3703002002200229038006220b3703d0042002200b3703f006200041386a2008370200200041306a20093702002000410c6a2001410874200441ff017172360200200041086a20053602002000410b360200200041286a200a370200200041106a20022903d004370200200041186a2006290300370200200041206a2003290300370200200041c0006a20022903e007370300200041c8006a200241e0076a41086a290300370300200041d0006a200241e0076a41106a290300370300200041d8006a200241e0076a41186a290300370300200041e0006a200241e0076a41206a290300370300200041e8006a200241e0076a41286a290300370300200241d0086a24000f0b200241f0066a41106a20024180066a41106a290300370300200241f0066a41086a20024180066a41086a29030037030020022002290380063703f0062000410e360200200241d0086a24000f0b200241386a200110452002280238450d44200228023c2213ad420c7e2208422088a70d462008a72204417f4c0d462004450d272004102622060d2820044104102a000b200241106a200110452002280210450d4320022802142204417f4c0d452004450d28200410ac012206450d6620062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d672003200720056b3602002001200128020020056a36020020052004470d290c700b200241286a200110452002280228450d42200228022c2214ad42187e2208422088a70d442008a72204417f4c0d442004450d2d2004102622060d2e20044104102a000b200242003703f006200241f0066a20042003410820034108491b22051094041a200141046a200320056b3602002001200420056a360200200341074d0d4120022903f0062108410221010c760b20022f00e10720022d00e307411074722105200241b8056a41186a2007290300370300200241b8056a41106a2003290300370300200241b8056a41086a2006290300370300200220022903f0063703b8050b20024198056a41186a2206200241b8056a41186a29030037030020024198056a41106a2203200241b8056a41106a29030037030020024198056a41086a2207200241b8056a41086a290300370300200220022903b80537039805200041086a2005410874200141ff017172360200200020043602042000410d3602002000410c6a200229039805370200200041146a20072903003702002000411c6a2003290300370200200041246a20062903003702002000412c6a200241d0046a41c4001094041a200241d0086a24000f0b200241d8026a2001104520022802d802450d1120022802dc022204410876210f410521010c090b20024198036a20011046200229039803a7450d1020022903a003220942208821082009a72205410876210e410a21010c0a0b200241c8026a2001104520022802c802450d0f20022802cc022104200241f0066a200110950220022d00f00622054102460d0f20022d00f306210320022f00f1062107200241fc066a290200210b2002418c076a290200210920024188076a280200210f20024184076a280200210620022902f4062108200241c0026a2001104520022802c002450d0f20022802c402210d200241b8026a2001104520022802b802450d0f2007200341107472210e20022802bc0221012002200f360280062004410876210f2008422088a7210320022009370284062009422088a72113200b422088a7210720022903800621092001ad210a200ba721104200210b410321010c0b0b200241d0026a2001104520022802d002450d0e20022802d4022204410876210f410421010c060b200241f0066a200110950220022d00f00622044102460d0d20022902f40622094220882108410821012009a72205410876210e20022f00f10620022d00f30641107472210f200241fc066a290200220a422088a7211020024184076a280200210720024188076a28020021062002418c076a2902002109200aa721030c020b200241f0066a200110a50220022802f0062204450d0c20022902f4062108200241b0026a200110452008a7210520022802b002450d0b20022802b4022103200241003602f006200241f0066a2001280200220d200141046a220e2802002206410420064104491b22071094041a200e200620076b3602002001200d20076a360200200641034d0d0b200842208821082005410876210e2004410876210f20022802f0062110410221010b0b0c060b200241f0066a200110950220022d00f00622044102460d0920022d00f306210520022f00f1062103200241fc066a290200210c2002418c076a290200210920024188076a280200210620024184076a280200210720022902f4062112200241e8026a2001104720022903e802a7450d09200241e8026a41106a290300210b20022903f002210a200241e0026a2001104520022802e002450d092003200541107472210f20022802e4022113201242208821082012a72205410876210e200c422088a72110200ca72103410621010c050b20024180036a20011045200228028003450d082002280284032204410876210f410721010b420021084100210e0c020b20024188036a20011046200229038803a7450d06200229039003220942208821082009a72205410876210e410921010b0b0b20004107360200200041c0006a200b370200200041386a200a370200200041346a200d360200200041306a2013360200200041286a2009370200200041246a2006360200200041206a20073602002000411c6a2010360200200041186a2003360200200041086a2001360200200041c8006a20022903e0073703002000410c6a200f410874200441ff017172360200200041d0006a200241e0076a41086a290300370300200041d8006a200241e0076a41106a290300370300200041e0006a200241e0076a41186a290300370300200041e8006a200241e0076a41206a290300370300200041106a2008422086200ead42ffffff07834208862005ad42ff01838484370200200241d0086a24000f0b4101210641002004460d5d0b2004450d5d200610230c5d0b2005450d00200410230b2000410e360200200241d0086a24000f0b20024198026a20011045200228029802450d54200228029c022104200220022f01b8053b01d0042004410876210e410c21030c030b20024180026a20011045200228028002450d532002280284022105200241e8016a2001104720022903e801a7450d53200241f8016a290300210a20022903f0012108200220022f01f0063b01d004410521034100210e0c040b200241a0026a2001104520022802a002450d5220022802a4022215ad2208421b88a70d2b2008420586a72205417f4c0d2b2005450d1e2005102622040d1f20054101102a000b20024190026a20011045200228029002450d512002280294022104200220022f01f0063b01d0042004410876210e410a21030b4200210a0c090b200241b8016a2001104720022903b801a7450d4f200241c8016a290300210a20022903c0012108200220022f01f0063b01d004200228028006210520022802840621072002290388062109410221034100210e0b0c500b200241d0016a2001104720022903d001a7450d4d200241e0016a290300210a20022903d8012108200220022f01f0063b01d004410321034100210e0c4e0b200241003a00ff05200241ff056a2010200f41004722041094041a200f2004490d43200141046a200f20046b3602002001201020046a360200200f450d4c20022d00ff05220641034f0d4c200220022f01f0063b01d004410821034200210a4100210e0c4f0b20024188026a20011045200228028802450d4b200228028c022214ad42247e2208422088a70d242008a72205417f4c0d242005450d192005102622040d1a20054104102a000b410721030c020b200241f0066a200110950220022d00f00622044102460d49200241fc066a290200210a20022902f406210820024184076a280200210520024188076a28020021072002418c076a290200210920022f00f106210120022d00f3062106200220022f0180063b01d0042001200641107472210e410921030c4b0b410b21030b0b0c470b410421060b2013450d02420021084100210d4100210541002107201321100340200241306a200110452002280230450d1020022802342204417f4c0d1e024002402004450d00200410ac01220e450d2e200e2001280200200141046a220f2802002203200420032004491b22031094041a200f28020022162003490d2f200f201620036b3602002001200128020020036a36020020032004460d010c110b4101210e41002004470d100b200741016a2103024020072010470d00200d20032003200d491b2210ad420c7e2209422088a70d202009a7220f4100480d2002402007450d0020062005200f102722060d010c300b200f10262206450d2f0b200620056a2207200e360200200741046a2004ad220942208620098437020020084280808080107c2108200d41026a210d2005410c6a21052003210720032013490d000c040b0b4101210641002004460d470b20040d180c190b41002110420021080b2006450d1720082010ad842108410521010c4c0b4101210641002004460d4a0b20040d140c150b410421060b024002402014450d00420021084100210e4100210441002107201421130340200241206a200110452002280220450d1420022802242203417f4c0d18024002402003450d00200310ac01220f450d30200f2001280200200141046a220d2802002205200320052003491b22051094041a200d28020022102005490d31200d201020056b3602002001200128020020056a36020020052003460d010c150b4101210f41002003470d140b200241186a200110452002280218450d13200228021c2205417f4c0d18024002402005450d00200510ac012210450d2e20102001280200200141046a2216280200220d2005200d2005491b220d1094041a20162802002217200d490d2f20162017200d6b36020020012001280200200d6a360200200d2005460d010c140b4101211041002005470d130b200741016a210d024020072013470d00200e200d200d200e491b2213ad42187e2209422088a70d1a2009a722164100480d1a02402007450d00200620042016102722060d010c2b0b201610262206450d2a0b200620046a2207200f360200200741146a2005360200200741106a20053602002007410c6a2010360200200741046a2003ad220942208620098437020020084280808080107c2108200e41026a210e200441186a2104200d2107200d2014490d000c020b0b41002113420021080b2006450d1320082013ad842108410421010c480b410421030b0b200220022f0198053b018006200220022f01ce043b01d805024020034104470d002000410e360200200241d0086a24000f0b200220022f0180063b01cc04200220022f01d8053b01ca042000411d6a2009370000200041156a2008370000200020053a0005200020033a0004200041083602002000200e3a0025200041146a200d3a0000200041106a20073602002000410c6a2001360200200041086a2004360200200041286a2006360200200020022f01cc043b0006200020022f01ca043b01262000412c6a200241d0046a41c4001094041a200241d0086a24000f0b4101210641002004460d410b2004450d00200610230b200241f0066a41086a200241d8056a41086a290300370300200220022903d8053703f0060c400b2004450d00200e10230b02402007450d002006210103400240200141046a280200450d00200128020010230b2001410c6a2101200541746a22050d000b0b20100d0a0c0b0b410121040b024002402015450d00200241f0066a41186a210f200241f0066a41106a2110200241f0066a41086a2113200141046a210e420021084100210d4100210741002103201521170340200f42003703002010420037030020134200370300200242003703f006200241f0066a20012802002216200e2802002205412020054120491b22061094041a200e200520066b3602002001201620066a3602002005411f4d0d06200341016a2106200f29030021092010290300210a2013290300210b20022802f406211620022802f0062114024020032017470d00200d20062006200d491b2217ad420586220c422088a70d10200ca722054100480d1002402003450d00200420072005102722040d010c220b200510262204450d210b200420076a22052014360000200541186a2009370000200541106a200a370000200541086a200b370000200541046a201636000020084280808080107c2108200d41026a210d200741206a21072006210320062015490d000c020b0b41002117420021080b2004450d3220082017ad842108200220022f01b8053b01d0042004410876210e410d21030c020b410421040b024002402014450d0042002108200241f0066a410c6a2117200241f0066a411c6a2115200241f0066a41186a2118200241f0066a41146a2119410021074100210341002105201421160340200241f0066a200110950220022d00f006220d4102460d05200541016a210620022d00f306210e20022f00f106210f201729020021092015290200210a201828020021102019280200211320022902f406210b024020052016470d002007200620062007491b2216ad42247e220c422088a70d0e200ca7221a4100480d0e02402005450d0020042003201a102722040d010c210b201a10262204450d200b200420036a2205200d3a0000200541036a200f200e41107472220d4110763a0000200541016a200d3b00002005410c6a2009370000200541046a200b3700002005411c6a200a370000200541186a2010360000200541146a201336000020084280808080107c2108200741026a2107200341246a21032006210520062014490d000c020b0b41002116420021080b2004450d3020082016ad842108200220022f0180063b01d0042004410876210e410621030b0c300b2017450d2e0c2d0b20160d2c0c2d0b2005450d00201010230b2003450d00200f10230b02402007450d002006210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200441686a22040d000b0b2013450d010b200610230b2000410e360200200241d0086a24000f0b200520041048000b101d000b101e000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b20044101102a000b200320161048000b200f4104102a000b20164104102a000b20054101102a000b201a4104102a000b20054101102a000b200d20171048000b20034101102a000b200520101048000b41f0004108102a000b20044101102a000b200520071048000b41f0004108102a000b41f0004108102a000b200320041048000b2004200f1048000b20044101102a000b200520071048000b20044101102a000b200520071048000b20044101102a000b2005200e1048000b200320061048000b200410230b200220022f01d0043b01f0062000410e360200200241d0086a24000f0b0b0b200220022f01d00422013b01f006200220013b019805200041386a200c370000200041306a200b370000200041186a200a370000200041106a2008370000200020063a0009200041086a20033a000020004105360200200041286a2009370000200041246a2007360000200041206a20053600002000410c6a200e410874200441ff017172360000200020022f0198053b000a200041c0006a20022903e007370300200041c8006a200241e0076a41086a290300370300200041d0006a200241e0076a41106a290300370300200041d8006a200241e0076a41186a290300370300200041e0006a200241e0076a41206a290300370300200041e8006a200241e0076a41286a290300370300200241d0086a24000f0b2004ad22084220862008842108410321010c070b200020063602042000410a360200200041086a2004ad2208422086200884370200200041106a200241e0076a41e0001094041a200241d0086a24000f0b2000410e360200200241d0086a24000f0b2000410e360200200241d0086a24000f0b2000410e360200200241d0086a24000f0b200241d8056a41086a2201200241d0046a41086a290300370300200220022903d0043703d805200241f0066a41086a22052001290300370300200220022903d8053703f0062006450d00200241b8056a41086a22012005290300370300200220022903f0063703b805200041c8006a2008370200200041c0006a200b370200200041286a2009370200200041206a200a370200200041086a2004ad22084220862008843702002000200636020420004104360200200041386a200c370200200041346a2003360200200041306a2007360200200041106a20022903b805370200200041186a2001290300370200200041d0006a20022903e007370300200041d8006a200241e0076a41086a290300370300200041e0006a200241e0076a41106a290300370300200041e8006a200241e0076a41186a290300370300200241d0086a24000f0b2000410e360200200241d0086a24000f0b2004ad22084220862008842108410121010b20004100360200200041106a20083702002000410c6a2006360200200041086a2001360200200041186a200241e0076a41d8001094041a200241d0086a24000bdd0301077f230041106b22022400200241003a0003200241036a200128020022032001280204220441004722051094041a02400240024020042005490d00200141046a200420056b22063602002001200320056a22033602000240024002402004450d000240024020022d0003220741037122044102460d00024020044101460d0020040d0220074102762105410121040c080b200241003a000f2002410f6a2003200641004722041094041a20062004490d06200141046a200620046b3602002001200320046a3602002006450d0420022d000f4108742007724102762105410121040c070b41002105200241003a000a200241003b0108200241086a200320064103200641034922081b22041094041a200141046a200620046b3602002001200320046a3602004100210420080d0620022f010820022d000a411074724108742007724102762105410121040c060b200741034b0d004100210420024100360204200241046a20032006410420064104491b22051094041a200141046a200620056b3602002001200320056a360200200641034d0d0120022802042105410121040c050b410021040b0c030b41002105410021040c020b200520041048000b200420061048000b2000200536020420002004360200200241106a24000bcb0503057f037e047f230041106b22022400200241003a0000200220012802002203200128020422044100472205109404210202400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d0020022d00002204ad210702400240024002400240200441037122034102460d00024020034101460d0020030d022004410276ad2108420121090c080b200241003a00002002200520064100472204109404210320062004490d0a200141046a200620046b3602002001200520046a3602002006450d0220033100004208862007844202882108420121090c070b200241003a000e200241003b010c2002410c6a200520064103200641034922031b22041094041a200141046a200620046b3602002001200520046a360200420021084200210920030d06200233010c200231000e421086844208862007844202882108420121090c060b200441027622044104460d0120040d0220024100360200200220052006410420064104491b22041094042103200141046a200620046b3602002001200520046a360200200641034d0d0020033502002108420121090c050b42002108420021090c040b4200210920024200370300200220052006410820064108491b22041094042103200141046a200620046b3602002001200520046a360200200641074d0d0220032903002108420121090c030b200441046a220a41084b0d0042002108200141046a210b410021030340200241003a00002002200520064100472204109404210c20062004490d05200b200620046b220d3602002001200520046a22053602002006450d01200c3100002003410374413871ad86200884210842012109200d2106200341016a22042103200441ff0171200a490d000c030b0b420021090b0b2000200837030820002009370300200241106a24000f0b200520041048000b200420061048000b200420061048000be90605057f017e017f027e037f230041306b22022400200241003a0018200241186a200128020022032001280204220441004722051094041a02400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d0002400240024002400240024020022d0018220341037122044102460d00024020044101460d0020040d022003410276ad21070c0d0b200241003a0018200241186a2005200641004722041094041a20062004490d0a200141046a200620046b3602002001200520046a3602002006450d0220022d001841087420037241fcff0371410276ad21070c0c0b200241003a002e200241003b012c2002412c6a200520064103200641034922081b22041094041a200141046a200620046b3602002001200520046a36020020080d0120022f012c20022d002e41107472410874200372410276ad21070c0b0b20034102762204410c460d0220044104460d0120040d0320024100360218200241186a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d00200235021821070c0a0b420021070c080b4200210720024200370318200241186a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d07200229031821070c080b4200210a2002420037032020024200370318200241186a20052006411020064110491b22041094041a200141046a200620046b3602002001200520046a3602002006410f4d0d02200241206a2903002109200229031821074201210a0c080b200441046a220b41104b0d00200141046a210c200241106a210d4200210742002109410021030340200241003a0018200241186a2005200641004722041094041a20062004490d04200c200620046b22083602002001200520046a22053602002006450d01200241086a20023100184200200341037441f80071109904200d2903002009842109200229030820078421074201210a20082106200341016a22042103200441ff0171200b490d000c080b0b4200210a0b0c050b200520041048000b200420061048000b200420061048000b420021094200210a0c010b420021094201210a0b200020073703082000200a370300200041106a2009370300200241306a24000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c2002419489c5003602082002200241046a360228200220023602202002200241206a360218200241086a41a489c5001061000b832702087f027e230041f0036b22022400200241003a0090022001280200200128020420024190026a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d0090022203410f4b0d10024020030e10000b0709040c0e0a0f061003050d0208000b20024180036a2001102f200228028003210320024190026a20024180036a41047241ec001094041a2003410e470d15200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a220828020020024190026a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d0f200241a0016a41186a22042005290300370300200241a0016a41106a22052006290300370300200241a0016a41086a2206200729030037030020022002290390023703a00120024180036a41186a2207200429030037030020024180036a41106a2204200529030037030020024180036a41086a22052006290300370300200220022903a0013703800320024180016a41186a200729030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903800337038001200241003a0090022001280200200828020020024190026a410120091001210120032003280200200141016a41014b22016a3602002001450d1820022d009002220141064f0d18200241e0006a41186a220320024180016a41186a290300370300200241e0006a41106a220420024180016a41106a290300370300200241e0006a41086a220520024180016a41086a29030037030020022002290380013703602000410f3a0000200041216a20013a000020002002290360370001200041096a2005290300370000200041116a2004290300370000200041196a2003290300370000200041226a2002280158360100200041266a200241dc006a2f01003b0100200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0f200241a0016a41186a22012005290300370300200241a0016a41106a22032006290300370300200241a0016a41086a2204200729030037030020022002290390023703a00120024180036a41186a2205200129030037030020024180036a41106a2201200329030037030020024180036a41086a22032004290300370300200220022903a0013703800320024180016a41186a2204200529030037030020024180016a41106a2205200129030037030020024180016a41086a220120032903003703002002200229038003370380012000410c3a00002000200229038001370001200041096a2001290300370000200041116a2005290300370000200041196a2004290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b20024180036a2001102f200228028003210320024190026a20024180036a41047241ec001094041a2003410e470d0f200041113a0000200241f0036a24000f0b2000410d3a0000200241f0036a24000f0b200241306a2001104a2002280230450d1520022802342101200020022f0090023b00012000410a3a0000200041046a2001360200200041086a200229038003370300200041036a20024192026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241206a2001104a2002280220450d1620022802242104200241003a0090022001280200200141046a28020020024190026a4101200141086a22012802001001210320012001280200200341016a41014b22036a36020002402003450d0020022d009002220141ff007122034106490d1d0b200041113a0000200241f0036a24000f0b200041103a0000200241f0036a24000f0b200241286a2001104a2002280228450d15200228022c2104200241003a0090022001280200200141046a28020020024190026a4101200141086a22012802001001210320012001280200200341016a41014b22036a36020002402003450d0020022d009002220141ff007122034106490d1c0b200041113a0000200241f0036a24000f0b20024180036a2001102f200228028003210120024190026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b200241186a2001104a2002280218450d14200228021c2101200020022f0090023b0001200041023a0000200041046a2001360200200041086a200229038003370300200041036a20024190026a41026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200141046a28020021032002410036029002200141086a220541002001280200200320024190026a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d0a2002280290022101200041063a0000200041046a2001360200200020022f00a0013b0001200041036a200241a2016a2d00003a0000200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0a200241a0016a41186a22012005290300370300200241a0016a41106a22032006290300370300200241a0016a41086a2204200729030037030020022002290390023703a00120024180036a41186a2205200129030037030020024180036a41106a2201200329030037030020024180036a41086a22032004290300370300200220022903a0013703800320024180016a41186a2204200529030037030020024180016a41106a2205200129030037030020024180016a41086a220120032903003703002002200229038003370380012000410e3a00002000200229038001370001200041096a2001290300370000200041116a2005290300370000200041196a2004290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b20024180036a2001102f200228028003210120024190026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b20024190026a41186a2206420037030020024190026a41106a2207420037030020024190026a41086a22084200370300200242003703900241002103200141086a220541002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20052802006a36020002402001411f4d0d00200241a0016a41186a22012006290300370300200241a0016a41106a22032007290300370300200241a0016a41086a2204200829030037030020022002290390023703a00120024180016a41186a200129030037030020024180016a41106a200329030037030020024180016a41086a2004290300370300200220022903a00137038001410121030b20024180036a41186a220120024180016a41186a29030037030020024180036a41106a220420024180016a41106a29030037030020024180036a41086a220520024180016a41086a2903003703002002200229038001370380032003450d0a200241e0006a41186a22032001290300370300200241e0006a41106a22012004290300370300200241e0006a41086a220420052903003703002002200229038003370360200041093a000020002002290360370001200041096a2004290300370000200041116a2001290300370000200041196a2003290300370000200041216a2002280058360000200041246a200241db006a280000360000200241f0036a24000f0b200241c8006a2001104b2002290348a7450d102002290350210a200241c0006a2001104a2002280240450d1120022802442103200241386a2001104a2002280238450d15200228023c2101200020022f0090023b00012000410b3a0000200041106a200a370300200041086a2001360200200041046a2003360200200041186a200229038003370300200041036a20024192026a2d00003a0000200041206a20024180036a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262204450d1420042003360200200441046a200241a0016a41ec001094041a200241003a0090022001280200200141046a28020020024190026a4101200141086a22032802001001210520032003280200200541016a41014b22056a22063602002005450d0820022d009002220741034f0d082002420037038003200141086a220341002001280200200141046a220828020020024180036a41082006100122052005417f461b2205410820054108491b20032802006a2206360200200541074d0d12200229038003210a2002420037038003200341002001280200200828020020024180036a41082006100122012001417f461b2201410820014108491b20032802006a360200200141074d0d13200041106a200229038003370300200041086a200a370300200041046a2004360200200020073a0001200041053a0000200041186a200229038001370300200041206a20024180016a41086a290300370300200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262203450d1420032001360200200341046a200241a0016a41ec001094041a200041083a0000200041046a2003360200200020022f00603b0001200041036a200241e2006a2d00003a0000200041086a200229038001370300200041106a20024180016a41086a290300370300200041186a20024180016a41106a290300370300200041206a20024180016a41186a290300370300200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262204450d1420042003360200200441046a200241a0016a41ec001094041a20022001104c2002290300a7450d0c200241106a290300210a2002290308210b200020022f00603b0001200041013a0000200041086a200b370300200041046a2004360200200041186a200229038001370300200041106a200a370300200041036a200241e2006a2d00003a0000200041206a20024180016a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262203450d1220032001360200200341046a200241a0016a41ec001094041a200041073a0000200041046a2003360200200020022f00603b0001200041036a200241e2006a2d00003a0000200041086a200229038001370300200041106a20024180016a41086a290300370300200041186a20024180016a41106a290300370300200041206a20024180016a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c0f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00002004102420041023200241f0036a24000f0b200041033a0000200041046a2004360200200041026a20033a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041043a0000200041046a2004360200200041026a20033a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c050b200041113a00000c040b41f0004108102a000b41f0004108102a000b41f0004108102a000b41f0004108102a000b2004102420041023200241f0036a24000bd00301057f230041106b2202240041002103200241003a000f200128020020012802042002410f6a410120012802081001210420012001280208200441016a41014b22046a2205360208024002402004450d00024002400240024020022d000f220641037122044102460d0020044101460d0120040d0320064102762104410121030c050b4100210420024100360208200220063a000841012103200141086a220641002001280200200141046a280200200241086a41017241032005100122012001417f461b2201410320014103491b20062802006a360200200141024d0d01200228020841027621040c040b41002104200241003b010c200220063a000c2001280200200141046a2802002002410c6a4101724101200510012103200141086a22012001280200200341016a41014b22016a3602002001450d0020022f010c4102762104410121030c030b410021030c020b200641034b0d01200141046a28020021044100210320024100360204200141086a2206410020012802002004200241046a41042005100122012001417f461b2201410420014104491b20062802006a360200200141034d0d0020022802042104410121030c010b0b2000200436020420002003360200200241106a24000bc50503047f027e037f230041106b22022400200241003a000820012802002001280204200241086a410120012802081001210320012001280208200341016a41014b22046a22033602080240024002402004450d0002400240024002400240024020022d0008220541037122044102460d0020044101460d0120040d022005410276ad2106420121070c080b20024100360208200220053a0008200141086a220441002001280200200141046a280200200241086a41017241032003100122012001417f461b2201410320014103491b20042802006a360200200141024d0d022002280208410276ad2106420121070c070b200241003b0108200220053a00082001280200200141046a280200200241086a4101724101200310012103200141086a22012001280200200341016a41014b22016a3602002001450d0120022f0108410276ad2106420121070c060b200541027622044104460d0120040d02200141046a280200210420024100360208200141086a2205410020012802002004200241086a41042003100122012001417f461b2201410420014104491b20052802006a360200200141034d0d0020023502082106420121070c050b42002106420021070c040b4200210720024200370308200141086a220441002001280200200141046a280200200241086a41082003100122012001417f461b2201410820014108491b20042802006a360200200141074d0d0220022903082106420121070c030b200441046a220841084b0d0042002106200141046a2109200141086a2105410021040340200241003a000820012802002009280200200241086a410120031001210320052005280200200341016a41014b220a6a2203360200200a450d0120023100082004410374413871ad86200684210642012107200441016a220441ff01712008490d000c030b0b420021070b0b2000200637030820002007370300200241106a24000be40603047f037e037f230041206b22022400200241003a001020012802002001280204200241106a410120012802081001210320012001280208200341016a41014b22036a220436020802400240024002402003450d000240024002400240024002400240024020022d0010220541037122034102460d0020034101460d0120030d022005410276ad21060c060b20024100360210200220053a0010200141086a220341002001280200200141046a280200200241106a41017241032004100122012001417f461b2201410320014103491b20032802006a360200200141024d0d022002280210410276ad21060c050b200241003b0110200220053a00102001280200200141046a280200200241106a4101724101200410012103200141086a22012001280200200341016a41014b22016a3602002001450d0120022f0110410276ad21060c040b20054102762203410c460d0120034104460d0220030d04200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d00200235021021060c030b420021060c060b420021082002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100122012001417f461b2201411020014110491b20032802006a3602002001410f4d0d04200241106a41086a290300210720022903102106420121080c060b4200210620024200370310200141086a220341002001280200200141046a280200200241106a41082004100122012001417f461b2201410820014108491b20032802006a360200200141074d0d04200229031021060b42002107420121080c040b200341046a220941104b0d00200141046a210a200141086a21054200210642002107410021030340200241003a00102001280200200a280200200241106a410120041001210420052005280200200441016a41014b220b6a2204360200200b450d01200220023100104200200341037441f80071109904200241086a29030020078421072002290300200684210642012108200341016a220341ff01712009490d000c040b0b420021080b0c010b42002107420021080b2000200637030820002008370300200041106a2007370300200241206a24000bfb0601017f0240024002400240024020012d0000417f6a2202410f4b0d00024002400240024002400240024002400240024002400240024002400240024020020e10000a0608030b0d090e050f02040c0107000b41f00010262202450d102002200141046a280200104e200041046a2002360200200041013a0000200041106a200141106a290300370300200041086a200141086a2903003703000f0b2000410f3a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00000f0b2000410c3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b41f00010262202450d0e2002200141046a280200104e200041046a2002360200200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200020012d00013a00010f0b2000410d3a00000f0b2000410a3a0000200041046a200141046a2802003602000f0b200041033a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b200041103a00000f0b200041043a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b41f00010262202450d092002200141046a280200104e200041083a0000200041046a20023602000f0b200041023a0000200041046a200141046a2802003602000f0b200041063a0000200041046a200141046a2802003602000f0b2000410e3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b41f00010262202450d062002200141046a280200104e200041073a0000200041046a20023602000f0b200041093a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b2000410b3a0000200041106a200141106a290300370300200041046a200141046a2902003702000f0b4184bfc000104f000b41f0004108102a000b41f0004108102a000b41f0004108102a000b41f0004108102a000bca1904027f027e077f027e230041c0016b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d272003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a2003450d0620012802042106200310262201450d1e2001200620031094041a0c070b2001410c6a2802002203417f4c0d192003450d0720012802042106200310262201450d1e2001200620031094041a0c080b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a28020021060c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121010b200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121010b200020013602042000410a3602002000410c6a2003360200200041086a2003360200200241c0016a24000f0b200241106a41086a200141186a290200370300200241106a41106a200141206a2802003602002002200141106a290200370310200141246a350200200141286a310000422086842104200141096a2f00002001410b6a2d00004110747221072001410c6a2802002106410021030b200241d0006a41106a200241106a41106a280200360200200241d0006a41086a200241106a41086a2903003703002002200229031037035020032007410874722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290350370200200041246a2004370200200041186a200241d0006a41086a290300370200200041206a200241d0006a41106a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041022101410021030c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b20034101102a000b20034101102a000b41f0004108102a000b6802017f037e230041306b22012400200029020821022000290210210320002902002104200141146a410036020020012004370318200141a886c500360210200142013702042001200141186a36020020012003370328200120023703202001200141206a1061000be21904027f027e077f027e230041c0016b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d252003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a200128020421012003450d062003102622060d0720034101102a000b2001410c6a2802002203417f4c0d19200128020421012003450d072003102622060d0820034101102a000b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a2802002106410021070c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121060b2006200120031094042101200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121060b20062001200310940421012000410c6a2003360200200041086a2003360200200020013602042000410a360200200241c0016a24000f0b200241d0006a41086a200141186a290200370300200241d0006a41106a200141206a290200370300200241d0006a41186a200141286a2d00003a00002002200141106a290200370350200141096a2f00002001410b6a2d00004110747241087421072001410c6a2802002106410021030b200241106a41186a200241d0006a41186a280200360200200241106a41106a200241d0006a41106a290300370300200241106a41086a200241d0006a41086a2903003703002002200229035037031020032007722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290310370200200041186a200241106a41086a290300370200200041206a200241106a41106a290300370200200041286a200241106a41186a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041002103410221010c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b41f0004108102a000bbe0703037f017e077f024002400240024002400240024002400240024002402001280200417f6a220241044b0d000240024002400240024002400240024002400240024020020e050004020301000b2001410c6a2802002202417f4c0d13200128020421034101210102402002450d00200210262201450d0c0b20012003200210940421012000410c6a2002360200200041086a200236020020002001360204200041013602000f0b2001410c6a2802002204ad420c7e2205422088a70d122005a72202417f4c0d12200128020421032002450d03200210262206450d0b410c21072004450d040c100b2001410c6a2802002202417f4c0d11200128020421012002450d042002102622030d0520024101102a000b2001410c6a2802002206ad42187e2205422088a70d102005a72203417f4c0d10200128020421022003450d0520031026220c450d0a2006450d060c0b0b20004102360200200041086a200141086a2903003703000f0b41042106410c210720040d0c0b410021090c0c0b410121030b20032001200210940421012000410c6a2002360200200041086a200236020020002001360204200041033602000f0b4104210c20060d050b4100210b0c050b41b89ac300104f000b20024101102a000b20024104102a000b20034104102a000b2002200641186c6a21044100210b200c21010340200241086a2802002203417f4c0d050240024002402003450d0020022802002107200310262209450d012009200720031094041a200241146a2802002207417f4c0d080c020b41012109200241146a2802002207417f4a0d010c070b20034101102a000b024002402007450d002002410c6a280200210820071026220a450d04200a200820071094041a0c010b4101210a0b20012009360200200141146a2007360200200141106a20073602002001410c6a200a360200200141086a2003360200200141046a2003360200200141186a2101200b41016a210b200241186a22022004470d000b0b2000200c360204200041043602002000410c6a200b360200200041086a20063602000f0b20074101102a000b2003200420076c6a210841002109200621020340200341086a2802002201417f4c0d022003280200210a024002402001450d0020011026220b0d010c050b4101210b0b200b200a2001109404210a200241086a2001360200200241046a20013602002002200a360200200220076a2102200941016a2109200320076a22032008470d000b0b2000200636020420004105360200200020076a2009360200200041086a20043602000f0b101d000b20014101102a000bae0a01047f230041206b220224000240024002402001280200417f6a220341094b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b2001410c6a2802002203417f4c0d12200128020421044101210502402003450d00200310262205450d140b20052004200310940421052000410c6a2003360200200041086a20033602002000200536020420004101360200200041106a200141106a290200370300200241206a24000f0b2000410536020020002001280204360204200241206a24000f0b2000410a360200200041086a200141086a290300370300200241206a24000f0b2001280204210541012103200141086a22042d00004101470d062001410c6a28020021040c070b2000410436020020002001280204360204200241206a24000f0b4101210320012d00044101470d06200141086a28020021010c070b2001410c6a2802002203417f4c0d0c200128020421052003450d092003102622040d0a20034101102a000b4101210320012d00044101470d06200141086a28020021050c070b2000410736020020002001280204360204200241206a24000f0b20004109360200200041086a200141086a290300370300200241206a24000f0b2002411e6a200441036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220042f00013b011c2002200141106a2902003703002001410c6a2802002104410021030b20002005360204200020022f011c3b0009200041086a20033a00002000410c6a2004360200200041106a20022903003702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a2802003602002000412c6a2001412c6a29020037020020004103360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030b200020022f011c3b0005200020033a000420004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002105410021030b200020033a0004200020022f011c3b0005200041086a20053602002000410c6a2002290300370200200041386a200141386a290300370300200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141286a280200210120004106360200200041286a2001360200200241206a24000f0b410121040b20042005200310940421052000410c6a2003360200200041086a20033602002000200536020420004102360200200041106a200141106a290200370300200241206a24000f0b41d8b8c200104f000b101d000b20034101102a000b900201027f024002400240024020012d000022024103460d00024020024102460d0020024101470d0241f00010262202450d032002200141046a28020010b703200041013a0000200041046a20023602000f0b200141046a280200210341f00010262202450d032002200141086a28020010b703200041086a2002360200200041046a2003360200200041023a00000f0b200041033a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041246a200141246a280200360200200041216a200141216a2d00004100473a00000f0b41f496c400104f000b41f0004108102a000b41f0004108102a000b840f02057f037e230041c0006b220224000240024002400240024020012d0000417f6a220341054b0d000240024002400240024002400240024002400240024002400240024020030e06000402030105000b200041e0006a200141e0006a280200360200200041d8006a200141d8006a290300370300200041d0006a200141d0006a290300370300200041c8006a200141c8006a290300370300200041c0006a200141c0006a290300370300200041386a200141386a290300370300200041306a200141306a290300370300200041286a200141286a290300370300200041206a200141206a290300370300200041186a200141186a290300370300200041106a200141106a290300370300200041086a200141086a290300370300200041e4006a200141e4006a2d00004100473a0000200041013a0000200241c0006a24000f0b200241186a2204200141196a290000370300200241106a2205200141116a290000370300200241086a2206200141096a29000037030020022001290001370300410021030240200141216a2d00004101470d00200241206a41186a2001413a6a290000370300200241206a41106a200141326a290000370300200241206a41086a2001412a6a2900003703002002200141226a290000370320410121030b20002002290300370001200041216a20033a0000200041226a2002290320370000200041196a2004290300370000200041116a2005290300370000200041096a20062903003700002000412a6a200241206a41086a290300370000200041326a200241206a41106a2903003700002000413a6a200241206a41186a290300370000200041053a0000200241c0006a24000f0b41012104200141046a2d00004101470d03200141086a28020021050c040b200141386a2903002107200141306a2903002108200141c0006a2903002109200241386a200141196a290000370300200241306a200141116a290000370300200241286a200141096a290000370300200220012900013703202001412c6a2802002203417f4c0d0b2003450d04200141246a2802002104200310262201450d0c2001200420031094041a0c050b2001410c6a2802002203417f4c0d0a200141106a29030021072003450d05200141046a2802002104200310262201450d0c2001200420031094041a0c060b200241186a200141196a290000370300200241106a200141116a290000370300200241086a200141096a29000037030020022001290001370300200241206a41186a200141396a290000370300200241206a41106a200141316a290000370300200241206a41086a200141296a2900003703002002200141216a290000370320200141cc006a2802002203ad2207421b88a70d092007420586a72204417f4c0d09200141d8006a2903002107200141d0006a2903002108200141c4006a28020021012004450d062004102622050d0720044101102a000b200241026a200141076a2d00003a0000200241206a41086a200141146a290000370300200241306a2001411c6a290000370300200241386a200141246a2d00003a00002002200141056a2f00003b010020022001410c6a290000370320200141086a2800002105410021040b200141306a2802002203417f4c0d07200141c0006a2903002107200141386a2903002108200141c8006a2903002109024002402003450d00200141286a2802002106200310262201450d0c2001200620031094041a0c010b410121010b200041c0006a2007370300200041386a2008370300200041056a20022f01003b0000200041046a20043a0000200041086a20053602002000410c6a2002290320370200200041c8006a2009370300200041306a20033602002000412c6a2003360200200041286a2001360200200041076a200241026a2d00003a0000200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a280200360200200041033a0000200241c0006a24000f0b410121010b20002002290320370001200041043a0000200041386a2007370300200041306a2008370300200041c0006a20093703002000412c6a2003360200200041286a2003360200200041246a2001360200200041096a200241286a290300370000200041116a200241306a290300370000200041196a200241386a290300370000200241c0006a24000f0b410121010b200041023a00002000410c6a2003360200200041086a2003360200200041046a2001360200200041106a2007370300200241c0006a24000f0b410121050b2005200120034105741094042101200041d8006a2007370300200041d0006a2008370300200041196a200241186a290300370000200041116a200241106a290300370000200041096a200241086a29030037000020002002290300370001200041216a2002290320370000200041296a200241206a41086a290300370000200041316a200241206a41106a290300370000200041396a200241206a41186a290300370000200041cc006a2003360200200041c8006a2003360200200041c4006a2001360200200041063a0000200241c0006a24000f0b41a48fc300104f000b101d000b20034101102a000b20034101102a000b20034101102a000b940d03047f017e057f230041206b220224000240024002400240024002400240024020012d0000417f6a2203410c4b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0d0008050602090a070c040b0103000b41012103200141046a2d00004101470d0c200141086a28020021040c0d0b2000410c3a0000200041046a200141046a280200360200200241206a24000f0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a280200360200200241206a24000f0b2001410c6a2802002205ad2206421b88a70d122006420586a72203417f4c0d12200141046a28020021072003450d0d200310262208450d132005450d0e0c170b2000410a3a0000200041046a200141046a280200360200200241206a24000f0b200041033a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b200041043a0000200241206a24000f0b200041083a0000200020012d00013a0001200241206a24000f0b200041023a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b2001410c6a280200220aad42247e2206422088a70d0c2006a72204417f4c0d0c200141046a28020021032004450d0920041026220b450d0e200a450d0a0c0f0b200041073a0000200241206a24000f0b2000410b3a0000200241206a24000f0b41012103200141046a2d00004101470d02200141086a28020021010c030b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030b200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041286a200141286a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141016a2d00002101200041013a0000200020013a0001200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030b200041093a0000200041056a20022f011c3b0000200041046a20033a0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b4101210820050d090b41002105410021010c090b4104210b200a0d050b410021040c050b41e89dc100104f000b101d000b20034101102a000b20044104102a000b200a41246c2105410021042002411e6a2109200b210103400240024020032d00004101470d00200341046a2802002107410121080c010b2009200341036a2d00003a0000200341046a2800002107200341016a2f00002108200241186a200341206a2d00003a0000200241106a200341186a290000370300200241086a200341106a290000370300200220083b011c2002200341086a290000370300410021080b200341246a2103200120083a0000200141046a2007360200200141036a20092d00003a0000200141016a20022f011c3b0000200141206a200241186a280200360200200141186a200241106a290300370200200141106a200241086a290300370200200141086a2002290300370200200141246a2101200441016a21042005415c6a22050d000b0b200041063a00002000410c6a2004360200200041086a200a360200200041046a200b360200200241206a24000f0b20054105742104416020076b21092008210120072103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200720054105746a20096a41057641016a21010b2000410d3a00002000410c6a2001360200200041086a2005360200200041046a2008360200200241206a24000b0a00419896c400104f000bd9b40107027f027e017f017e0f7f017e077f230041b0066b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410f4b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e10000a0608030b0d0910050e02040c0107000b200141106a2903002105200141086a2903002106200141046a28020021072002411a6a2901002108200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d1e200320083702f403200320093a00f3032003200a3a00f2032003200b3b01f003410121020c1f0b200141216a2d0000210b200341186a41186a200141196a290000370300200341186a41106a200141116a290000370300200341186a41086a200141096a290000370300200320012900013703182002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d0f200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c100b200341d8006a41186a200141196a290000370300200341d8006a41106a200141116a290000370300200341d8006a41086a200141096a29000037030020032001290001370358200241166a2f01002104200241186a2d00002116200241196a2d000021072002411a6a290100210820022d0000450d11200320083702f403200320073a00f303200320163a00f203200320043b01f0030c230b2002410c6a280200210a200241086a280200210b200241046a2802002115200141106a2903002105200141086a2903002108200141046a2802002117200241036a2d0000211620022d0000210420012d0001210920022f00012107200341f0036a41086a2002411c6a2802003602002003200241146a2902003703f0032004450d1141012102201541ff01710d12200b200a4f0d130c120b2002411a6a2901002108200241196a2d00002116200241186a2d00002107200241166a2f0100211720022d0000450d14200320083702f403200320163a00f303200320073a00f203200320173b01f0030c210b20022d000120022d0000720d09200141046a28020010350c98010b2002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100211720022d0000450d13200320083702f403200320043a00f303200320163a00f203200320173b01f0030c1f0b2002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f0100211320022d0000450d13200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c140b2002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100210720022d0000450d15200320083702f403200320043a00f303200320163a00f203200320073b01f0030c1d0b200141046a280200210741ef94c4002104410e211620022d0000450d9101200241046a2d00000d9101200241086a28020041036c2002410c6a280200410174490d910120034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d37419fc1c0002104411521160c91010b200141046a280200210b2002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d17200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c180b41ef94c4002104410e21164101210720022d0000450d8d01200241046a2d00000d8d0141012107200241086a28020041036c2002410c6a280200410174490d8d01200341e8026a200141046a2802002216103820032802f002410e470d3441cac2c0002104410d21160c8d010b200341e8056a41186a200141196a290000370300200341e8056a41106a200141116a290000370300200341e8056a41086a200141096a290000370300200320012900013703e8052002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100210720022d0000450d18200320083702f403200320043a00f303200320163a00f203200320073b01f0030c190b200141046a280200210741ef94c4002104410e211620022d0000450d8c01200241086a2802004101742002410c6a280200490d8c01200241046a28020041ff01710d8c0120034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d25419fc1c0002104411521160c8c010b20022d000120022d000072450d180b41b394c3002104412821160c92010b200341e0056a200141196a290000370300200341c8056a41106a200141116a290000370300200341c8056a41086a200141096a290000370300200320012900013703c805024020022d0000450d00200241236a2d00002116200241216a2f000021072002411f6a2d000021172002411d6a2f000021152002410f6a2d000021092002410d6a2f0000210a2002410b6a2d0000210b200241096a2f0000210c200241076a2d0000210d200241056a2f0000210e200241246a3502002106200241206a3100002118200241116a2900002108200241106a2d0000210f2002410c6a2d00002110200241086a2d00002111200241046a2d000021042003200241196a2800003602f803200320083703f0032004450d00200320032902f40322054238883c00ff05200320054230883c00fe05200320054220883d01fc05200320054218883c00fb05200320054210883c00fa05200320053d01f8052003200f3a00f3052003200a2009411074724108742010723600ef052003200c200b411074724108742011723600eb05200320083d01f405200320084218883c00f7052003200e200d4110747222023b01e805200320024110763a00ea0520032008a74110763a00f605200320184218862015201741107472ad42ffffff0783842007201641107472ad42ffffff0783422086842006423886843703800620034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d212003421037028c062003200341a8056a36028806200341e8026a20034188066a102f20032802e802410e460d4c200341d8006a200341e8026a41f0001094041a200341003a00af06200328028806200328028c06200341af066a410120034190066a22022802001001210420022002280200200441016a41014b22046a3602002004450d4b20032d00af0641034f0d4b20032802582102200341e0016a200341d8006a41047241ec001094041a2002410e460d4c200341f0036a200341e0016a41ec001094041a200320023602e802200341e8026a410472200341f0036a41ec001094041a2003410036026020034201370358200341e8026a200341d8006a1039200328025c2104200328026021072003280258210220034188066a41186a221742003703004110211620034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002200720034188066a1002200341d8006a41186a2017290300370300200341d8006a41106a2015290300370300200341d8006a41086a2009290300370300200320032903880637035802402004450d00200210230b200341c8056a200341d8006a41201096042102200341e8026a10244181c2c000210420020d8801200341e8026a200341c8056a105820032802f002220b450d364100210220032902f4022208422088a72204450d37024020044101460d004100210203402004410176221620026a22072002200b20074105746a200341e8056a41201096044101481b2102200420166b220441014b0d000b0b200b20024105746a200341e8056a41201096042204450d442004411f7620026a21020c370b41ef94c4002104410e21160c87010b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b41db94c300210441002107412a2117410021160b200741ffff0371410874201741ff017172201641187472211620020d84012003200837038005200320153a00ff04200320093a00fe042003200a3b01fc042003200c3a00fb042003200d3a00fa042003200e3b01f8042003200f3a00f704200320103a00f604200320113b01f404200320123a00f304200320163600ef04200320043600eb04200320133a00ea04200320143b01e80420034188056a41186a20032903800537030020034188056a41106a20032903f80437030020034188056a41086a200341e8046a41086a290300370300200320032903e80437038805200341e0016a41186a200341186a41186a290300370300200341e0016a41106a200341186a41106a290300370300200341e0016a41086a200341186a41086a2903003703002003200b3a008002200320032903183703e001411510262202450d432002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d4420022003290388053700152002412d6a20034188056a41186a290300370000200241256a20034188056a41106a2903003700002002411d6a20034188056a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d172003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322044102460d4a200341386a41186a200341a2036a290100370300200341386a41106a2003419a036a290100370300200341386a41086a20034192036a290100370300200341d8006a41086a200341b3036a290000370300200341d8006a41106a200341bb036a290000370300200341d8006a41186a200341c3036a2900003703002003200329018a033703382003200341ab036a290000370358200341aa036a2d000021070c82010b200241026a2f01002115200241046a2d00002109200241056a2d0000210a200241066a2f0100210b200241086a2d0000210c200241096a2d0000210d2002410a6a2f0100210e2002410c6a2d0000210f2002410d6a2d000021102002410e6a2f01002111200241106a2d00002112200241116a2d00002113200241126a2f01002114200241146a2d00002119200241156a2d0000211a20022d00012102200320083703f003200241ff01714101470d11410f10262202450d4f200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d502002200329035837000f200241276a200341d8006a41186a221c2903003700002002411f6a200341d8006a41106a221d290300370000200241176a200341d8006a41086a221e29030037000020034188066a41186a2217420037030020034188066a41106a221b420037030020034188066a41086a221f420037030020034200370388062002412f20034188066a1002200341f0036a41186a2017290300370300200341f0036a41106a201b290300370300200341f0036a41086a201f29030037030020032003290388063703f003200341f0036a412041a886c5004100410010012117200210232017417f460d284191c2c0002104410f21160c83010b410021020b200220072016411074727241ff0171450d00201710244128211641b394c30021040c010b4200210620034188066a41086a22024200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200229030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d3f20032903e80221060b200341e8026a201741f0001094041a200341d8006a2006200842c0ca01200842c0ca01561b7c200341e8026a20092005102d4101210720032802584101470d10200328025c2204450d10200341d8006a41086a28020021160b201710234100211541012107410121170c84010b200241156a2d00002115200241146a2d00002109200241126a2f0100210a200241116a2d0000210b200241106a2d0000210c2002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d00002111200241086a2d00002112200241066a2f01002113200241056a2d00002114200241046a2d00002119200241026a2f0100211a20022d00012102200320083703f003200241ff01714101470d0c410f10262202450d4c41002104200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d4d20022008370027200220163a0026200220073a0025200220173b0023200220153a0022200220093a00212002200a3b001f2002200b3a001e2002200c3a001d2002200d3b001b2002200e3a001a20022010410874201172200f4118747236001620022013410874201472201241187472360012200220193a00112002201a3b000f20034188066a41186a2216420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002412f20034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a41201003200210230c85010b200241156a2d00002115200241146a2d00002109200241126a2f0100210a200241116a2d0000210b200241106a2d0000210c2002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d00002111200241086a2d00002112200241066a2f01002113200241056a2d00002114200241046a2d00002119200241026a2f0100211a200141026a2d0000211b200141046a280200211f20022d0001210220012d0001211c200320083703f00341012107200241ff01714101470d0b2003200837038003200320043a00ff02200320163a00fe02200320173b01fc02200320153a00fb02200320093a00fa022003200a3b01f8022003200b3a00f7022003200c3a00f6022003200d3b01f4022003200e3a00f302200320193a00ea022003201a3b01e80220032010410874200f411874722011723600ef02200320134108742014722012411874723600eb02200341e8026a201f201c41ff0171410047201b105a2104412221160c7e0b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002114200241066a2f01002119200241056a2d0000211a20022d00012104200320083703f00341012102200441ff01714101470d002019410874201a722014411874722104410021020c010b41db94c300210441002107412a2117410021160b200741ffff0371410874201741ff017172201641187472211620020d7a2003200837038005200320153a00ff04200320093a00fe042003200a3b01fc042003200b3a00fb042003200c3a00fa042003200d3b01f8042003200e3a00f7042003200f3a00f604200320103b01f404200320113a00f304200320163600ef04200320043600eb04200320123a00ea04200320133b01e804411510262202450d3b2002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d3c200220032903e8043700152002412d6a200341e8046a41186a290300370000200241256a200341e8046a41106a2903003700002002411d6a200341e8046a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341f0036a412041a886c5004100410010012104200210232004417f460d0f411510262202450d412002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d42200220032903e8043700152002412d6a200341e8046a41186a290300370000200241256a200341e8046a41106a2903003700002002411d6a200341e8046a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d162003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322164102460d45200341d8006a41086a20034192036a290100370300200341d8006a41106a2003419a036a290100370300200341d8006a41186a200341a2036a290100370300200341e0016a41086a200341b3036a290000370300200341e0016a41106a200341bb036a290000370300200341e0016a41186a200341c3036a2900003703002003200329018a033703582003200341ab036a2900003703e001200341aa036a2d0000211720032d0088032115200341f0036a412010030c170b200141026a2d0000211a200141046a280200211b20012d0001211f200241156a2d00002117200241146a2d00002115200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002114200241026a2f0100211920022d00012102200320083703f003200241ff01714101470d0720032008370370200320043a006f200320163a006e200320073b016c200320173a006b200320153a006a200320093b01682003200a3a00672003200b3a00662003200c3b01642003200d3a0063200320143a005a200320193b01582003200f410874200e4118747220107236005f2003201241087420137220114118747236005b200341e8026a200341d8006a104220032d00e8024101470d17200341f4026a2d00002102200341f5026a2900002108200341fd026a280000210420032f00e902211620032d00eb02210720032902ec022105200320034181036a29000037038003200320043602fc02200320083702f402200320023a00f302200320053700eb02200320073a00ea02200320163b01e802200341e8026a201b201f41ff0171410047201a105a2104412221160c790b2002410c6a2d000021162002410a6a2f01002117200241096a2d00002115200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b412a21154100211641db94c3002104410021170b201741ffff0371410874201641187472201541ff017172211620020d0820032008370370200320093a006f2003200a3a006e2003200b3b016c2003200c3a006b2003200d3a006a2003200e3b01682003200f3a0067200320103a0066200320113b0164200320123a00632003201636005f2003200436005b200320133a005a200320143b0158200642ffffe883b1de165620054200522005501b0d0741f0bfc0002104410d21160c080b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b412a21174100211641db94c3002104410021070b200741ffff0371410874201641187472201741ff017172211620020d7320032008370370200320153a006f200320093a006e2003200a3b016c2003200c3a006b2003200d3a006a2003200e3b01682003200f3a0067200320103a0066200320113b0164200320123a00632003201636005f2003200436005b200320133a005a200320143b0158200341e8026a200b102220032802f8022217450d0720034184036a2802002116200341e8026a41186a280200210420032802fc022102200341106a200341d8006a20032902ec02220842208620033502e802842205200341f4026a3502004220862008422088842208105b2003280210450d0d41d4c0c0002104411a21162002450d73201710230c730b200241156a2d00002117200241146a2d00002115200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002114200241026a2f0100211920022d00012102200320083703f003200241ff01714101470d00200320083703f801200320043a00f701200320163a00f601200320073b01f401200320173a00f301200320153a00f201200320093b01f0012003200a3a00ef012003200b3a00ee012003200c3b01ec012003200d3a00eb01200320143a00e201200320193b01e0012003200f410874201072200e411874723600e701200320124108742013722011411874723600e301200341e8026a200341e8056a104220032d00e8024101470d12200341f4026a2d00002102200341f5026a2900002108200341fd026a280000210420032f00e902211620032d00eb02210720032902ec022105200320034181036a2900003703702003200436026c20032008370264200320023a00632003200537005b200320073a005a200320163b015841a0c2c0002104200341d8006a200341e0016a41201096040d13200341e8026a41186a200341e8056a41186a290300370300200341e8026a41106a200341e8056a41106a290300370300200341e8026a41086a200341e8056a41086a290300370300200320032903e8053703e802410f10262202450d5c41002104200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d5d200220032903e80237000f200241276a200341e8026a41186a2903003700002002411f6a200341e8026a41106a290300370000200241176a200341e8026a41086a29030037000020034188066a41186a2216420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002412f20034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a41201003200210230c790b41db94c3002104412a21160c710b200141086a2802002107200141046a2802002102200341d8006a200141106a29030022081036200328025821162003280260220420024d0d062016200241f8006c6a2217280200410e460d072016200241f8006c6a41f0006a2802002007470d07201710242017410e360200200341e8026a41086a200341d8006a41086a280200360200200320032903583703e802411710262202450d572002410f6a41002900cb8740370000200241086a41002900c48740370000200241002900bc874037000020024117412e10272202450d582002200837001720034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002411f20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341203602e4012003200341f0036a3602e001200341e8026a200341e0016a105c2002102320032802e8022116024020032802f0022202450d00200241f8006c210420162102034002402002280200410e460d00200210240b200241f8006a2102200441887f6a22040d000b0b20032802ec02450d76201610230c760b2017102341002115410121170c210b200341086a200341d8006a20062005105b2003280208450d0d41fdbfc0002104411a21160b2007102420071023410021094101210741012117410121150c760b200442003703002007420037030020034188066a41086a22174200370300200342003703880641e687c000411d20034188066a1002200341e8026a41186a2004290300370300200341e8026a41106a2007290300370300200341e8026a41086a201729030037030020032003290388063703e802200341e8026a412041a886c500410041001001417f460d1020034188046a420037030020034180046a4200370300200341f0036a41086a4200370300200342003703f003200341e8026a4120200341f0036a4120410010012204417f460d362004411f4d0d36200341a8056a41186a2204200341f0036a41186a290300370300200341a8056a41106a2207200341f0036a41106a290300370300200341a8056a41086a2217200341f0036a41086a290300370300200320032903f0033703a805200341c8056a41186a2004290300370300200341c8056a41106a2007290300370300200341c8056a41086a2017290300370300200320032903a8053703c805411510262204450d3d2004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272207450d3e200720032903c8053700152007412d6a200341c8056a41186a290300370000200741256a200341c8056a41106a2903003700002007411d6a200341c8056a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2217420037030020034188066a41086a2215420037030020034200370388062007413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2017290300370300200341f0036a41086a201529030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d3f200342203702ec052003200341f0036a3602e805200341e8026a200341e8056a105920032d00890322094102460d4020034188066a41186a2204200341e8026a41186a29030037030020034188066a41106a2215200341e8026a41106a29030037030020034188066a41086a2217200341e8026a41086a290300370300200320032903e8023703880620032d008803210a200341d8006a2003418a036a220c41c1001094041a200341e8056a41186a220b2004290300370300200341e8056a41106a220d2015290300370300200341e8056a41086a220e201729030037030020032003290388063703e805200320093a00e802200341e8026a410172200341d8006a41c1001094041a200341d8006a41186a2209200b290300370300200341d8006a41106a220b200d290300370300200341d8006a41086a220d200e290300370300200320032903e80537035820032d008903210e20044200370300201542003703002017420037030020034200370388062007413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2015290300370300200341f0036a41086a201729030037030020032003290388063703f00320034201370388062003410036029006412010262204450d41200342a0808080800437028c06200320043602880620042003290358370000200441086a200d290300370000200441106a200b290300370000200441186a2009290300370000200a20034188066a103f200341013a00af06200328028c0620172802002217470d13201741016a22042017490d6520174101742215200420042015491b22154100480d652017450d212003280288062017201510272204450d220c630b41b0c0c0002104412421160c6b0b41abc2c0002104410d21160c6a0b2004450d010b200441f8006c210420162102034002402002280200410e460d00200210240b200241f8006a2102200441887f6a22040d000b0b0240200328025c450d00201610230b41b8c2c0002104411221160c670b4114211641edc1c00021040c660b200341386a41186a200341d8006a41186a290300370300200341386a41106a2207200341d8006a41106a290300370300200341386a41086a2215200341d8006a41086a2903003703002003200329035837033820022004470d0b200241016a22092002490d5e2002410174220a20092009200a491b2209ad4205862206422088a70d5e2006a7220a4100480d5e2002450d1820172002410574200a102722170d190c4b0b200341003602f002200342013703e8022007200341e8026a103920032802ec02211620032802f002211720032802e802210420034188066a41186a2215420037030020034188066a41106a220942003703002002420037030020034200370388062004201720034188066a1002200341d8006a41186a22172015290300370300200341d8006a41106a2009290300370300200341d8006a41086a2002290300370300200320032903880637035802402016450d00200410230b200341e8026a41186a2017290300370300200341e8026a41106a200341d8006a41106a290300370300200341e8026a41086a200341d8006a41086a290300370300200320032903583703e802200341e0016a200341e8026a105820032802e8012202450d0620032903e00121054200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200429030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d2a20032903e80221080b0240200341ec016a280200450d00200210230b200820055a0d064185c1c0002104411a21160c660b410221160b200341a8056a41186a200341d8006a41186a290300370300200341a8056a41106a200341d8006a41106a290300370300200341a8056a41086a2207200341d8006a41086a29030037030020034188056a41086a2204200341e0016a41086a29030037030020034188056a41106a200341e0016a41106a29030037030020034188056a41186a200341e0016a41186a290300370300200320032903583703a805200320032903e00137038805200210234100210220164102460d55200341e8056a41186a200341a8056a41186a290300370300200341e8056a41106a200341a8056a41106a290300370300200341e8056a41086a2007290300370300200341c8056a41086a2004290300370300200341c8056a41106a20034188056a41106a290300370300200341c8056a41186a20034188056a41186a290300370300200320032903a8053703e80520032003290388053703c805410021020240201741ff01714101470d00411510262202450d3a2002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d3b200220032903c8053700152002412d6a200341e0056a290300370000200241256a200341d8056a2903003700002002411d6a200341c8056a41086a2903003700000b20164101470d05411510262204450d3b2004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272204450d3c200420032903e8053700152004412d6a200341e8056a41186a290300370000200441256a200341e8056a41106a2903003700002004411d6a200341e8056a41086a29030037000020034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062004413520034188066a1002200341f0036a41186a2009290300370300200341f0036a41106a200a290300370300200341f0036a41086a200b29030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d3d2003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322094102460d3e200341d8006a41206a200341e8026a41206a2d00003a0000200341d8006a41186a220a200341e8026a41186a290300370300200341d8006a41106a220b200341e8026a41106a290300370300200341d8006a41086a220c200341e8026a41086a220d290300370300200320032903e802370358200341e0016a200341e8026a41226a41c1001094041a200341d8006a41226a20032900e00137010020034182016a200341e0016a41086a2900003701002003418a016a200341e0016a41106a29000037010020034192016a200341e0016a41186a290000370100200320093a00792003419a016a20173a00002003419b016a20032903c805370000200341a3016a200341c8056a41086a290300370000200341ab016a200341c8056a41106a290300370000200341b3016a200341c8056a41186a29030037000020034188066a41186a2217420037030020034188066a41106a2209420037030020034188066a41086a220e420037030020034200370388062004413520034188066a1002200341f0036a41186a2017290300370300200341f0036a41106a2009290300370300200341f0036a41086a200e29030037030020032003290388063703f003200341003602f002200342013703e802412010262217450d3f20172003290358370000201741086a200c290300370000201741106a200b290300370000201741186a200a290300370000200342a080808080043702ec02200320173602e80220032d0078200341e8026a103f200341f9006a200341e8026a105d20032802ec022117200341f0036a412020032802e8022209200d280200100402402017450d00200910230b20041023410121172002450d0d0c520b4194bac2002104410b21160c610b20034188066a41086a2202420037030020034200370388064197c0c000411920034188066a1000200341a8056a41086a200229030037030020032003290388063703a805410021160240200341a8056a411041a886c500410041001001417f460d00200341003602e802200341a8056a4110200341e8026a41044100100141016a41044d0d2a20032802e80221160b20034188066a41086a2204420037030020034200370388064197c0c000411920034188066a1000200341a8056a41086a2217200429030037030020032003290388063703a8052003201641016a3602e802200341a8056a4110200341e8026a41041004412010262202450d3620022003290358370000200341fc026a428180808010370200200241186a200341d8006a41186a290300370000200241106a200341d8006a41106a290300370000200241086a200341d8006a41086a290300370000200320063703e802200320023602f802200320053703f0022016200341e8026a105e20044200370300200342003703880641fc88c000411520034188066a10002017200429030037030020032003290388063703a80541002102200341a8056a411041a886c500410041001001417f460d0c200342103702e4012003200341a8056a3602e001200341e8026a200341e0016a102020032802e8022217450d43200341f0026a280200210220032802ec0221150c0d0b4194bac20021040b410b21160c5e0b200341e8026a200741f0001095041a41002117200341003a00d80320034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a105f200341e8026a102420071023410121070c0e0b20034188066a41186a2204420037030020034188066a41106a2209420037030020034188066a41086a220a4200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2009290300370300200341f0036a41086a200a29030037030020032003290388063703f003201741ff01714101470d06412010262204450d45200420032903c805370000200441186a200341c8056a41186a290300370000200441106a200341c8056a41106a290300370000200441086a200341c8056a41086a290300370000200341f0036a412020044120100420041023410021044100211720020d4c0c070b20034188066a41186a2204420037030020034188066a41106a2207420037030020174200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003412010262204450d3a2004200329038805370000200441186a20034188056a41186a290300370000200441106a20034188056a41106a290300370000200441086a20034188056a41086a290300370000200341f0036a412020044120100420041023410021070c580b200341e8026a41186a201c290300370300200341e8026a41106a201d290300370300200341e8026a41086a201e290300370300200320032903583703e802410f10262202450d3a200241076a41002900a78640370000200241002900a086403700002002410f412f10272217450d3b201720032903e80237000f201741276a200341e8026a41186a2903003700002017411f6a200341e8026a41106a290300370000201741176a200341e8026a41086a29030037000020034188066a41186a2202420037030020034188066a41106a221b420037030020034188066a41086a221f420037030020034200370388062017412f20034188066a1002200341f0036a41186a2002290300370300200341f0036a41106a201b290300370300200341f0036a41086a201f29030037030020032003290388063703f003412010262202450d3c20022008370018200220073a0017200220163a0016200220043b00142002201a3a0013200220193a0012200220143b0010200220133a000f200220123a000e200220113b000c200220103a000b2002200e410874200d72200f411874723600072002200b410874200a72200c41187472360003200220093a0002200220153b0000200341f0036a41202002412010042002102320171023410021040c5a0b200221090c0d0b4101211520032802880621040c500b20032802e8022102200341e0016a200341e8026a4104724184011094041a20032002360258200341d8006a410472200341e0016a4184011094041a200341003602f002200342013703e802200341d8006a41086a2217200341e8026a103920032802ec02210420032802f002211520032802e802210220034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062002201520034188066a1002200341e0016a41186a22152009290300370300200341e0016a41106a2209200a290300370300200341e0016a41086a220a200b29030037030020032003290388063703e00102402004450d00200210230b200341e8026a41186a2015290300370300200341e8026a41106a2009290300370300200341e8026a41086a200a290300370300200320032903e0013703e802411710262202450d3b2002410f6a41002900fdc040370000200241086a41002900f6c040370000200241002900eec04037000020024117413710272202450d3c200220032903e8023700172002412f6a200341e8026a41186a220a290300370000200241276a200341e8026a41106a220b2903003700002002411f6a200341e8026a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002413720034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2015290300370300200341f0036a41086a200929030037030020032003290388063703f003200341f0036a412041a886c5004100410010012104200210232004417f460d0e2017102441d7c2c0002104412521160c580b200341003602f002200342013703e8022007200341e8026a103920032802ec02211620032802f002211720032802e802210420034188066a41186a2215420037030020034188066a41106a220942003703002002420037030020034200370388062004201720034188066a1002200341d8006a41186a22172015290300370300200341d8006a41106a2009290300370300200341d8006a41086a2002290300370300200320032903880637035802402016450d00200410230b200341e8026a41186a2017290300370300200341e8026a41106a200341d8006a41106a290300370300200341e8026a41086a200341d8006a41086a290300370300200320032903583703e802200341e0016a200341e8026a105820032802e8012202450d0620032903e00121054200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200429030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d2720032903e80221080b0240200341ec016a280200450d00200210230b200820055a0d064185c1c0002104411a21160c590b200341f0036a41201003410021044100211720020d450b41002116201720044572450d450c460b41082117410021150b200341e8026a2007104e200341386a41186a2209200341d8006a41186a290300370300200341386a41106a220a200341d8006a41106a290300370300200341386a41086a220b200341d8006a41086a2903003703002003200329035837033820152002470d41200241016a22042002490d4b20024101742215200420042015491b2215ad4298017e2208422088a70d4b2008a722044100480d4b2002450d0a201720024198016c200410272217450d0b0c410b410021024101210b420021080b200341e8026a41186a200341e8056a41186a290300370300200341e8026a41106a200341e8056a41106a290300370300200341e8026a41086a200341e8056a41086a290300370300200320032903e8053703e80220022008422088a722044b0d2e20042008a7470d3e200441016a22162004490d4920044101742207201620162007491bad22084205862205422088a70d492005a722164100480d492004450d0a200b200441057420161027220b450d0b0c3e0b200341e8026a200741f0001095041a200341023a00d80320034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a105f200341e8026a10242007102341002107410121170b410121150b41012109410021040c560b200a10262217450d320b201720044105746a22022003290338370000200241186a200341386a41186a290300370000200241106a2007290300370000200241086a201529030037000041012107200341e8026a41186a200441016a360200200341fc026a2009360200200320083703f002200320053703e8022003201636028403200320173602f802200b200341e8026a105e410021040c530b2015102622040d410b20154101102a000b200a200341e0016a41186a290300370300200b200341e0016a41106a290300370300200341e8026a41086a200341e0016a41086a290300370300200320032903e0013703e802200341013a00e805411710262202450d34410021042002410f6a41002900fdc040370000200241086a41002900f6c040370000200241002900eec04037000020024117413710272202450d35200220032903e8023700172002412f6a200341e8026a41186a290300370000200241276a200341e8026a41106a2903003700002002411f6a200341e8026a41086a29030037000020034188066a41186a2207420037030020034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002413720034188066a1002200341f0036a41186a2007290300370300200341f0036a41106a2015290300370300200341f0036a41086a200929030037030020032003290388063703f00341012107200341f0036a4120200341e8056a410110042002102320161035201710240c500b2004102622170d360b20044108102a000b20161026220b0d330b20164101102a000b41b4c1c0002104412621162008a7450d43200b10230c430b200341fc026a41013602002003410136025c2003418898c400360258200342013702ec02200341d497c4003602e8022003200341d8006a3602f802200341e8026a41e0bfc0001061000b41d4aac10041331021000b41154101102a000b41354101102a000b41154101102a000b41354101102a000b200341d8006a10240b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41154101102a000b41354101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b410f4101102a000b412f4101102a000b410f4101102a000b412f4101102a000b41d4aac10041331021000b41154101102a000b41354101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b41204101102a000b41154101102a000b41354101102a000b41154101102a000b41354101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b4180e4c400104f000b41204101102a000b410f4101102a000b412f4101102a000b41204101102a000b41d4aac10041331021000b41174101102a000b41374101102a000b200a4101102a000b41174101102a000b412e4101102a000b41204101102a000b410f4101102a000b412f4101102a000b41174101102a000b41374101102a000b200b20024105746a221641206a2016200420026b4105741095041a201641186a200341e8026a41186a290300370000201641106a200341e8026a41106a290300370000201641086a200341e8026a41086a290300370000201620032903e80237000020034188066a41086a22024200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200229030037030020032003290388063703a8050240024002400240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d0220032903e8024280e90f7c21054101211641132107411310262202450d010c030b4280e90f210541012116411321074113102622020d020b20072016102a000b41d4aac10041331021000b2002410f6a41002800e9c140360000200241086a41002900e2c140370000200241002900dac140370000024002402002200741331027220c450d00200c20032903c805370013200c412b6a200341c8056a41186a290300370000200c41236a200341c8056a41106a290300370000200c411b6a200341c8056a41086a29030037000020034188066a41186a2202420037030020034188066a41106a2207420037030020034188066a41086a221742003703002003420037038806200c413320034188066a1002200341f0036a41186a2002290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341003602f002200342013703e802410810262202450d01200220053700002003428880808080013702ec02200320023602e8022003200420166a2202360258200341d8006a200341e8026a10410240024002402002450d00200441057441206a21154100200341e8026a41086a28020022046b210720032802e802210920032802ec022117200b210203400240201720076a411f4b0d00200441206a22162004490d112017410174220a20162016200a491b22164100480d11024002402017450d00200920172016102722090d010c060b201610262209450d050b201621170b200920046a22162002290000370000201641186a200241186a290000370000201641106a200241106a290000370000201641086a200241086a290000370000200741606a2107200441206a2104200241206a2102201541606a22150d000b200341f0026a2004360200200320173602ec02200320093602e8020c010b200341f0026a280200210420032802ec02211720032802e80221090b2008a72102200341f0036a412020092004100402402017450d00200910230b200c102302402002450d00200b10230b200341e8026a41086a410a3a0000200341f1026a20032903e80537000020034191036a20032903c805370000200341f9026a200341e8056a41086a29030037000020034181036a200341e8056a41106a29030037000020034189036a200341e8056a41186a29030037000020034199036a200341c8056a41086a290300370000200341a1036a200341c8056a41106a290300370000200341a9036a200341c8056a41186a290300370000200341053a00e802200341b8036a20053703004100210441a886c5004100200341e8026a102c20034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411010030c1b0b20164101102a000b41334101102a000b41084101102a000b201720024198016c220c6a200341e8026a41f000109404220420163602702004418c016a200929030037020020044184016a200a290300370200200441fc006a200b290300370200200420032903383702742003200241016a22023602f002200320153602ec02200320173602e80220034188066a41086a22044200370300200342003703880641fc88c000411520034188066a1000200341a8056a41086a200429030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a102502402002450d00200c4198016a21042017210203402002102420024198016a2102200441e87e6a22040d000b0b02402015450d00201710230b20034180036a2005370300200341f8026a2006370300200341f4026a201636020041002109200341f0026a41003a0000200341053a00e80241a886c5004100200341e8026a102c2007102420071023410121074101211741012115410021040c190b20034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062002413520034188066a1002200341f0036a41186a2009290300370300200341f0036a41106a200a290300370300200341f0036a41086a200b29030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d032003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d0089034102460d04200341d8006a41206a200341e8026a41206a2d00003a0000200341d8006a41186a2209200341e8026a41186a290300370300200341d8006a41106a220a200341e8026a41106a290300370300200341d8006a41086a220b200341e8026a41086a220c290300370300200320032903e802370358200341e0016a200341e8026a41226a41c1001094041a200341d8006a41226a200341e0016a41c10010940420032903e80537010020034182016a200341e8056a41086a2903003701002003418a016a200341e8056a41106a29030037010020034192016a200341e8056a41186a290300370100200320163a007920034188066a41186a2216420037030020034188066a41106a220d420037030020034188066a41086a220e420037030020034200370388062002413520034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a200d290300370300200341f0036a41086a200e29030037030020032003290388063703f003200341003602f002200342013703e802412010262216450d0520162003290358370000201641086a200b290300370000201641106a200a290300370000201641186a2009290300370000200342a080808080043702ec02200320163602e80220032d0078200341e8026a103f200341f9006a200341e8026a105d20032802ec022116200341f0036a412020032802e8022209200c280200100402402016450d00200910230b20021023410121162017200445720d010b200410230b02402002452016720d00200210230b201521020b4200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a10002007200429030037030020032003290388063703a80502400240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d0120032903e80221080b200342e4cab5fbb6ccdcb0e300370338200341386a200341e8046a427f427f200241187441187541027441a8f9c4006a3502004280e90f7e20087c41021062200341e8026a41086a41093a0000200341e8026a41096a20032903e804370000200341f9026a200341e8046a41086a29030037000020034181036a200341e8046a41106a29030037000020034189036a200341e8046a41186a290300370000200341053a00e8024100210441a886c5004100200341e8026a102c0c140b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b2003201536028c06200320043602880620032d00af0621150b20034188066a41086a2209201741016a360200200420176a20153a000002400240024002400240200328028c06220a200928020022156b411f4b0d00201541206a22172015490d05200a410174220b20172017200b491b22174100480d05200a450d012004200a201710272204450d020c030b200a21170c030b2017102622040d010b20174101102a000b2003201736028c0620032004360288060b2009201541206a220b360200200420156a220941086a20034188056a41086a290300370000200941106a20034188056a41106a290300370000200941186a20034188056a41186a290300370000200920032903880537000002400240024002400240024002400240024002400240200c4100200e4101461b2209450d004101210c200341013a00af062017200b470d01201741016a220a2017490d0b2017410174220c200a200a200c491b220a4100480d0b2017450d0320042017200a10272204450d040c090b41002109200341003a00af062017200b470d01201741016a22092017490d0a2017410174220a20092009200a491b220c4100480d0a2017450d0420042017200c10272204450d050c060b2017210a0c080b2017210c0c050b200a102622040d050b200a4101102a000b200c102622040d010b200c4101102a000b2003200c36028c06200320043602880620032d00af0621090b20034190066a201541216a22153602002004200b6a20093a00000c050b2003200a36028c06200320043602880620032d00af06210c0b20034188066a41086a220d201541216a3602002004200b6a200c3a0000024002400240200a200d28020022176b411f4b0d00201741206a22152017490d03200a410174220b20152015200b491b220c4100480d03200a450d012004200a200c10272204450d020c040b200a210c0c040b200c102622040d020b200c4101102a000b101e000b2003200c36028c0620032004360288060b200d201741206a2215360200200420176a221741086a200941086a290000370000201741106a200941106a290000370000201741186a200941186a290000370000201720092900003700000b200341f0036a41202004201510040240200c450d00200410230b2007102320034188066a41186a2204420037030020034188066a41106a2207420037030020034188066a41086a22174200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003412010262204450d022004200329038805370000200441186a20034188056a41186a290300370000200441106a20034188056a41106a290300370000200441086a20034188056a41086a290300370000200341f0036a412020044120100420041023200341d8006a41186a200341c8056a41186a290300370300200341d8006a41106a200341c8056a41106a290300370300200341d8006a41086a200341c8056a41086a290300370300200320032903c805370358410121070b410021040b2003418d036a20073a00002003418e036a2003290358370100200341f5026a200341386a41086a290300370000200341fd026a200341386a41106a29030037000020034185036a200341386a41186a29030037000020034196036a200341d8006a41086a2903003701002003419e036a200341d8006a41106a290300370100200341a6036a200341d8006a41186a290300370100200320043a00ec02200320032903383700ed022003200341e0016a3602e80220034188066a41186a2204420037030020034188066a41106a2217420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2017290300370300200341f0036a41086a200729030037030020032003290388063703f003200341003602900620034201370388060240412010262204450d00200420032903e001370000200441186a200341e0016a41186a290300370000200441106a200341e0016a41106a290300370000200441086a200341e0016a41086a290300370000200342a0808080800437028c062003200436028806200341e0016a41206a2d000020034188066a103f200341e8026a41047220034188066a105d200328028c062104200341f0036a412020032802880622172007280200100402402004450d00201710230b20021023200342e4cab5fbb6ccdcb0e3003703e004200341e0046a200341e8046a427f1063200341e8026a41086a41083a0000200341f1026a20032903e804370000200341f9026a200341e8046a41086a29030037000020034181036a200341e8046a41106a29030037000020034189036a200341e8046a41186a29030037000020034191036a200329031837000020034199036a200341186a41086a290300370000200341a1036a200341186a41106a290300370000200341a9036a200341186a41186a290300370000200341053a00e8024100210441a886c5004100200341e8026a102c0c020b41204101102a000b41204101102a000b410121070b410121170c020b200710242007102341002117410121070c010b200710242007102341012117410021070b410121150b410121090c030b410021040b410121070b4101211741012115410121090b0240024002400240024002400240024020012d0000417f6a2202410e4b0d0020020e0f030000000400010200000008000808030b200241074b0d07024020020e080008080806080507000b200141046a22022802001024200228020010230c070b2017450d06200141046a22022802001024200228020010230c060b2007450d05200141046a22022802001024200228020010230c050b2009450d04200141046a22022802001024200228020010230c040b2015450d03200141046a22022802001024200228020010230c030b200141046a22022802001024200228020010230c020b200141046a22022802001024200228020010230c010b200141046a22022802001024200228020010230b2000201636020420002004360200200341b0066a24000bc40302047f017e230041d0006b2202240002400240411310262203450d002003410f6a41002800e9c140360000200341086a41002900e2c140370000200341002900dac14037000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034133200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041a886c500410041001001417f460d002002200236022020024120360224200242003703302002410020024120200241306a41084100100122012001417f461b2201410820014108491b360228200141074d0d0220022903302106200241306a200241206a102820022802302201450d022000200229023437020c20002001360208200020063703000c010b200041003602080b20031023200241d0006a24000f0b41d4aac10041331021000b41134101102a000b41334101102a000b960d01097f23004180026b22022400200241e0016a41186a22034200370300200241e0016a41106a22044200370300200241e0016a41086a22054200370300200242003703e0012001410020012802002001280204200241e0016a41202001280208100122062006417f461b22064120200641204922061b20012802086a22073602080240024020060d00200241c0016a41186a2003290300370300200241c0016a41106a2004290300370300200241c0016a41086a2005290300370300200220022903e0013703c001200241003a00e0012001280200200141046a280200200241e0016a4101200710012106200141086a22032003280200200641016a41014b22066a22033602002006450d0020022d00e001220641064f0d00200241186a200241c0016a41186a290300370300200241106a200241c0016a41106a290300370300200241086a200241c0016a41086a290300370300200220022903c00137030041002105200241003a00e0012001280200200141046a280200200241e0016a4101200310012103200141086a22042004280200200341016a41014b22036a22043602002003450d01024020022d00e0012203450d0020034101470d02200241e0016a41186a22074200370300200241e0016a41106a22084200370300200241e0016a41086a22094200370300200242003703e001200141086a220541002001280200200141046a280200200241e0016a41202004100122032003417f461b2203412020034120491b20052802006a22043602002003411f4d0d02200241c0016a41186a22032007290300370300200241c0016a41106a22052008290300370300200241c0016a41086a22072009290300370300200220022903e0013703c001200241a0016a41186a22082003290300370300200241a0016a41106a22032005290300370300200241a0016a41086a22052007290300370300200220022903c0013703a00120024180016a41186a200829030037030020024180016a41106a200329030037030020024180016a41086a2005290300370300200220022903a00137038001410121050b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a290300370300200220022903800137036041002107200241003a00e0012001280200200141046a280200200241e0016a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d01024020022d00e0012203450d0020034101470d02200241e0016a41186a22074200370300200241e0016a41106a22084200370300200241e0016a41086a22094200370300200242003703e001200141086a220341002001280200200141046a280200200241e0016a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d02200241c0016a41186a22012007290300370300200241c0016a41106a22032008290300370300200241c0016a41086a22042009290300370300200220022903e0013703c001200241a0016a41186a22072001290300370300200241a0016a41106a22012003290300370300200241a0016a41086a22032004290300370300200220022903c0013703a00120024180016a41186a200729030037030020024180016a41106a200129030037030020024180016a41086a2003290300370300200220022903a00137038001410121070b200241206a41186a220120024180016a41186a290300370300200241206a41106a220320024180016a41106a290300370300200241206a41086a220420024180016a41086a2903003703002002200229038001370320200241c0006a41186a2208200241e0006a41186a290300370300200241c0006a41106a2209200241e0006a41106a290300370300200241c0006a41086a220a200241e0006a41086a29030037030020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200020053a0021200020063a0020200041c2006a20073a0000200020022903403700222000412a6a200a290300370000200041326a20092903003700002000413a6a2008290300370000200041c3006a2002290320370000200041cb006a2004290300370000200041d3006a2003290300370000200041db006a200129030037000020024180026a24000f0b200041023a002120024180026a24000f0b200041023a002120024180026a24000bc70f030a7f017e057f230041f0006b220424000240024002400240024002400240024002400240024002400240024002400240411a10262205450d00200541186a41002f00dc86403b0000200541106a41002900d48640370000200541086a41002900cc8640370000200541002900c486403700002005411a413410272205450d012005200136001a200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a22084200370300200442003703482005411e200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041a886c50041004100100121062005102302400240024002402006417f460d00200441086a41186a200041186a290000370300200441086a41106a200041106a290000370300200441086a41086a200041086a29000037030020042000290000370308411010262205450d06200541086a4100290098864037000020054100290090864037000020054110412010272205450d07200520013600102005412041c00010272205450d08200520042903083700142005412c6a200441086a41186a2209290300370000200541246a200441086a41106a220a2903003700002005411c6a200441086a41086a220b290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041a886c500410041001001210c20051023200c417f470d0b200441086a200110302006200041186a2900003703002007200041106a2900003703002008200041086a2900003703002004200029000037034820042802102206200428020c220d470d01200641016a22052006490d0c20064101742207200520052007491b220dad420586220e422088a70d0c200ea722074100480d0c2006450d022004280208200641057420071027220f450d030c090b200441f0006a240041fcc2c0000f0b200641016a21052004280208210f0c080b20071026220f0d060b20074101102a000b411a4101102a000b41344101102a000b41104101102a000b41204101102a000b41c0004101102a000b2004200d36020c2004200f3602080b200441086a41086a2005360200200f20064105746a22062004290348370000200641186a200441c8006a41186a290300370000200641106a200441c8006a41106a290300370000200641086a200441c8006a41086a290300370000411310262206450d072006410f6a41002800e28740360000200641086a41002900db8740370000200641002900d3874037000020064113412610272210450d0820102001360013200441c8006a41186a22074200370300200441c8006a41106a22084200370300200441c8006a41086a220642003703002004420037034820104117200441c8006a1002200441286a41186a2007290300370300200441286a41106a2008290300370300200441286a41086a20062903003703002004200429034837032820044100360250200442013703482004200536026c200441ec006a200441c8006a1041024002402005450d00200541057421114100200628020022066b210820042802482112200428024c210c200f210503400240200c20086a411f4b0d00200641206a22072006490d05200c4101742213200720072013491b22074100480d0502400240200c450d002012200c2007102722120d010c080b200710262212450d070b2007210c0b201220066a22072005290000370000200741186a200541186a290000370000200741106a200541106a290000370000200741086a200541086a290000370000200841606a2108200641206a2106200541206a2105201141606a22110d000b200441d0006a20063602002004200c36024c200420123602480c010b20062802002106200428024c210c200428024821120b200441286a41202012200610040240200c450d00201210230b20101023200d450d00200f10230b2009200041186a290000370300200a200041106a290000370300200b200041086a29000037030020042000290000370308411010262205450d02200541086a4100290098864037000020054100290090864037000020054110412010272205450d03200520013600102005412041c00010272205450d04200520042903083700142005412c6a200441086a41186a290300370000200541246a200441086a41106a2903003700002005411c6a200441086a41086a290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328410110262206450d05200641807f410020021b2003723a0000200441286a41202006410110042006102320051023200441f0006a240041000f0b101e000b20074101102a000b41104101102a000b41204101102a000b41c0004101102a000b41014101102a000b41134101102a000b41264101102a000ba80704027f017e037f037e230041d0006b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310024002400240200441106a412041a886c500410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d022007410f4d0d02200441386a290300210a200429033021060c010b4200210a0b2005102302400240200620025a200a20035a200a2003511b0d0041a9b8c2002105411521010c010b200441086a20014104200620027d220b200a20037d2006200254ad7d2206108302024020042802082205450d00200428020c21010c010b411810262205450d05200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0620052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a2900003700004200210a200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054138200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a20092903003703002004200429033037031002400240200441106a412041a886c500410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d062007410f4d0d06200441386a290300210c2004290330210a0c010b4200210c0b200510232001200a20027c2202200c20037c2002200a54ad7c10fe012001200b200610df01410021050b2000200136020420002005360200200441d0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b9c0501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a20021041024002400240024002402000450d00200041f8006c2104200241086a2105034020052802002100200228020421060240024002400240024002400240024002402003280200410e470d0020062000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d03200228020020002007102722060d040c0c0b20062000470d01200041016a22062000490d0a20004101742207200620062007491b22074100480d0a2000450d05200228020020002007102722060d060c0c0b200228020021060c030b200228020021060c050b200710262206450d080b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41003a0000200341f8006a2103200441887f6a22040d030c040b200710262206450d060b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41013a0000200320021039200341f0006a2802002107024002400240024020022802042206200528020022006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102722060d020c090b200228020021060c020b200010262206450d070b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200341f8006a2103200441887f6a22040d000b0b200228020421002001280200200128020420022802002203200241086a280200100402402000450d00200310230b200241106a24000f0b101e000b20074101102a000b20074101102a000b20004101102a000bf90801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024002400240024002400240024020002d00004101470d0020022003470d01200341016a22022003490d0c20034101742204200220022004491b22044100480d0c2003450d0320012802002003200410272202450d040c090b20022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0420012802002003200410272202450d050c060b200128020021020c080b200128020021020c050b2004102622020d050b20044101102a000b2004102622020d010b20044101102a000b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c020b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0620024101742203200420042003491b22034100480d062002450d0120012802002002200310272202450d020c030b200128020021020c030b2003102622020d010b20034101102a000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a28020021030240024002400240024002400240024002400240024020002d00214101470d0020022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0320012802002003200410272202450d040c090b20022003470d01200341016a22002003490d0a20034101742202200020002002491b22024100480d0a2003450d0420012802002003200210272200450d050c060b200128020021020c080b200128020021000c050b2004102622020d050b20044101102a000b2002102622000d010b20024101102a000b20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a0000024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0320024101742203200420042003491b22034100480d032002450d0120012802002002200310272202450d020c040b200128020021020c040b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000bbe0503047f027e057f230041d0006b22022400024002400240411310262203450d002003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272204450d0120042000360013200241286a41186a22034200370300200241286a41106a22004200370300200241286a41086a220542003703002002420037032820044117200241286a1002200241086a41186a2003290300370300200241086a41106a2000290300370300200241086a41086a2005290300370300200220022903283703082002410036023020024201370328200141086a290300210620012903002107411010262203450d02200320073700002003200637000820024290808080800237022c20022003360228200128021021082002200141186a280200220336024c200241cc006a200241286a104102400240024002402003450d0020034105742109200241286a41086a28020021002002280228210a200228022c210b2008210303400240024002400240200b20006b41204f0d00200041206a22052000490d07200b410174220c20052005200c491b220c4100480d07200b450d01200a200b200c1027220a0d020c080b200041206a21050c020b200c1026220a450d060b200c210b0b200a20006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200941606a22090d000b200241306a20053602002002200b36022c2002200a3602280c010b200241306a2802002105200228022c210b2002280228210a0b200241086a4120200a200510040240200b450d00200a10230b200410230240200141146a280200450d00200810230b200241d0006a24000f0b101e000b200c4101102a000b41134101102a000b41264101102a000b41104101102a000bdf0401037f230041106b220224002002410036020820024201370300200020021039024002400240024002400240024002400240024002400240024002400240024002400240024020002d007022004101460d0020004102470d012002280204200241086a2802002200470d03200041016a22032000490d0b20004101742204200320032004491b22044100480d0b2000450d0720022802002000200410272203450d080c100b2002280204200241086a2802002200470d01200041016a22032000490d0a20004101742204200320032004491b22044100480d0a2000450d0420022802002000200410272203450d050c0d0b2002280204200241086a2802002200470d02200041016a22032000490d0920004101742204200320032004491b22044100480d092000450d0720022802002000200410272203450d080c0a0b200228020021030c0c0b200228020021030c0d0b200228020021030c080b2004102622030d080b20044101102a000b2004102622030d080b20044101102a000b2004102622030d020b20044101102a000b101e000b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41003a00000c040b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41013a00000c020b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41023a00000b200228020421002001280200200128020420022802002201200241086a280200100402402000450d00200110230b200241106a24000b110020012000280200200028020410b3010b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241a886c500360204200241a886c500360200200210f503000b831005017f017e077f027e057f230041a0016b2206240042002107200641086a41086a220842003703002006420037030841af98c300410d200641086a1000200641f8006a41086a2008290300370300200620062903083703780240024002400240024002400240024002400240200641f8006a411041a886c500410041001001417f460d0020064200370308200641f8006a4110200641086a41084100100141016a41084d0d01200629030821070b200641086a41106a2003370300200641086a41286a20053a0000200641086a41186a2004370300200641286a22092000290000370300200620023703104201210420064201370308200641f8006a20011080022006280278210a200628027c210b200628028001220c450d02200641f8006a41186a220d2000460d01200c41286c210e42012104200a21050340200541086a2903002102200541106a2903002103200541186a290300210f20052903002110200641f8006a41206a200541206a290300370300200641f8006a41186a200f370300200641f8006a41106a22112003370300200641f8006a41086a2002370300200620103703780240024002400240200d2900002000290000510d0020112903002007580d01200641e8006a41086a200d41086a2903003703002006200d2903003703682011290300210220062903800121032006290378210f42014201520d030c020b200641e8006a41086a200941086a29030037030020062903082110420021042006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310210f20104201510d010c020b42004201520d010b200541286a21050c060b200541286a2105200e41586a220e0d000c030b0b41d4aac10041331021000b200c41286c210e200a41286a2105200641206a2903002102200629031821032006290310210f200629030821040340200641e8006a41086a200941086a290300370300200642003703082006200929030037036820044201510d02200541286a210542002104200e41586a220e0d000b0b4100210c0240200b450d00200a10230b410821124100211320044201510d020c050b420021040b200641d8006a41086a220e200641e8006a41086a29030037030020062006290368370358200641c8006a41086a2211200e29030037030020062006290358370348200641386a41086a220e201129030037030020062006290348370338024002400240412810262212450d00201220062903383703182012200f37030020122003370308201241206a200e290300370300201241106a20023703002005200a200c41286c6a220d460d01200641f8006a41186a210e4101210c41012113034002400240200e2000460d000340200641f8006a41206a200541206a290300370300200e200541186a290300370300200641f8006a41106a2211200541106a290300370300200641f8006a41086a200541086a290300370300200620052903003703780240024002400240200e2900002000290000510d0020112903002007580d01200641e8006a41086a200e41086a2903003703002006200e2903003703682011290300210220062903800121032006290378210f42014201520d030c020b200641e8006a41086a200941086a29030037030020062903082110420021042006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310210f20104201510d010c020b42004201520d010b200541286a21050c030b200d200541286a2205470d000c060b0b200641086a41186a2903002102200629031821032006290310210f2006290308210402400340200641e8006a41086a200941086a290300370300200642003703082006200929030037036820044201510d0142002104200d200541286a2205470d000c060b0b200541286a2105420021040b200641d8006a41086a2211200641e8006a41086a29030037030020062006290368370358200641c8006a41086a2214201129030037030020062006290358370348200641f8006a41086a2215201429030037030020062006290348370378024002402013200c470d00200c41016a2211200c490d07200c4101742213201120112013491b2213ad42287e2210422088a70d072010a722114100480d070240200c450d002012200c41286c2011102722120d010c020b201110262212450d010b2012200c41286c6a221120033703082011200f37030020112006290378370318201141106a2002370300201141206a2015290300370300200c41016a210c2005200d470d010c040b0b20114108102a000b41284108102a000b4101210c410121130b0240200b450d00200a10230b20044201520d030b200641f8006a41206a2209200841206a290300370300200641f8006a41186a2200200841186a290300370300200641f8006a41106a220e200841106a290300370300200641f8006a41086a2211200841086a29030037030020062008290300370378200c2013470d01200c41016a2205200c490d00200c410174220d20052005200d491b2213ad42287e2204422088a70d002004a722054100480d0002400240200c450d002012200c41286c200510272212450d010c030b2005102622120d020b20054108102a000b101e000b2012200c41286c6a22052006290378370300200541206a2009290300370300200541186a2000290300370300200541106a200e290300370300200541086a2011290300370300200c41016a210c0b2006200c360280012006201336027c200620123602782001200641f8006a108702200641a0016a24000bf31107017f017e087f047e017f037e057f23004180016b2203240042002104200341086a41086a220542003703002003420037030841af98c300410d200341086a1000200341d8006a41086a2005290300370300200320032903083703580240024002400240024002400240200341d8006a411041a886c500410041001001417f460d0020034200370308200341d8006a4110200341086a41084100100141016a41084d0d01200329030821040b200341086a41106a427f370300200341086a41286a41023a0000200341086a41186a2002370300200341286a20002900003703002003427f3703104201210220034201370308200341d8006a200110800220032802582106200328025c2107024002400240024002400240024020032802602208450d000240200341d8006a41186a22092000460d00200341f9006a210a200841286c210b420121022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a2211200e370300200341d8006a41086a200d370300200320103703580240024020092900002000290000510d002011290300220d2004580d010c050b2003290308210d4200210220034200370308200d4201510d060b200c41286a210c200b41586a220b0d000c020b0b200841286c210b200341086a41186a29030021122003290318211320032903102114200329030821022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a200e370300200341d8006a41086a200d370300200342003703082003201037035820024201510d03200c41286a210c42002102200b41586a220b0d000b0b4100210802402007450d00200610230b4108210a4100211520024201510d050c0b0b2003200a2800003602502003200a41036a280000360053200c41286a210c200341e0006a290300210e200341f8006a2d0000210b200341f0006a290300210f200329035821100c030b200c41286a210c0c010b200341086a41186a29030021122003290318211320032903102114200c41286a210c0b200341e0006a2903002202201320142003290358220d54201320025420132002511b220b1b210e200d2014200b1b2110200341e8006a2903002202201220122002541b210d200341f8006a2d0000410272210b200341f0006a290300210f420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336003b2003200328024036023841281026220a450d04200a2010370300200a200b3a0020200a200f370318200a200d370310200a2003280238360021200a200e370308200a41246a200328003b36000002400240200c2006200841286c6a2211460d00200341d8006a41186a210b200341f9006a221641036a21174101210841012115034002400240024002400240200b2000460d000340200341d8006a41206a2218200c41206a290300370300200b200c41186a290300370300200341d8006a41106a2209200c41106a290300370300200341d8006a41086a2219200c41086a2903003703002003200c29030037035802400240200b2900002000290000510d002009290300220d2004580d010c040b2003290308210d4200210220034200370308200d4201510d040b2011200c41286a220c470d000c080b0b200341086a41186a290300210e2003290318210d2003290310210f200329030821020340200341d8006a41206a200c41206a290300370300200b200c41186a290300370300200341d8006a41106a200c41106a290300370300200341d8006a41086a200c41086a2903003703002003200c2903003703582003420037030820024201510d03420021022011200c41286a220c470d000c070b0b2003201628000036025020032017280000360053200c41286a210c2019290300211020182d00002118200b290300210e2003290358210f0c020b200341086a41186a290300210e2003290318210d2003290310210f0b200c41286a210c200341d8006a41086a2903002202200d200f2003290358221354200d200254200d2002511b22091b21102013200f20091b210f200341d8006a41106a2903002202200e200e2002541b210d200341d8006a41206a2d00004102722118200b290300210e420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336005b20032003280240360258024020152008470d00200841016a22092008490d0620084101742219200920092019491b2215ad42287e2213422088a70d062013a722094100480d0602402008450d00200a200841286c20091027220a0d010c080b20091026220a450d070b200a200841286c6a220920183a0020200920103703082009200f3703002009200e3703182009200d370310200941246a200328005b36000020092003280258360021200841016a2108200c2011470d000c020b0b41012108410121150b02402007450d00200610230b20024201520d060b200341d8006a41206a2200200541206a290300370300200341d8006a41186a220b200541186a290300370300200341d8006a41106a2211200541106a290300370300200341d8006a41086a2209200541086a2903003703002003200529030037035820082015470d04200841016a220c2008490d0120084101742205200c200c2005491b2215ad42287e2202422088a70d012002a7220c4100480d01024002402008450d00200a200841286c200c1027220a450d010c060b200c1026220a0d050b200c4108102a000b41d4aac10041331021000b101e000b20094108102a000b41284108102a000b200a200841286c6a220c2003290358370300200c41206a2000290300370300200c41186a200b290300370300200c41106a2011290300370300200c41086a2009290300370300200841016a21080b200320083602602003201536025c2003200a3602582001200341d8006a10870220034180016a24000bf20a03027f027e077f23004190026b22022400200241206a2001104a024002402002280220450d0020022802242103200241086a2001104c2002290308a7450d00200241186a29030021042002290310210541002106200241003a00f00120012802002001280204200241f0016a410120012802081001210720012001280208200741016a41014b22076a22083602082007450d01024020022d00f0012207450d0020074101470d02200241f0016a41186a22094200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220641002001280200200141046a280200200241f0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d02200241d0016a41186a22072009290300370300200241d0016a41106a2206200a290300370300200241d0016a41086a2209200b290300370300200220022903f0013703d001200241b0016a41186a220a2007290300370300200241b0016a41106a22072006290300370300200241b0016a41086a22062009290300370300200220022903d0013703b00120024190016a41186a200a29030037030020024190016a41106a200729030037030020024190016a41086a2006290300370300200220022903b00137039001410121060b200241f0006a41186a20024190016a41186a290300370300200241f0006a41106a20024190016a41106a290300370300200241f0006a41086a20024190016a41086a290300370300200220022903900137037041002109200241003a00f0012001280200200141046a280200200241f0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d01024020022d00f0012207450d0020074101470d02200241f0016a41186a22094200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220741002001280200200141046a280200200241f0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d02200241d0016a41186a22012009290300370300200241d0016a41106a2207200a290300370300200241d0016a41086a2208200b290300370300200220022903f0013703d001200241b0016a41186a22092001290300370300200241b0016a41106a22012007290300370300200241b0016a41086a22072008290300370300200220022903d0013703b00120024190016a41186a200929030037030020024190016a41106a200129030037030020024190016a41086a2007290300370300200220022903b00137039001410121090b200241306a41186a220120024190016a41186a290300370300200241306a41106a220720024190016a41106a290300370300200241306a41086a220820024190016a41086a2903003703002002200229039001370330200241d0006a41186a220a200241f0006a41186a290300370300200241d0006a41106a220b200241f0006a41106a290300370300200241d0006a41086a220c200241f0006a41086a290300370300200220022903703703502000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290350370019200041216a200c290300370000200041296a200b290300370000200041316a200a2903003700002000413a6a2002290330370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a2002412e6a2f01003b0100200041da006a200228012a36010020024190026a24000f0b200041023a001820024190026a24000f0b200041023a001820024190026a24000bf90801067f230041106b220224002002410036020820024201370300200041106a200210412002200036020c2002410c6a2002106620022802042103200228020821040240024002400240024002400240024002400240024002400240024002400240024020002d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22034100480d0c2004450d0320022802002004200310272205450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22034100480d0b2004450d0420022802002004200310272205450d050c060b200228020021050c080b200228020021050c050b2003102622050d050b20034101102a000b2003102622050d010b20034101102a000b20022003360204200220053602000b200241086a200441016a2206360200200520046a41003a00000c020b20022003360204200220053602000b200241086a2206200441016a360200200520046a41013a00000240024002400240024020022802042203200628020022046b41204f0d00200441206a22062004490d0620034101742207200620062007491b22074100480d062003450d0120052003200710272205450d020c030b200441206a21060c030b2007102622050d010b20074101102a000b2002200736020420022005360200200721030b200241086a2006360200200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a2900003700002004200041196a2900003700000b024002400240024002400240024002400240200041396a2d00004101470d0020032006470d08200341016a22042003490d0920034101742207200420042007491b22044100480d092003450d0120052003200410272205450d020c070b20032006470d05200341016a22002003490d0820034101742204200020002004491b22004100480d082003450d0220052003200010272205450d030c040b2004102622050d050b20044101102a000b2000102622050d010b20004101102a000b20022000360204200220053602000b200241086a2200200641016a360200200520066a41003a0000200228020421042001280200200128020420022802002203200028020010042004450d060c050b20022004360204200220053602000b200241086a2203200641016a360200200520066a41013a000002400240024020022802042205200328020022046b41204f0d00200441206a22032004490d0320054101742206200320032006491b22064100480d032005450d0120022802002005200610272203450d020c040b200228020021030c040b2006102622030d020b20064101102a000b101e000b2002200636020420022003360200200621050b200241086a200441206a2206360200200320046a220441086a200041c2006a290000370000200441106a200041ca006a290000370000200441186a200041d2006a29000037000020042000413a6a290000370000200128020020012802042003200610042005450d010b200310230b200241106a24000b960a03017f027e057f230041e0006b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d00200141046a280200200141086a2802002200470d01200041016a22052000490d1120004101742206200520052006491b22064100480d112000450d0520012802002000200610272205450d060c190b20034280800154410020051b450d01200141046a2802002205200141086a28020022006b41024f0d02200041026a22062000490d1020054101742200200620062000491b22004100480d102005450d0820012802002005200010272205450d090c160b200128020021050c180b200342808080800454410020051b450d01200141046a2802002205200141086a28020022006b41044f0d04200041046a22062000490d0e20054101742200200620062000491b22004100480d0e2005450d08200128020020052000102722050d090c120b200128020021050c140b411020047920037942c0007c20044200521ba74103766b22074104490d0e200141046a280200200141086a2802002206470d03200641016a22052006490d0c20064101742208200520052008491b22054100480d0c2006450d09200128020020062005102722080d0a0c110b2006102622050d130b20064101102a000b200128020021050c050b200128020021080c070b2000102622050d0d0b20004101102a000b200010262205450d090b20012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a7410274410272360000200241e0006a24000f0b200510262208450d070b20012008360200200141046a2005360200200141086a28020021060b200141086a2205200641016a360200200820066a200741027441736a3a0000200029030021032002200041086a290300220437030820022003370300200141046a210803400240024002400240200828020020052802002200470d00200041016a22062000490d0520004101742209200620062009491b22094100480d052000450d01200128020020002009102722060d020c060b200128020021060c020b200910262206450d040b2001200636020020082009360200200528020021000b2005200041016a360200200620006a2003a73a000020034208882004423886842103200442088821042007417f6a22070d000b2002200337030020022004370308200320048450450d03200241e0006a24000f0b101e000b20094101102a000b41b8a8c400104f000b20022002360240200241d0a8c400360244200241c8006a41146a4100360200200241286a41146a4103360200200241346a4105360200200241106a41146a4103360200200241a886c5003602582002420137024c200241f898c4003602482002410536022c20024203370214200241d480c5003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a41e0a8c4001061000b20004101102a000b20054101102a000b20012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b0000200241e0006a24000f0b20012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a0000200241e0006a24000bae0201027f230041106b2202240020024100360208200242013703000240412010262203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a200210662002200041106a36020c2002410c6a20021066200028022021032002200041286a280200220036020c2002410c6a2002104102402000450d002003200041186c6a210003402002200336020c2002410c6a20021066200341106a200210412000200341186a2203470d000b0b200228020421032001280200200128020420022802002200200241086a280200100402402003450d00200010230b200241106a24000f0b41204101102a000b860100024002400240024002400240200041ff017122004101460d0020004102470d01410110262200450d03200041023a00000c020b410110262200450d03200041013a00000c010b410110262200450d03200041003a00000b20012802002001280204200041011004200010230f0b41014101102a000b41014101102a000b41014101102a000b13002000410d360204200041d0c7c0003602000b130020004107360204200041faf4c0003602000b890501077f230041b0016b22022400024002400240410e10262203450d00200341066a41002900c6c740370000200341002900c0c7403700002003410e412e10272203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241e0006a41186a22014200370300200241e0006a41106a22044200370300200241e0006a41086a22054200370300200242003703602003412e200241e0006a1002200241306a41186a2001290300370300200241306a41106a2004290300370300200241306a41086a20052903003703002002200229036037033002400240200241306a412041a886c500410041001001417f460d00200242203702542002200241306a360250200241e0006a200241d0006a106c2002280280012201450d0420002002290360370300200041186a200241e0006a41186a290300370300200041106a200241e0006a41106a290300370300200041086a200241e0006a41086a290300370300200241086a2204200241e0006a412c6a290200370300200241106a2205200241e0006a41346a290200370300200241186a2206200241e0006a413c6a290200370300200241206a2207200241e0006a41c4006a290200370300200241286a2208200241e0006a41cc006a280200360200200220022902840137030020002001360220200020022903003702242000412c6a2004290300370200200041346a20052903003702002000413c6a2006290300370200200041c4006a2007290300370200200041cc006a20082802003602000c010b200041003602200b20031023200241b0016a24000f0b410e4101102a000b412e4101102a000b41d4aac10041331021000bb60709057f047e017f017e037f027e017f017e017f230041c0016b22022400200241a0016a41186a22034200370300200241a0016a41106a22044200370300200241a0016a41086a22054200370300200242003703a0012001410020012802002001280204200241a0016a41202001280208100122062006417f461b2206412020064120491b20012802086a3602080240024002400240024002400240024002400240024002402006411f4d0d0020024180016a41186a200329030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903a00137038001200241c8006a2001104c2002290348a7450d01200241c8006a41106a290300210720022903502108200241306a2001104c2002290330a7450d02200241c0006a29030021092002290338210a200241286a2001104a2002280228450d09200228022c220bad42187e220c422088a70d05200ca72206417f4c0d052006450d0320061026220d450d06200b450d040c070b20004100360220200241c0016a24000f0b20004100360220200241c0016a24000f0b20004100360220200241c0016a24000f0b4108210d200b0d030b4100210f4200210c0c030b101d000b20064108102a000b4200210c200241106a41106a210e410021054100210441002103200b210f02400340200241106a2001104c2002290310a7450d01200e290300211020022903182111200241086a2001104a2002280208450d01200341016a2106200228020c211202402003200f470d002005200620062005491b220fad42187e2213422088a70d052013a722144100480d0502402003450d00200d200420141027220d0d010c070b20141026220d450d060b200d20046a2203201037030820032011370300200341106a2012360200200c4280808080107c210c200541026a2105200441186a2104200621032006200b490d000c020b0b200f450d01200d10230c010b200d450d00200241e0006a41186a220120024180016a41186a290300370300200241e0006a41106a220620024180016a41106a290300370300200241e0006a41086a220320024180016a41086a2903003703002002200229038001370360200041186a20093703002000200a37031020002007370308200020083703002000200c200fad843702242000200d3602202000412c6a2002290360370200200041346a20032903003702002000413c6a2006290300370200200041c4006a2001290300370200200241c0016a24000f0b20004100360220200241c0016a24000f0b101e000b20144108102a000bc10906047f047e017f017e097f037e230041e0016b220224000240024002400240024002400240024002400240410f10262203450d00200341076a4100290097f64037000020034100290090f6403700002003410f412f10272204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a290000370000200241f0006a41186a22014200370300200241f0006a41106a22034200370300200241f0006a41086a22054200370300200242003703702004412f200241f0006a1002200241d0006a41186a2001290300370300200241d0006a41106a2003290300370300200241d0006a41086a2005290300370300200220022903703703500240024002400240200241d0006a412041a886c500410041001001417f460d0020024220370294012002200241d0006a36029001200241386a20024190016a104c2002290338a7450d0b200241386a41106a290300210620022903402107200241206a20024190016a104c2002290320a7450d0b200241306a290300210820022903282109200241186a20024190016a104a2002280218450d0b200228021c220aad42307e220b422088a70d03200ba72201417f4c0d032001450d0120011026220c450d06200a450d020c070b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000c080b4108210c200a0d050b410021104200210b200c450d080c050b101d000b410f4101102a000b412f4101102a000b20014108102a000b200241f0006a41186a210d200241f0006a41106a210e4200210b4100210f4100210541002101200a21100340200d4200370300200e4200370300200241f0006a41086a221142003703002002420037037020024190016a41086a2203200328020022034100200228029001200228029401200241f0006a41202003100122032003417f461b2203412020034120491b6a3602002003411f4d0d03200241c0016a41186a2212200d290300370300200241c0016a41106a2213200e290300370300200241c0016a41086a22142011290300370300200220022903703703c001200220024190016a104c2002290300a7450d03200141016a2103200241106a290300211520022903082116200241a0016a41186a22112012290300370300200241a0016a41106a22122013290300370300200241a0016a41086a22132014290300370300200220022903c0013703a001024020012010470d00200f20032003200f491b2210ad42307e2217422088a70d062017a722144100480d0602402001450d00200c200520141027220c0d010c080b20141026220c450d070b200c20056a2201201537030820012016370300200141286a2011290300370300200141206a2012290300370300200141186a2013290300370300200141106a20022903a001370300200b4280808080107c210b200f41026a210f200541306a2105200321012003200a490d000b200c450d030b200020093703102000200637030820002007370300200041246a200b2010ad843702002000200c360220200041186a20083703000b20041023200241e0016a24000f0b2010450d00200c10230b41d4aac10041331021000b101e000b20144108102a000b8b0401047f230041e0006b2202240002400240410e10262203450d00200341066a4100290094c7403700002003410029008ec7403700002003410e412e10272203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412e200241c0006a1002200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041a886c500410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031023200241e0006a24000f0b41d4aac10041331021000b410e4101102a000b412e4101102a000b130020004114360204200041e8f6c0003602000bf00301087f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a10662002200336023c2002413c6a200241306a10662002280220210320022004280200220436023c2002413c6a200241306a10410240024002402004450d00200441306c2105200241306a41086a21060340024002400240024020022802342207200628020022046b41204f0d00200441206a22082004490d0620074101742209200820082009491b22094100480d062007450d01200228023020072009102722070d020c070b200441206a2108200228023021070c020b200910262207450d050b20022009360234200220073602300b20062008360200200720046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a2900003700002004200341106a2900003700002002200336023c2002413c6a200241306a1066200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a2802003602000240200241246a280200450d00200241206a28020010230b200241c0006a24000f0b101e000b20094101102a000b7001017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a10412002200241086a36022c2002412c6a200241206a1066200041086a200228022836020020002002290320370200200241306a24000b3401017f0240410410262202450d0020004284808080c00037020420002002360200200241c0843d3600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c000370204200020023602002002413c3600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241043600000f0b41044101102a000be8dd013f017f017e037f057e107f017e037f027e037f017e037f077e207f027e027f017e027f017e087f017e067f027e247f027e057f037e017f017e287f027e037f057e117f017e017f017e0b7f027e047f017e027f027e047f017e027f017e177f017e297f027e367f017e037f027e157f027e0c7f027e077f017e087f017e037f230041b00f6b220224004200210320024190086a41086a22044200370300200242003703900841db98c100411c20024190086a1000200241a8066a41086a2205200429030037030020022002290390083703a8060240024002400240024002400240024002400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012206417f460d022006410f4d0d0220024198086a290300210720022903900821080c010b42002108420021070b20044200370300200242003703900841f798c100411820024190086a10002005200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d032004410f4d0d0320024198086a290300210920022903900821030c010b420021090b20024190086a41086a22044200370300200242003703900841f798c100411820024190086a1000200241a8066a41086a2205200429030037030020022002290390083703a8062002200320087c2208370390082002200920077c2008200354ad7c37039808200241a8066a411020024190086a41101004200442003703002002420037039008418f99c100411320024190086a10002005200429030037030020022002290390083703a806410221040240200241a8066a411041a886c500410041001001417f460d00200241003a009008200241a8066a411020024190086a41014100100141016a41014d0d0320022d0090082104200241a8066a411010030b0240200141016a410670450d00200441ff01714102472004710d0020004100360200200241b00f6a24000f0b4200210320024190086a41086a22044200370300200242003703900841f798c100411820024190086a1000200241a8066a41086a200429030037030020022002290390083703a8060240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d042004410f4d0d0420024198086a290300210a200229039008210b200241a8066a4110100342012103200b200a84500d060c070b420042008450450d060c040b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b410121040c020b410121040c010b024002402003a7450d0020024190086a41086a22044200370300200242003703900841a299c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a8064100210c02400240024002400240200241a8066a411041a886c500410041001001417f460d00200242103702a4052002200241a8066a3602a00520024190086a200241a0056a1028200228029008220d450d02200228029408210e20024198086a280200220c41057422040d010c040b4101210d4100210e41004105742204450d020b200d20046a210f4108211020024190086a41086a2111200241a8066a41086a21124120211341122114411021154100211641322117412a2118411821194122211a411a211b4200211c41a886c500211d417f211e4101211f427f212042012121200241b8086a212241302123200241b4086a212442202125200d2126410021270c040b41d4aac10041331021000b410021040c030b410021040c020b410121040c010b410321040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e040001020f0f0b200241a0036a200b200a200cad22084200109804200241a8086a200a37030020024190086a41106a200b37030020024190086a41086a220441003a0000200241043a00900841a886c500410020024190086a102c20044200370300200242003703900841d099c100411120024190086a1000200241a8066a41086a200429030037030020022002290390083703a806200241a8066a411041a886c5004100410010012104200241a0036a41086a290300210320022903a0032107024002402004417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d0c2004410f4d0d0c20024198086a2903002109200229039008212f0c010b4200212f420021090b20024190036a202f20092008420010980402402007200384500d00200229039003220920024190036a41086a290300222d84500d004200210820024190086a41086a22044200370300200242003703900841ecb5c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d0e2004410f4d0d0e20024198086a290300212f20022903900821080c010b4200212f0b200820097d222e200856202f202d7d2008200954ad7d2208202f562008202f511b0d0020024180036a202e20082009202d10970442002108200241d0026a20024180036a41086a2903002209420020074200109804200241e0026a20034200200229038003222f4200109804200241f0026a202f420020074200109804200942005220034200527120022903d8024200527220022903e80242005272200241f0026a41086a290300220320022903d00220022903e0027c7c2207200354720d0020022903f002210920024190086a41086a22044200370300200242003703900841aaedc300410c20024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d102004410f4d0d1020024198086a290300210320022903900821080c010b420021030b20024190086a41086a22044200370300200242003703900841aaedc300410c20024190086a1000200241a8066a41086a200429030037030020022002290390083703a8062002427f200320077c200820097c22092008542204ad7c22072004200720035420072003511b22041b370398082002427f200920041b37039008200241a8066a411020024190086a411010040b200e450d0f200d1023410121040c4c0b20024190086a41086a22044200370300200242003703900841e199c100411220024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0320022802900841016a21010c010b410121010b20024190086a41086a22044200370300200242003703900841e199c100411220024190086a1000200241a8066a41086a2230200429030037030020022002290390083703a8062002200136029008200241a8066a411020024190086a4104100420044200370300200242003703900841f399c100411620024190086a10002030200429030037030020022002290390083703a806410021310240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0320022802900821310b20024190086a41086a22044200370300200242003703900841899ac100411d20024190086a1000200241a8066a41086a200429030037030020022002290390083703a806024002400240200241a8066a411041a886c500410041001001417f460d00200241003602900841012132200241a8066a411020024190086a41044100100141016a41044d0d06200228029008220441024f0d010c020b410421040b200421320b200241d0046a41186a22044200370300200241d0046a41106a22014200370300200241d0046a41086a22304200370300200242003703d00441a69ac100411a200241d0046a1002200241a8066a41186a2004290300370300200241a8066a41106a2001290300370300200241a8066a41086a2030290300370300200220022903d0043703a806410021010240200241a8066a412041a886c500410041001001417f460d00200241a0056a41186a4200370300200241a0056a41106a4200370300200241a0056a41086a4200370300200242003703a005200241a8066a4120200241a0056a4120410010012204417f460d052004411f4d0d0520024190086a41186a2204200241a0056a41186a220129030037030020024190086a41106a2230200241a0056a41106a223329030037030020024190086a41086a2205200241a0056a41086a2234290300370300200220022903a0053703900820012004290300370300203320302903003703002034200529030037030020022002290390083703a005410121010b412810262204450d07200420013a0004200441a886c500360200200420022903a005370005200420022f00e8053b00252004410d6a200241a0056a41086a2205290300370000200441156a200241a0056a41106a22342903003700002004411d6a200241a0056a41186a2235290300370000200441276a200241ea056a2d00003a0000200241d0046a41186a22014200370300200241d0046a41106a22304200370300200241d0046a41086a22334200370300200242003703d00441c09ac100411a200241d0046a1002200241a8066a41186a2001290300370300200241a8066a41106a2030290300370300200241a8066a41086a2033290300370300200220022903d0043703a806410021010240200241a8066a412041a886c500410041001001417f460d00203542003703002034420037030020054200370300200242003703a005200241a8066a4120200241a0056a4120410010012201417f460d062001411f4d0d0620024190086a41186a2201200241a0056a41186a223029030037030020024190086a41106a2233200241a0056a41106a220529030037030020024190086a41086a2234200241a0056a41086a2235290300370300200220022903a0053703900820302001290300370300200520332903003703002035203429030037030020022002290390083703a005410121010b412810262233450d08203320013a0004203341a886c500360200203320022903a005370005203320022f00e8053b00252033410d6a200241a0056a41086a290300370000203341156a200241a0056a41106a2903003700002033411d6a200241a0056a41186a290300370000203341276a200241e8056a41026a2d00003a0000200242003702e407200241f098c4003602e0072002410036028008200242083703f80720024190076a411c6a200241e0076a36020020024190076a41186a20024188086a360200200241003602a007200241dc9ac1003602940720022004360290072002200241f8076a3602a407200220024188086a36029c07200220024188086a3602980720024190086a20024190076a1076024002400240024020022d00d00822014102470d00200241023a00e8060c010b200241e8056a41386a223020024190086a41386a290300370300200241e8056a41306a220520024190086a41306a290300370300200241e8056a41286a223420024190086a41286a290300370300200241e8056a41206a223520024190086a41206a290300370300200241e8056a41186a220620024190086a41186a290300370300200241e8056a41106a223620024190086a41106a290300370300200241e8056a41086a222720024190086a41086a290300370300200241f0066a41086a2237200241d9086a2228290000370300200241ff066a2238200241e0086a29000037000020022002290390083703e805200220022900d1083703f00620024190076a41106a4101360200200241cc086a2030290300370200200241c4086a2005290300370200200241bc086a2034290300370200200241b4086a203529030037020020024190086a411c6a200629030037020020024190086a41146a20362903003702002002419c086a2027290300370200200220022903e80537029408200241a0056a20024190086a41c4001094041a200241003602900820024190086a410472200241a0056a41c4001094041a20024190086a41c8006a20013a0000202820022903f006370000200241e1086a2037290300370000200241e8086a2038290000370000200241a8066a20024190076a41146a20024190086a107720022d00e8064102470d010b2004102341082136410021374108213441082130410021350c010b20024190086a2004107841c80010262236450d0c2036200241a8066a41c8001094041a200241b0076a41186a20024190076a41186a290300370300200241b0076a41106a223920024190076a41106a290300370300200241b0076a41086a20024190076a41086a29030037030020022002290390073703b00720024190086a200241b0076a1076024002400240024020022d00d00822274102470d0041012135410121370c010b20024190086a41046a2104200241d9086a210520024190086a410472213a200241c4076a213b200241d1086a21342039280200213c200241a8066a41c0006a213d4102213541c800213041002101410121370340200241e8056a41386a220620024190086a41386a290300370300200241e8056a41306a222820024190086a41306a290300370300200241e8056a41286a223820024190086a41286a290300370300200241e8056a41206a223e20024190086a41206a290300370300200241e8056a41186a223f20024190086a41186a290300370300200241e8056a41106a224020024190086a41106a290300370300200241e8056a41086a224120024190086a41086a290300370300200241f0066a41086a2242203441086a290000370300200241f0066a410f6a22432034410f6a29000037000020022002290390083703e805200220342900003703f0062039203c20016a224441016a360200200441386a2006290300370200200441306a2028290300370200200441286a2038290300370200200441206a203e290300370200200441186a203f290300370200200441106a2040290300370200200441086a2041290300370200200420022903e805370200200241a0056a20024190086a41c4001094041a2002204436029008203a200241a0056a41c4001094041a20024190086a41c8006a20273a0000200520022903f006370000200541086a20422903003700002005410f6a2043290000370000200241a8066a203b20024190086a1077203d2d00004102460d0220024190086a200241a8066a41c8001094041a0240200141016a22062037470d00200241a0056a20022802b00720022802b407280210110000200641016a22272006490d362035202720272035491b2237ad42c8007e2203422088a70d362003a722274100480d3602402001417f460d00203620302027102722360d010c0d0b202710262236450d0c0b203620306a20024190086a41c8001094041a203541026a2135203041c8006a213020024190086a200241b0076a10762006210120024190086a41c0006a2d000022274102470d000b200641016a21350b20362134200241e8066a41023a00000c010b200141016a2135203621340b20022802b007220120022802b407220428020011010002402004280204450d00200110230b203421300b200241a8066a2033107920022802c806223e450d2441012145200241a0056a410172214641282147200241a8066a41286a214841242149200241a8066a41246a214a4118214b4110214c4108214d4120214e20024190086a41206a214f42c800215042202151417f21524105215342d00021544100215541d00021564200215741342158413c215941c400215a4102215b419403215c4160215d41e802215e41c800215f427f2160412c2161410121270c110b024020a101450d0020a1012092016a21a10120a201207e6a210420a20120756a227121a20120042d00000d0f20712092016a21a201207120a001470d1a0c190b209901219f010c240b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20274108102a000b41284104102a000b41284104102a000b41d4aac10041331021000b41d4aac10041331021000b41c8004108102a000b41d4aac10041331021000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020270e09000102030405060708080b20262206450d1b201410262204450d0f200420156a20162f00bec7403b0000200420106a20162900b6c740370000200420162900aec74037000020042014201710272204450d1020042006290000370012200420186a200620196a2900003700002004201a6a200620156a2900003700002004201b6a200620106a290000370000200241d0046a20196a2201201c370300200241d0046a20156a2205201c370300200241d0046a20106a2228201c3703002002201c3703d00420042017200241d0046a1002200241a0056a20196a2001290300370300200241a0056a20156a2005290300370300200241a0056a20106a2028290300370300200220022903d0043703a00502400240200241a0056a2013201d201620161001201e460d0020022025370294082002200241a0056a36029008200241b8046a20024190086a104a20022802b804450d10200241a0046a20024190086a104c20022903a004a7450d10200241a0046a20156a290300210320022903a80421070c010b42002107420021030b200410230240024002400240200b2007200b2007200b542003200a542003200a511b22041b22297d222a200a2003200a20041b222b7d200b202954ad7d222c84500d0020024190086a2006106d42002109201129030022034200200229039008220720215620034200522003501b22041b212d2007202120041b212e20024190086a20136a280200212820222802002204450d01202e202d84500d192028200420236c6a210142002109420021082028210402400340200241f8036a2004290300200420106a290300202a202c109804200241e8036a20022903f803200241f8036a20106a290300202e202d10970420024188046a200420156a220420022903e803200241e8036a20106a290300107a20022903880421032002290390042107200241a8066a20156a20024188046a20156a290300222f37030020122007370300200220033703a80602402003a7201f470d0020202008202f7c200920077c22072009542205ad7c22032005200320085420032008511b22051b21082020200720051b2109200420136a22042001470d010c020b024020032021520d00200220123602a005200241a0056a107b0b200420136a22042001470d000b0b202e202d84201c520d020c160b420021094200210842002103420021070c020b42002108202e202d84201c510d140b200241d8036a20024190086a20156a29030020024190086a20196a290300202a202c109804200241c8036a20022903d803200241d8036a20106a290300202e202d109704200241c8036a20106a290300210720022903c80321032024280200450d00202810230b200620136a2126200241b0036a2006200320297c222f2007202b7c202f200354ad7c107a20022903b003210320022903b803210720024190086a20156a200241b0036a20156a290300222f370300201120073703002002200337039008024002402003a7201f470d0020202008202f7c200920077c22072009542204ad7c22032004200320085420032008511b22041b21082020200720041b21090c010b20032021520d00200220113602a806200241a8066a107b0b20022008370398082002200937039008200220024190086a3602a806200241a8066a107b2026200f470d16410021040c590b20482802002162204a2802002163200241b0076a204b6a2264200241a8066a204b6a290300370300200241b0076a204c6a2265200241a8066a204c6a290300370300200241b0076a204d6a2266200241a8066a204d6a290300370300200220022903a8063703b007200241a0056a200241b0076a106e02400240024020022d00a0052045470d00200241e8056a204b6a2046204b6a290000370300200241e8056a204c6a2046204c6a290000370300200241e8056a204d6a2046204d6a290000370300200220462900003703e80520024190086a200241e8056a106b204f2802002204450d0120024190086a204d6a2903002167200229039008216820024190086a20496a280200450d02200410230c020b204f20553602000b42002168420021670b2062ad20507e2203205188a70d3e2003a7220420524c0d3e0240024002402004450d00200410262269450d0d20622053742204450d020c010b4108216920622053742204450d010b203e20046a216a4100216b203e216c4100216d0c290b4100216b0c300b02402035450d0020762104034002402030207e6a2d0000450d00203020756a213020042092016a22040d010c020b2030208a016a290300220320980120032098015620302087016a2903002203209501522003501b22011b2207200320950120011b220384209501510d0a200241c0026a209601209601200720031097042030200241c0026a207a6a290300370308203020022903c002370300203020756a213020042092016a22040d000b0b20022802f807229b01207b280200229c01207c6c6a219d01209c01450d24209b01219e014101216d0c280b200220a70120ab016a2d00003a00aa06200220a7012f002c3b01a806200220a70120ac016a29000037039008200220a70120ad016a2900003700950820a7012802282204450d2d20a70128022022ce01200420ae016c6a21cf0120a70120af016a28000021d00120a70120b0016a28000021d10120a70120b1016a28000021d20120a70120b2016a28000021d30120a70120b3016a21d401410021d501410821d601410021d7014103216d0c280b200241d0046a20e2016a224020fb0120e2016a290200370300200241d0046a20e3016a224120fb0120e3016a290200370300200241d0046a20e4016a224220fb0120e4016a290200370300200220fb012902003703d004200241a8066a20fb01106e02400240024020022d00a80620df01470d00200241a0056a20e2016a20e00120e2016a290000370300200241a0056a20e3016a20e00120e3016a290000370300200241a0056a20e4016a20e00120e4016a290000370300200220e0012900003703a00520024190086a200241a0056a106b20e7012802002204450d0120024190086a20e4016a290300212b20022903900821fc0120e801280200450d02200410230c020b20e70120e1013602000b420021fc014200212b0b20fb0120e6016a280200210141082138410021064100213f024020fb01280228220420e9016c222720e901490d002004ad20ea0186220320eb0188a70d3b2003a7220520e101480d3b200510262238450d102004213f0b02402001200120276a460d0041002106203821040340200120ee016a2903002107200120e6016a2903002103200241a8066a20fb01106e02400240024020022d00a80620df01470d00200241a0056a20e2016a20e00120e2016a290000370300200241a0056a20e3016a20e00120e3016a290000370300200241a0056a20e4016a20e00120e4016a290000370300200220e0012900003703a00520024190086a200241a0056a106b20e7012802002205450d0120024190086a20e4016a2903002108200229039008210920e801280200450d02200510230c020b20e70120e1013602000b42002109420021080b200241e0006a200720f00120092008107c220820f001109804200241f0006a200320f001200820f00110980420024190086a20e4016a220520f001370300200220f0013703900820f20120f10120024190086a1000200241d0006a20f00120f001200320f001109804200241a8066a20e4016a200529030037030020022002290390083703a8062002290358212f2002290368212d200229035021092002290360212e200241f0006a20e4016a29030021082002350274212a02400240200241a8066a20e30120f50120e10120e101100120f601460d00200220f00137039808200220f00137039008200241a8066a20e30120024190086a20e30120e1011001222820f601460d08202820f8014d0d08200241c0006a200229039008200529030020f40120f001109704200241c0006a20e4016a290300222c20f0012002290340222920f90156202c20f00152202c501b22051b212c202920f90120051b21290c010b4200212c420121290b200241306a2029202c20f401202a2008202e20097c7c220920eb018684202d202f8420f0015220092008547222051b20f301200920eb018820051b1098042004200337030020042007370308200420ee016a200120e2016a290300370300200420e6016a200120e3016a290300370300200420e2016a200120e4016a290300370300200420e3016a2001290300370300200420ec016a200241306a20e4016a290300370300200420e9016a2002290330370300200420ef016a2104200620df016a2106200120e9016a2101202720f7016a22270d000b0b20fa0120fc0137030020fa01202b37030820fa01203836023020fa0120ec016a200636020020fa0120ed016a203f36020020fa0120ee016a204029030037030020fa0120e6016a204129030037030020fa0120e2016a204229030037030020fa0120022903d00437031020da0120df016a21da0120fa0120ef016a21fa0120fb0120e5016a22fb0120db01470d130c340b200241a8066a20bd02106e02400240024020022d00a806208202470d00200241a0056a2085026a2083022085026a290000370300200241a0056a2086026a2083022086026a290000370300200241a0056a2087026a2083022087026a29000037030020022083022900003703a00520024190086a200241a0056a106b20024190086a2084026a2802002204450d0120024190086a2087026a29030021be0220022903900821bf02208802280200450d02200410230c020b20024190086a2084026a2092023602000b420021bf02420021be020b200241a8066a2085026a22c00220bd022085026a290000370300200241a8066a2086026a22c10220bd022086026a290000370300200241a8066a2087026a22c20220bd022087026a290000370300200220bd022900003703a8060240024020022802c00422c30220fd01460d0020022802c40421c4020c010b208902102622c302450d10410021c40220c30241003b010620c302410036020020c3022087026a20024190086a208a021094041a200241003602c404200220c3023602c0040b20bd022084026a21bd020c200b20fd02450d3420fd022802382204450d2920fd0228023022fe02200420e602746a21ff0220fd0220e9026a2180034106216d0c270b208803208e036a220429030021032088032903002107200241a8066a208f036a2238208903208f036a290000370300200241a8066a208c036a2240208903208c036a290000370300200241a8066a208e036a2241208903208e036a29000037030020022089032900003703a8062088032802282227ad2091037e220820920388a70d382008a722012090034c0d38208803208f036a290300210820042903002109208803290310212f208803290300212d208803280220210402400240024002402001450d00200110262228450d0e2027450d020c010b410821282027450d010b200420272093036c6a2106410021052028210103402001200429030037030020012004208e036a29030037030820012094036a20042094036a2903003703002001208b036a2004208b036a2903003703002001208f036a2004208f036a2903003703002001208c036a2004208c036a29030037030020012093036a2101200520a1036a210520042093036a22042006470d000c020b0b410021050b20024190086a208f036a2008370300208d03202f3703002095032005360200209603202736020020970320283602002002202d37039008200220093703980820980310262204450d0520042099036a209a03290097f6403700002004209a03290090f6403700002004209803209b031027223f450d06203f20022903a80637000f203f209c036a2038290300370000203f209d036a2040290300370000203f209e036a2041290300370000200241d0046a208f036a2204209f03370300200241d0046a208c036a2201209f03370300200241d0046a208e036a2205209f033703002002209f033703d004203f209b03200241d0046a1002200241a0056a208f036a2004290300370300200241a0056a208c036a2001290300370300200241a0056a208e036a2005290300370300200220022903d0043703a005200241e8056a208e036a2206209a03360200200220a0033703e805200220024190086a3602b007200241b0076a200241e8056a10662002208d033602b007200241b0076a200241e8056a10662097032802002104200220950328020022013602b007200241b0076a200241e8056a104102402001450d0020012093036c21270340024002400240024020022802ec052205200628020022016b208b034f0d002001208b036a22282001490d3d200520a103742238202820282038491b2228209a03480d3d2005450d0120022802e80520052028102722050d020c080b20022802e80521050c020b202810262205450d060b200220283602ec05200220053602e8050b20062001208b036a360200200520016a2201208e036a2004208f036a2900003700002001208c036a2004208b036a2900003700002001208f036a20042094036a29000037000020012004208c036a290000370000200220043602b007200241b0076a200241e8056a106620042093036a2104202720a6036a22270d000b0b200720dc01542104200320de01512101200320de0154210520022802ec052127200241a0056a208b0320022802e80522282006280200100402402027450d00202810230b2004200520011b21042087032090036a218703203f10230240209603280200450d0020970328020010230b200320de0120041b21de01200720dc0120041b21dc01208703450d340240208a032085032f01064f0d00208503208a032093036c6a20a2036a218803208503208a0320a303746a208e036a218903208a0320a1036a218a03410721270c1b0b4101210102402085032f0104220520850328020022042f0106490d00410121010340200120a1036a210120042f01042205200428020022042f01064f0d000b0b200420052093036c6a20a2036a2188032004200520a303746a208e036a2189032004200520a403746a20a5036a2802002185034100218a03200120a103460d1120a10320016b210403402085032802f806218503200420a1036a22040d000c130b0b0240024020b40320aa032f01064f0d0020aa0320b40320ae036c6a220420af036a280200210620b40320ad036a21b403200420b0036a2802002201450d360c010b0240024020aa032802002204450d0020aa0333010420b1038620ab03ad842103410121050c010b20ab03ad2103410021050b20aa0310232003a721ab030240200320b10388a7220620042f0106490d0003400240024020042802002201450d00200520ad036a2105200433010420b1038620ab03ad8421030c010b20ab03ad21030b200410232003a721ab0320012104200320b10388a7220620012f01064f0d000b0b2004200620b203746a20b3036a28020021aa032004200620ae036c6a220420af036a2802002106200420b0036a28020021010240200520ad03460d0020ad0320056b2104034020aa032802f80621aa03200420ad036a22040d000b0b410021b4032001450d350b20a90320ac036a21a90302402006450d00200110230b20a9030d120c340b41d4aac10041331021000b20284101102a000b41f8fec400104f000b20044108102a000b410f4101102a000b412f4101102a000b41d4aac10041331021000b41124101102a000b41324101102a000b20014108102a000b41b899c100104f000b20054108102a000b41f8064108102a000b41b899c100104f000b410021270c070b410421270c080b410721270c090b410721270c090b410821270c090b410021040c3d0b410121040c3c0b410221040c3b0b410321040c3a0b410321040c390b410321040c380b410321040c370b410321040c360b410321040c350b410321040c340b4104216d0c060b410021040c070b410221040c060b410121040c050b410321040c040b410321040c030b410321040c020b410321040c010b410321040b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0400010204040b20990120796a219f012034203520756c6a21a001207621a101203421710240024002400340207121a20120a00120716b207d4d0d0620a201207e6a2d0000450d0120a201207f6a2d0000450d0220a2012081016a2d0000450d0320a1012083016a21a10120a2012084016a217120a2012085016a2d00000d000b20a201410320756c6a21a201207120a001470d2e0c2d0b20a20120756a227120a001470d290c280b20a2012080016a217120a201410120756c6a21a201207120a001470d2a0c290b20a2012082016a217120a201410220756c6a21a201207120a001460d2c410121040c390b20a201207a6a290300210320a20129030021070340207120756a210402402071207e6a2d0000450d002004217120772004470d010c2e0b2071207a6a2903002208200320712903002209200754200820035420082003511b22011b21032009200720011b2107207120a20120011b21a2012004217120772004470d000b410221040c380b20a20120793a0040209c01450d0220a2012090016a21a30120a2012091016a21a4014102216d0c2d0b410221040c610b024002400240206d0e070001020405060a0a0b206c226e204e6a216c200241e0076a216f20022802e40721700c340b0240209e012802282204450d00200420756c2105209e012802202091016a210403402035200428020022014d0d0b02402034200120756c6a22012d00400d002001290310220320012087016a290300220784500d0020024180026a209e01207a6a290300209501209401209501109804200241b0026a209e012903002208209501209401209501109804200241f0016a2095012095012008209501109804200241a0026a20960120022903b00220022903880220022903f8018420950152200241b0026a207a6a290300220820022903800220022903f0017c7c22092008547222061b209601200920061b2003200710970420024190026a209e012097016a350200209e012087016a2903002203208e0186842003208e018820022903a002200241a0026a207a6a2903001098042001207a6a22062096012006290300220320024190026a207a6a2903007c200129030022072002290390027c22082007542206ad7c22072006200720035420072003511b22061b3703002001209601200820061b3703000b200420756a210420052092016a22050d000b0b209e01207c6a229e01209d01470d1e410021040c360b209b01207c6a21380240209b012802282201450d00209b012802202104200120756c21010340024020a3012004460d0020042093016a20a401209101109604450d00200420756a210420012092016a22010d010c020b209b012087016a2205290300210320a201207a6a22062903002107200420a2012903002208209b01208a016a222829030022097d3703002004200720037d2008200954ad7d37030820a20129030021032005200629030037030020282003370300200420756a210420012092016a22010d000b0b2038219b012038209d01470d1e0b20880120a2012086016a290000370300208b0120a2012089016a29000037030020024190086a207a6a220120a201208c016a290000370300200220a201290020370390080240209a01209901470d002099012079742204209f01209f012004491b229a01ad208d01862203208e0188a70d452003a722042078480d450240209901450d002073209901208f01742004102722730d010c0f0b200410262273450d0e0b2073209901208f01746a220420022903900837000020042087016a2088012903003700002004208a016a208b012903003700002004207a6a200129030037000020342130209f01219901209f012072490d100c390b20ce01220620b4016a2101200620ae016a21ce01207321040240024002400240024002400240034020a90120046b20b5014d0d0120042001460d022004200120b601109604450d020240200420b6016a22052001460d002005200120b601109604450d00200420b7016a22052001460d002005200120b601109604450d00200420b8016a22052001460d00200420b9016a21042005200120b6011096040d010b0b20d4012005460d030c020b200420a901460d02034020012004460d012004200120b601109604450d0120a901200420b6016a2204470d000c030b0b20d40120042205460d010b200520d40120b601109604450d00024020a70120bb016a2903002208200629030022038520a70120ba016a2903002207200620a5016a2903002209858450450d004200210342808080801021070c030b200241d0016a200920c70120c60120c701109804200241e0016a200320c70120c60120c701109804200241c0016a20c70120c701200320c70110980420022903d80120022903c8018420c70152200241e0016a20a5016a290300222f20022903d00120022903c0017c7c222d202f5472450d01200820c20188200720c20186842208200720c20188220784500d0c200241a0016a2003200920082007109704200241a0016a20a5016a290300210320022903a00121070c020b20ce0120cf01470d200c020b200820c801200820c80156200720c701522007501b22041b2203200720c70120041b220784500d0b200241b0016a20022903e001202d20032007109704200241b0016a20a5016a290300210320022903b00121070b20062007370310200620ba016a20033703002002200620bc016a2d00003a008205200220062f00243b0180052002200620b0016a2900003703f0042002200620bd016a2900003700f504200620b1016a2800002101200620b2016a2800002105200620be016a2800002128200620bf016a2800002106024020d50120d701470d0020d50120c0016a220420d501490d4520d50120c001742238200420042038491b2204ad20c1017e220820c20188a70d452008a7223820aa01480d450240024020d501450d0020d60120d50120c3016c2038102722d6010d010c0b0b2038102622d601450d0a0b200421d5010b20022d008205213820022f018005213f20d60120d70120c3016c6a2204200136000f2004200536000b20042028360007200420063600032004203f3b0100200420c4016a20383a000020042007370320200420c5016a2003370300200420ba016a20022900f504370000200420022903f00437001320d70120c0016a21d70120ce0120cf01470d1f0b02400240024020d701450d0020d70120c3016c2201450d0120d60120b6016a210442002103420021070340200420a5016a29030020077c2004290300220720037c2203200754ad7c2107200420c3016a2104200120cc016a22010d000c030b0b20d501450d3720d60110230c370b42002103420021070b20024190016a20c70120c60120037d2208200820c6015620c70120077d200320c60156ad7d220320c701522003501b22041b222d20c701200320041b220320d701ad222e20c70110970420022903900121090240202d202e5420aa012003501b0d0020024190016a20a5016a290300212f20d60120b6016a210420d70121010340200420a5016a220520ca0120052903002203202f7c2004290300220720097c22082007542205ad7c22072005200720035420072003511b22051b370300200420ca01200820051b370300200420c3016a2104200120cb016a22010d000b0b20024180016a20092003202e20031098040240202d2002290380017da72206450d0041002104034020d601200420d7017020c3016c6a220120c5016a220520ca01200529030022082001290320220320c8017c22072003542205ad7c220920052009200854200720035a1b22051b370300200120ca01200720051b370320200420c0016a22042006490d000b0b200220022d00aa063a009e05200220022f01a8063b019c05200220022903900837038805200220022900950837008d050240207220cd01470d00207220c0016a22042072490d44207220c001742201200420042001491b2204ad20c9017e220320c20188a70d442003a7220120aa01480d44024002402072450d002074207220b3016c2001102722740d010c0d0b200110262274450d0c0b200421720b20022d009e05210120022f019c052105207420cd0120b3016c6a220420d00136000f200420d10136000b200420d201360007200420d301360003200420053b0100200420c4016a20013a0000200420ba016a200229008d053700002004200229038805370013200420d701360228200420d501360224200420d60136022020cd0120c0016a21cd0120a70120a6016a22a70120a801470d100c390b20c3022087026a210520c302208b026a213820c3022f0106222820fe01742101417f21040240024002400240024003402001450d0120042082026a210420ab02208202200241a8066a20052084021096042206209202481b20920220061b2206450d04200120bb026a210120052084026a21052006208202460d000b20c4020d010c020b2028210420c402450d010b20c40220ab026a21c40220c302200420a502746a2089026a28020021c3024104216d0c2f0b20024190076a2085026a220120c00229030037030020024190076a2086026a220520c10229030037030020024190076a2087026a220620c202290300370300200220022903a80637039007200241c0046a2087026a222820282802002082026a360200200241e8056a2085026a22c5022001290300370300200241e8056a2086026a22c6022005290300370300200241e8056a2087026a22c702200629030037030020022002290390073703e80520382f01002205208c024f0d0120c302200420fe01746a2201208d026a20012087026a2206200520046b20fe01741095041a20012084026a20c50229030037000020012085026a20c60229030037000020012086026a20c702290300370000200620022903e80537000020c3022004208e026c6a22012090026a2001208f026a220620c302208b026a22052f010020046b208e026c1095041a20012091026a20920236020020012093026a20940237030020012095026a20be0237030020012096026a20bf0237030020012097026a20be02370300200620bf02370300200520052f01002082026a3b010020bd0220ff01470d150c3f0b20c3022004208e026c6a22042095026a20be0237030020042096026a20bf0237030020042097026a20be023703002004208f026a20bf0237030020042091026a209202360200200420bc026a280200210520042093026a22012802002104200120940237030002402004450d002005450d00200410230b20bd0220ff01470d110c3e0b20890210262205450d0c20052092023b0106200520920236020020052087026a20024190086a208a02109404210620024190086a208d026a22c80220c3022098026a29030037030020024190086a2084026a22c90220c3022099026a29030037030020024190086a2085026a22ca0220c302209a026a29030037030020024190086a2086026a22cb0220c302209b026a29030037030020024190086a2087026a22cc0220c302209c026a290300370300200241f0066a2085026a22cd0220c302209d026a290000370300200241f0066a2086026a22ce0220c302209e026a290000370300200241f0066a2087026a22cf0220c302209f026a290000370300200220c3022903880537039008200220c3022900c8013703f006200620c30220a0026a20c302208b026a22282f010020a1026a220120fe017410940421062005208f026a20c30220a2026a2001208e026c109404213f2028208b023b0100200520013b0106200220022d00f2063a009e05200220022f01f0063b019c05200220810229000037038805200220810220fe016a22d00229000037008d05200241f0066a208c026a22d10228000021d20220a40228000021d30220022800f30621d40220022800f70621d502200241a8066a208d026a22d60220c802290300370300200241a8066a2084026a22d70220c90229030037030020c00220ca0229030037030020c10220cb0229030037030020c20220cc0229030037030020022002290390083703a806024002402004208b024b0d0020c3022087026a200420fe01746a22012084026a200120382f010020046b20fe01741095041a20012085026a20c50229030037000020012086026a20c60229030037000020012087026a20c702290300370000200120022903e80537000020c302208f026a2004208e026c6a2201208e026a200120382f010020046b208e026c1095041a20012085026a20be02370300200120bf02370310200120be02370308200120bf023703002001208d026a20920236020020012094023703200c010b2006200420fe01746a20ba026a2006200420a1026a222820fe01746a2206200120a9027120286b20fe01741095041a20062085026a20c50229030037000020062086026a20c60229030037000020062087026a20c702290300370000200620022903e805370000203f2004208e026c6a220420b2026a200420b1026a22012005208b026a22382f010020286b208e026c1095041a200420b5026a20be02370300200420b6026a20bf02370300200420b7026a20be02370300200120bf02370300200420b3026a209202360200200420b4026a2094023703000b203820382f01002082026a3b010020a60220022d009e053a0000200241a0056a2087026a22d80220c202290300370300200241a0056a2086026a22d90220c102290300370300200241a0056a2085026a22da0220c002290300370300200241a0056a2084026a22db0220d702290300370300200241a0056a208d026a22dc0220d602290300370300200220022f019c053b01f80720022002290388053703d0042002200229008d053700d504200220022903a8063703a005200241b0076a208d026a22dd0220dc02290300370300200241b0076a2084026a22de0220db02290300370300200241b0076a2085026a22df0220da02290300370300200241b0076a2086026a22e00220d902290300370300200241b0076a2087026a22e10220d802290300370300200220022903a0053703b007200220a6022d00003a008205200220022f01f8073b018005200220022903d0043703f004200220022900d5043700f50420c30228020022e202450d0120c3022f010421e302410021e402200521e5020c1e0b20024188086a20a5026a224120022d0082053a0000200220022f0180053b018808200220022903f0043703f807200220022900f5043700fd0720dc0220dd0229030037030020db0220de0229030037030020da0220df0229030037030020d90220e00229030037030020d80220e102290300370300200220022903b0073703a00520e30220a90271212820e2022f0106220420aa024d0d0220a70210262206450d0920062092023b0106200620920236020020062087026a20024190086a20a802109404210120cd0220e202209d026a29000037030020ce0220e202209e026a29000037030020cf0220e202209f026a290000370300200220e2022900c8013703f00620c80220e2022098026a29030037030020c90220e2022099026a29030037030020ca0220e202209a026a29030037030020cb0220e202209b026a29030037030020cc0220e202209c026a290300370300200220e2022903880537039008200120e20220a0026a20e202208b026a223f2f0100220520a1026a220420fe017410940421422006208f026a20e20220a2026a2004208e026c109404214420062089026a20e20220ae026a200520af026a223820a502741094042140203f208b023b0100200620043b010602402038450d00410021042040210103402001280200220520043b010420052006360200200120ad026a2101203820042082026a2204470d000b0b20d60220c80229030037030020d70220c90229030037030020c00220ca0229030037030020c10220cb0229030037030020c20220cc0229030037030020022002290390083703a806200220022f01f0063b019c05200220022d00f2063a009e0520d102290000210320022900f3062107200220d00229000037008d05200220810229000037038805200241d0046a208c026a2238200337000020800220022903880537000020800220fe016a2243200229008d05370000200220073700d304200220022d009e053a00d204200220022f019c053b01d00420c80220d60229030037030020c90220d70229030037030020ca0220c00229030037030020cb0220c10229030037030020cc0220c202290300370300200220022903a806370390080240024020e30220a902712201208b024b0d0020e2022087026a220420282082026a220520fe01746a2004202820fe01746a2204203f2f0100224020286b224220fe01741095041a200420d30236000f200420d20236000b200420d502360007200420d402360003200420a5026a20412d00003a0000200420022f0188083b0000200420022903f80737001320042085026a20022900fd0737000020e202208f026a2028208e026c6a2204208e026a20042042208e026c1095041a2004208d026a20dc0229030037030020042084026a20db0229030037030020042085026a20da0229030037030020042086026a20d90229030037030020042087026a20d802290300370300200420022903a005370300203f20402082026a22043b010020e2022089026a2240202820a5027422416a2087026a2040200520a502746a2240200420a9027120056b20a502741095041a204020e5023602002001203f2f010022054f0d0120e20220416a20b0026a210403402004280200220120282082026a22283b0104200120e202360200200420ad026a210420052028470d000c020b0b2042202820af026a220520fe01746a2042202820a1026a220420fe01746a22012006208b026a223f2f010020046b20fe01741095041a20012085026a20022900fd07370000200120d30236000f200120d20236000b200120d502360007200120d402360003200120a5026a20412d00003a0000200120022f0188083b0000200120022903f80737001320442028208e026c6a220120b2026a200120b1026a2241203f2f0100224220046b208e026c1095041a200120b3026a20dc02290300370300200120b4026a20db02290300370300200120b5026a20da02290300370300200120b6026a20d902290300370300200120b7026a20d802290300370300204120022903a005370300203f20422082026a22013b01002040202820a5027422416a20b8026a2040200520a502746a2228200120a9027120056b20a502741095041a202820e5023602002005203f2f010022284b0d00200620416a20b9026a210103402001280200220520042082026a22043b010420052006360200200120ad026a210120282004470d000b0b20e4022082026a2128200241f4076a20a5026a220420022d00d2043a000020c70220cc0229030037030020c60220cb0229030037030020c50220ca02290300370300200241e8056a2084026a220120c902290300370300200241e8056a208d026a220520c802290300370300200220022f01d0043b01f40720022002290390083703e80520022080022900003703e007200220432900003700e507203828000021d202200241d0046a20a3026a28000021d30220022800d30421d40220022800d70421d50220dd02200529030037030020de02200129030037030020df0220c50229030037030020e00220c60229030037030020e10220c702290300370300200220022903e8053703b007200220042d00003a008205200220022f01f4073b018005200220022903e0073703f004200220022900e5073700f504024020e2022802002204450d0020e2022f010421e302200241c0046a1a20e2021a200421e202200621e502202821e4024105216d0c2e0b20e2021a200241c0046a22011a2006210520a702102622040d010c0c0b200241c0046a21012005210520a70210262204450d0b0b200441003b01062004410036020020042087026a20024190086a20a80210940421272004200128020022063602f80620012004360200200120012802042082026a360204200641003b010420062004360200202720042f0106220620fe01746a220120022f0180053b0000200120d30236000f200120d20236000b200120d502360007200120d402360003200120022903f004370013200120a5026a20022d0082053a000020012085026a20022900f50437000020042006208e026c6a22012091026a20dd0229030037030020012093026a20de0229030037030020012095026a20df0229030037030020012096026a20e00229030037030020012097026a20e1022903003703002001208f026a20022903b00737030020042089026a20062082026a220120a502746a2005360200200420013b0106200520013b01042005200436020020c3021a20bd0220ff01470d0f0c3a0b20e2022087026a220120282082026a220520fe01746a2001202820fe01746a2201200420286b220620fe01741095041a200120d30236000f200120d20236000b200120d502360007200120d402360003200120a5026a20412d00003a0000200120022f0188083b0000200120022903f80737001320012085026a20022900fd0737000020e2022028208e026c6a22012090026a2001208f026a22272006208e026c1095041a20012091026a20dc0229030037030020012093026a20db0229030037030020012095026a20da0229030037030020012096026a20d90229030037030020012097026a20d802290300370300202720022903a00537030020e202208b026a220120042082026a22043b010020e2022089026a2206202820a502746a2087026a2006200520a502746a2206200420a9027120056b20a502741095041a200620e5023602000240202820012f010022044f0d0020e50220053b010420e50220e20236020020052004460d00200420ab026a210620e202200520ab026a220420a502746a20ac026a2101034020012802002205200420a5026a3b0104200520e202360200200120ad026a2101200620042082026a2204470d000b0b41001a200241c0046a1a20c3021a20bd0220ff01470d0d0c390b20fe0222810320e9026a21820320810320e8026a21fe02200241c0046a21830320022802c4042184030c2b0b41c8eec300200120351029000b20384108102a000b41d8eec300104f000b41f0eec300104f000b20014104102a000b41a8074108102a000b20044101102a000b41f8064108102a000b41a8074108102a000b410221270c050b410321270c050b410521270c050b410521270c050b410521270c050b410521270c050b410321040c480b410321040c470b410321040c460b410321040c450b410321040c440b410321040c430b4101216d0c0c0b4102216d0c0d0b4103216d0c0d0b4103216d0c0d0b4105216d0c0e0b410221040c120b410121040c110b410221040c100b410121040c0f0b410221040c0e0b410121040c0d0b410221040c0c0b410221040c0b0b410321040c0a0b410321040c090b410321040c080b410321040c070b410321040c060b410321040c050b410321040c040b410321040c030b410021040c010b410121040b0240024002400240024002400240024002400240024003400240024020040e020001010b206f2802002206204d6a210520062f010622382053742101417f2104024002400240024003402001450d01200420456a210420522045206e2005204e10960422282055481b205520281b2228450d042001205d6a21012005204e6a210520282045460d000b20700d010c020b203821042070450d010b207020526a217020062004205b746a205c6a216f410021040c030b206c206a470d080c110b203520062004205b746a205e6a220428020022014d0d0320342001205f6c6a220129031021032001204b6a290300210720682067107c21082035200428020022014d0d0420342001205f6c6a2201204b6a20602007200320087c22082003542205ad7c220920052009200754200820035a1b22051b37030020012060200820051b370310200241f0066a204b6a2201206e204b6a290000370300200241f0066a204c6a2205206e204c6a290000370300200241f0066a204d6a2206206e204d6a2900003703002002206e2900003703f0062004280200212802402062206b470d00206220456a22042062490d1e20622045742238200420042038491b2204ad20507e2203205188a70d1e2003a722382055480d1e024002402062450d0020692062205f6c2038102722690d010c080b203810262269450d070b200421620b2069206b205f6c6a22042057370300200420283602202004204b6a20573703002004204c6a20573703002004204d6a2057370300200420596a2001290300370200200420586a2005290300370200200420616a2006290300370200200420022903f006370224206b20456a216b206c206a470d080c100b208303280200220620ea026a210520062f0106223820eb02742101417f210402400240024003402001450d01200420f1026a210420ec0220f102208203200520ef02109604222820f002481b20f00220281b2228450d03200120f2026a2101200520ef026a2105202820f102460d000b2084030d010c040b20382104208403450d030b20840320ec026a2184032006200420ed02746a20ee026a218303410121040c010b0b200620f4026a200420f3026c6a2204450d00200420ea026a220120f6022001290300220320810320f5026a22012903007c2004290300220720810320f3026a22052903007c22082007542206ad7c22072006200720035420072003511b22061b370300200420f602200820061b37030020024190086a20f7026a20800320f7026a290000220337030020024190086a20e9026a20800320e9026a290000220737030020024190086a20ea026a20800320ea026a290000220837030020022080032900002209370390082001290300212f2005290300212d200241a8066a20ea026a22282008370300200241a8066a20f7026a22382003370300200241a8066a20e9026a223f2007370300200220093703a806200420f9026a2105200420ef026a2106024002400240024020042802282201200420f8026a280200470d00200120f1026a22042001490d1f200120f102742240200420042040491b2240ad20fa027e220320fb0288a70d1f2003a7224120f002480d1f2001450d012006280200200120f3026c2041102722040d020c080b200628020021040c020b204110262204450d060b20062004360200200620fc026a2040360200200528020021010b2004200120f3026c6a2204202f3703082004202d370300200420022903a806370310200420f9026a2038290300370300200420ef026a203f290300370300200420f7026a20282903003703002005200528020020f1026a3602000b20fe0220ff02470d060c0b0b41a889c400200120351029000b41c8eec300200120351029000b20384108102a000b20414108102a000b4100216d0c020b4100216d0c020b4106216d0c020b410321040c020b410321040c010b410321040c000b0b20fd0220e8026a22fd0220e702460d0a41062127410321040c290b20a70120a6016a22a70120a801460d0341032127410321040c280b200241d0046a204b6a22042064290300370300200241d0046a204c6a22012065290300370300200241d0046a204d6a22052066290300370300200220022903b0073703d00420682067107c210320024190076a204b6a2206200429030037030020024190076a204c6a2204200129030037030020024190076a204d6a22012005290300370300200220022903d0043703900702402063450d00203e10230b2069450d0020024190086a204b6a2227200629030037030020024190086a204c6a2206200429030037030020024190086a204d6a222820012903003703002002200229039007370390080240200241f8076a204d6a2205280200220120022802fc07470d00200241a8066a2033107820022802fc072204200528020022386b205220022802a806223e20456a223f203f203e491b223e4f0d002038203e6a223e2038490d0d20042045742238203e203e2038491b223ead20547e2207205188a70d0d2007a722382055480d0d024002402004450d0020022802f807200420566c2038102722040d010c1a0b203810262204450d190b2002203e3602fc07200220043602f8070b20022802f807200120566c6a22042069360220200420022903900837022c200420476a206b360200200420496a20623602002004205737031020042057370308200420033703002004204b6a2057370300200420586a2028290300370200200420596a20062903003702002004205a6a20272903003702002005200120456a360200200241a8066a20331079200241a8066a204e6a280200223e0d1d0b203310230240203520324f0d0002402037450d00203610230b024020024180086a2802002271450d00207141d0006c210420022802f80741206a217103400240207141046a280200450d00207128020010230b207141d0006a2171200441b07f6a22040d000b0b024020022802fc07450d0020022802f80710230b20022802e00720022802e407200241e8076a280200107d0c030b2035203120352031491b2272ad2203421b88a70d0c2003420586a72204417f4c0d0c024002402004450d002004102622730d0120044101102a000b410121730b2003422c7e2203422088a70d0c2003a72204417f4c0d0c0240024002402004450d00200410262274450d1b2072450d020c010b410421742072450d010b41c80021752034203541c8006c22766a217741002178410121794108217a200241f8076a41086a217b41d000217c419f02217d41c000217e418801217f41900121800141d00121810141d80121820141e07d21830141a0022184014198022185014138218601411821870120024190086a41186a21880141302189014110218a0120024190086a41106a218b014128218c014205218d014220218e014105218f01417c219001412021910141b87f21920141242193014280808080102194014200219501427f2196014114219701420121980141002199012072219a01410221270c200b4100219f014100219a010b410821a5010240200241f8076a41086a2802002204450d0041d00021a60120022802f80722a701200441d0006c6a21a8012073209f014105746a21a901410021aa01412e21ab01413f21ac0141c40021ad0141c80021ae01413b21af01413721b001413321b101412f21b201412c21b301412421b40141ff0021b501412021b60141c00021b70141e00021b80141800121b901411821ba01411021bb01412621bc01413c21bd01412b21be01412721bf01410121c001423021c101422021c201413021c301410221c401412821c50142808080801021c601420021c701420121c801422c21c901427f21ca01417f21cb01415021cc01410021cd01410321270c200b410021cd010b02402037450d00203610230b024020024180086a2802002204450d00200441d0006c210120022802f80741206a210403400240200441046a280200450d00200428020010230b200441d0006a2104200141b07f6a22010d000b0b024020022802fc07450d0020022802f80710230b410821d80120022802e00720022802e407200241e0076a41086a280200107d2073450d0020cd01412c6c2204412c6e21d901410021da012004412c490d0120d901ad4206862203422088a70d092003a722014100480d092001102622d801450d192074207420046a22db01470d020c030b420021dc0120024190086a41086a22714200370300200242003703900841d099c100411120024190086a1000200241a8066a41086a207129030037030020022002290390083703a806410021dd0102400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012271417f460d162071410f4d0d1620024198086a29030021de0120022903900821dc010c010b420021de010b0c070b410021d9012074207420046a22db01460d010b410121df01200241a8066a41017221e001410021e101411821e201411021e301410821e401412c21e501412021e60120024190086a41206a21e701200241b4086a21e801413021e901420621ea01422021eb01413821ec01413421ed01412821ee0141c00021ef01420021f001411621f10141ecb5c10021f20142ffffffff0f21f301427f21f40141a886c50021f501417f21f601415021f701410f21f801420121f901410021da0120d80121fa01207421fb01410421270c1c0b200242003702c40441f098c40021fd01200241f098c4003602c004209f01450d00410521fe012073209f014105746a21ff01200241d0046a41136a218002200241f0066a41136a2181024101218202200241a8066a4101722183024120218402411821850241102186024108218702200241b4086a21880241f80621890241f006218a024106218b02410b218c024128218d024130218e0241e802218f024198032190024190032191024100219202418803219302420821940241800321950241f80221960241f00221970241b00521980241a80521990241a005219a02419805219b02419005219c0241e001219d0241d801219e0241d001219f0241e80121a002417921a10241b80521a202410f21a302200241f0066a410f6a21a402410221a502200241f8076a41026a21a60241a80721a70241a00721a80241ffff0321a902410a21aa02417f21ab0241800721ac02410421ad0241940721ae02417a21af0241fc0621b00241b07d21b10241e07d21b20241d87d21b30241d07d21b40241c87d21b50241c07d21b60241b87d21b702416c21b80241e00621b90241c07e21ba02416021bb02418c0321bc02207321bd02410521270c1c0b410621e60220da014106742204450d0020d80120046a21e70241c00021e802411021e902410821ea02410521eb02417f21ec02410221ed0241f80621ee02412021ef02410021f002410121f102416021f202413021f30241e80221f402413821f502427f21f602411821f702412421f802412821f902423021fa02422021fb02410421fc0220d80121fd02410621270c1c0b20024190086a41086a22044200370300200242003703900841a299c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a8064100213a024002400240200241a8066a411041a886c500410041001001417f460d00200242103702a4052002200241a8066a3602a00520024190086a200241a0056a1028200228029008223b450d14200228029408213a20024198086a28020041057422420d010c020b4101213b41004105742242450d010b203b21040340410f10262201450d08200141076a4100290097f64037000020014100290090f6403700002001410f412f10272201450d092001200429000037000f200141276a200441186a223f2900003700002001411f6a200441106a2240290000370000200141176a200441086a2241290000370000200241d0046a41186a22054200370300200241d0046a41106a22064200370300200241d0046a41086a22274200370300200242003703d0042001412f200241d0046a1002200241a0056a41186a22432005290300370300200241a0056a41106a22442006290300370300200241a0056a41086a2285032027290300370300200220022903d0043703a005200241a0056a4120100320011023411210262201450d0a200141106a41002f00a6f54022393b0000200141086a410029009ef540220337000020014100290096f540220737000020014112413210272201450d0b200120042900003700122001412a6a203f290000370000200141226a20402900003700002001411a6a2041290000370000200542003703002006420037030020274200370300200242003703d00420014132200241d0046a1002200241f0066a41186a2005290300370300200241f0066a41106a2006290300370300200241f0066a41086a2027290300370300200220022903d0043703f006410021280240200241f0066a412041a886c500410041001001417f460d002002410036029008200241f0066a412020024190086a41044100100141016a41044d0d082002280290082138200241f0066a41201003410121280b2001102302402038410020281b222841014d0d00411210262201450d0d200141106a20393b0000200141086a20033700002001200737000020014112413210272201450d0e200120042900003700122001412a6a203f290000370000200141226a20402900003700002001411a6a2041290000370000200542003703002006420037030020274200370300200242003703d00420014132200241d0046a100220432005290300370300204420062903003703002085032027290300370300200220022903d0043703a00520022028417f6a36029008200241a0056a412020024190086a41041004200110230b200441206a2104204241606a22420d000b0b0240203a450d00203b10230b20022802c004218503024020022802c4042204450d002004210103402085032802f8062185032001417f6a22010d000b03402004417f6a22040d000b0b4108218603024002400240200241c0046a41086a280200228703450d002085032f0106450d0120850341e8026a21880320850341086a2189034101218a030c020b427f21dc01427f21de010c020b024002402085032f0104228b0320850328020022042f01064f0d00410121010c010b410121010340200141016a210120042f0104228b03200428020022042f01064f0d000b0b2004208b0341306c6a41e8026a2188032004208b034105746a41086a2189032004208b034102746a41fc066a2802002185034100218a0320014101460d00410120016b210403402085032802f806218503200441016a22040d000b0b4110218c0320024190086a41106a218d03427f21dc014108218e034118218f03417f219003423021910342202192034130219303412821940320024190086a41286a219503200241b4086a2196034120218b0320024190086a41206a219703410f21980341072199034100219a03412f219b034127219c03411f219d034117219e034200219f03420121a003410121a10341e80221a203410521a303410221a40341fc0621a503415021a603427f21de010c150b20024190086a2086036a22044200370300200242003703900841d099c100411120024190086a1000200241a8066a2086036a2201200429030037030020022002290390083703a806200220de0137039808200220dc0137039008200241a8066a411020024190086a4110100420044200370300200242003703900841a299c100411620024190086a10002001200429030037030020022002290390083703a806200241003602980820024201370390082002209f013602a005200241a0056a20024190086a104102400240209f01450d00209f014105742128410020024190086a41086a28020022016b2106200228029008213820022802940821272073210403400240202720066a411f4b0d00200141206a22052001490d062027410174223f20052005203f491b22054100480d06024002402027450d00203820272005102722380d010c110b200510262238450d100b200521270b203820016a22052004290000370000200541186a200441186a290000370000200541106a200441106a290000370000200541086a200441086a290000370000200641606a2106200141206a2101200441206a2104202841606a22280d000b20024198086a2001360200200220273602940820022038360290080c010b20024198086a2802002101200228029408212720022802900821380b200241a8066a411020382001100402402027450d00203810230b02400240024002400240209f014105742204450d00200441057522a703ad4205862203422088a70d072003a722014100480d072001102622dd01450d16207320046a2073460d020c010b410121dd01410021a703207320046a2073460d010b209f01410574220541606a410576212720024190086a410172210620dd012104207321010340200241a8066a41186a200141186a290000370300200241a8066a41106a200141106a290000370300200241a8066a41086a200141086a290000370300200220012900003703a80620024190086a200241a8066a106e0240024020022d0090084101470d00200241d0046a41186a200641186a290000370300200241d0046a41106a200641106a290000370300200241d0046a41086a200641086a290000370300200220062900003703d0040c010b200241d0046a41186a4200370300200241d0046a41106a4200370300200241d0046a41086a4200370300200242003703d0040b200141206a2101200420022903d004370000200441186a200241d0046a41186a290300370000200441106a200241d0046a41106a290300370000200441086a200241d0046a41086a290300370000200441206a2104200541606a22050d000b202741016aad42208621a803209a01450d020c010b420021a803209a01450d010b207310230b200241c8046a28020021a90320022802c00421aa03024020022802c4042204450d00034020aa032802f80621aa032004417f6a22040d000b0b20a903450d00410021ab03417f21ac03410121ad03413021ae03418c0321af0341880321b003422021b103410221b20341fc0621b303410021b403410821270c1c0b024020aa0341f098c400460d0020aa03280200217120aa0310232071450d0020712802002104207110232004450d00024020042802002271450d0003402004102320712104207128020022a201217120a2010d000b0b200410230b024020da01450d0020da01410674210420d80141306a217103400240207141046a280200450d00207128020010230b207141c0006a2171200441406a22040d000b0b024020d901450d0020d80110230b20a703ad2103024020cd01450d0020cd01412c6c2104207441206a217103400240207141046a280200450d00207128020010230b2071412c6a2171200441546a22040d000b0b20a80320038421032072450d00207410230b20024190086a41086a22714200370300200242003703900841d49cc100411520024190086a1000200241a8066a41086a207129030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0c20022802900821710c010b413c21710b200241206a20dc0120de01428094ebdc034200109704200241106a200229032022f001200241206a41086a29030022074280ec94a37c427f109804200220f00120072071ad2208420010980420024190086a41086a22714200370300200242003703900841db98c100411c20024190086a1000200241a8066a41086a207129030037030020022002290390083703a8062002200229030022f001200820dc0120022903107c7e428094ebdc038042ffffffff0f837c2207370390082002200241086a290300200720f00154ad7c37039808200241a8066a411020024190086a4110100420002003370204200020dd01360200200241b00f6a24000f0b101e000b101d000b41d4aac10041331021000b410f4101102a000b412f4101102a000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b20054101102a000b41d4aac10041331021000b20384108102a000b41d4aac10041331021000b20044104102a000b41d4aac10041331021000b20014101102a000b20014108102a000b410121270c010b410721270c060b410321040c070b410321040c060b410321040c050b410321040c040b410321040c030b410321040c020b410321040c010b410321040c000b0bae07020b7f077e230041b0026b22022400200241086a2001280200200128020428020c1100000240024020022903084201520d00200241e8016a4101722103200241086a41086a2104200241b8016a2105200241bc016a2106200141046a2107200241fb006a21080340200241f8006a41186a2209200441186a290000370300200241f8006a41106a220a200441106a290000370300200241f8006a41086a220b200441086a29000037030020022004290000370378200241e8016a200241f8006a106e02400240024020022d00e8014101470d0020024190026a41186a200341186a29000037030020024190026a41106a200341106a29000037030020024190026a41086a200341086a290000370300200220032900003703900220024198016a20024190026a106b2005280200220c450d0120024198016a41086a290300210d200229039801210e2006280200450d02200c10230c020b200541003602000b4200210e4200210d0b200241e8016a41186a220c2009290300370300200241e8016a41106a2209200a290300370300200241e8016a41086a220a200b290300370300200220022903783703e80120024198016a41186a220b200c29030037030020024198016a41106a220c200929030037030020024198016a41086a2209200a290300370300200220022903e8013703980102400240200e200d107c220f4200510d0020024190026a41186a200b29030037030020024190026a41106a200c29030037030020024190026a41086a200929030037030020022002290398013703900220022002280078360270200220082800003600734200211041002109200f2111200e2112200d21130c010b410221090b200241d0006a41186a20024190026a41186a290300370300200241d0006a41106a20024190026a41106a290300370300200241d0006a41086a20024190026a41086a2903003703002002200229039002370350200220022802703602482002200228007336004b20094102470d02200241086a2001280200200728020028020c11000020022903084201510d000b0b200041023a0040200241b0026a24000f0b20002011370310200042003703082000420037030020002002290350370320200020093a004020002002280248360041200041186a2010370300200041d0006a2013370300200041c8006a2012370300200041c4006a200228004b360000200041286a200241d8006a290300370300200041306a200241e0006a290300370300200041386a200241d0006a41186a290300370300200241b0026a24000be01f03017f027e397f23004180066b22032400200241d8006a2903002104200241d0006a2903002105200228020021062003410c6a200241046a41cc001094041a200341d8006a2003410c6a41046a41c8001094041a20012802002107200341c0026a41186a220820034190016a290300370300200341c0026a41106a220920034188016a290300370300200341c0026a41086a220a20034180016a290300370300200320032903783703c00202400240024041c80010262202450d002002420037030020022006360220200241186a4200370300200241106a4200370300200241086a42003703002002200341f8006a220b2902003702242002412c6a200b41086a290200370200200241346a200b41106a2902003702002002413c6a200b41186a29020037020020052004107c2104200341e8016a41186a2008290300370300200341e8016a41106a2009290300370300200341e8016a41086a200a290300370300200320032903c0023703e8010240024002400240200741046a28020020072802082208470d00200841016a22092008490d032008410174220a20092009200a491b220aad42d0007e2205422088a70d032005a7220c4100480d032008450d012007280200200841d0006c200c10272209450d020c050b200728020021090c050b200c102622090d030b200c4108102a000b101e000b41c8004108102a000b20072009360200200741046a200a360200200741086a28020021080b2009200841d0006c6a22084200370310200842003703082008200437030020082002360220200820032903e80137022c200841186a4200370300200841246a428180808010370200200841c4006a200341e8016a41186a22022903003702002008413c6a200341e8016a41106a2209290300370200200841346a200341e8016a41086a2208290300370200200741086a2207200728020041016a3602002001280208210d2002200b41186a2900003703002009200b41106a2900003703002008200b41086a2900003703002003200b2900003703e8010240024002400240200d280200220a41f098c400460d00200d280204210e0c010b4194031026220a450d014100210e200a41003b0106200a4100360200200a41086a200341c0026a418c031094041a200d4100360204200d200a3602000b0c010b4194034104102a000b41002102024003400240024002400240024002400240024020020e020001010b200a41086a210b200a41066a2109200a2f010622014105742108417f21020240024002400240024003402008450d01200241016a2102417f4101200341e8016a200b412010960422074100481b410020071b2207450d04200841606a2108200b41206a210b20074101460d000b200e0d010c020b20012102200e450d010b200e417f6a210e200a20024102746a4194036a280200210a410021020c0a0b200341a0016a41186a2207200341e8016a41186a2208290300370300200341a0016a41106a220f200341e8016a41106a220b290300370300200341a0016a41086a2201200341e8016a41086a2210290300370300200320032903e8013703a001200d200d28020841016a36020820082007290300370300200b200f29030037030020102001290300370300200320032903a0013703e80120092f0100220f410b4f0d01200a41086a2207200241016a22014105746a200720024105746a2207200f20026b4105741095041a200741186a2008290300370000200741106a200b290300370000200741086a2010290300370000200720032903e801370000200a41e8026a220820014102746a200820024102746a220b200a41066a22082f010020026b4102741095041a200b2006360200200820082f010041016a3b01000c0a0b200a20024102746a41e8026a20063602000c090b41940310262211450d04201141003b010620114100360200201141086a200341c0026a418c03109404210b2003200a41e0016a2900003700ad022003200a2900db013703a8022003200a41ca016a2d00003a00be022003200a2f00c8013b01bc02200a41cb016a2800002112200a41cf016a2800002113200a41d3016a2800002114200a41d7016a2800002115200a280280032116200b200a41e8016a200a41066a22102f010041796a2208410574109404210b201141e8026a200a4184036a20084102741094042107201041063b0100201120083b0106200320032d00be023a00a602200320032f01bc023b01a402200320032903a80237039002200320032900ad023700950202400240200241064b0d00200a41086a2208200241016a220b4105746a200820024105746a220820092f010020026b4105741095041a200841186a200341e8016a41186a290300370000200841106a200341e8016a41106a290300370000200841086a200341e8016a41086a290300370000200820032903e801370000200a41e8026a2208200b4102746a200820024102746a220820092f010020026b4102741095041a0c010b200b2002417a6a220f4105746a200b200241796a22104105746a2202200841ffff037120106b4105741095041a200241186a200341e8016a41186a290300370000200241106a200341e8016a41106a290300370000200241086a200341e8016a41086a290300370000200220032903e8013700002007200f4102746a200720104102746a2208201141066a22092f010020106b4102741095041a0b2008200636020041012110200920092f010041016a3b0100410221172003418c026a41026a221820032d00a6023a0000200320032f01a4023b018c0220032003290390023703d80120032003290095023700dd01200341d4016a41026a221920182d00003a0000200320032900dd013700c501200320032903d8013703c001200320032f018c023b01d401200a280200221a450d01200a2f0104211b41ffff03211c410a211d41c403211e4100211f4108212041bc03212141ca01212241db01212341e001212441cb01212541cf01212641d301212741d7012128418003212941e801212a4106212b4179212c4105212d418403212e41e802212f41b00321304194032131417a21324118213341980321344104210f416c213541fc0221360c060b201820192d00003a0000200320032f01d4013b018c02200320032903c0013703e801200320032900c5013700ed01201b201c712101201a2f01062202201d4d0d01201e10262207450d022007201f3b01062007201f360200200720206a200341c0026a202110940421082003201a20226a2d00003a00be022003201a2f00c8013b01bc022003201a20236a2900003703a8022003201a20246a2900003700ad02201a20256a2800002137201a20266a280000213a201a20276a2800002139201a20286a2800002138201a20296a280200213b2008201a202a6a201a202b6a220c2f0100220b202c6a2202202d74109404213c2007202f6a201a202e6a2002201774109404213d200720316a201a20306a200b20326a2209201774109404213e200c202b3b0100200720023b010602402009450d0041002102203e210803402008280200220b20023b0104200b20073602002008200f6a21082009200220106a2202470d000b0b200320032d00be023a00a602200320032f01bc023b01a402200320032903a80237039002200320032900ad0237009502200341d8016a20176a220920032d00a6023a0000200320032f01a4023b01d80120032003290390023703c00220032003290095023700c50202400240201b201c712208202b4b0d00201a20206a2202200120106a221b202d746a20022001202d746a2202200c2f010020016b202d741095041a200220336a20032900ed013700002002201536000f2002201436000b2002201336000720022012360003200220176a20182d00003a0000200220032f018c023b0000200220032903e801370013201a202f6a220b201b20177422136a200b200120177422026a220b200c2f0100221420016b2017741095041a200b2016360200200c201420106a220b3b0100201a20316a220c20026a20206a200c20136a220c200b201c71220b201b6b2017741095041a200c20113602002008200b4f0d01201a20026a20346a2102034020022802002208200120106a22013b01042008201a3602002002200f6a2102200b2001470d000c020b0b203c200120326a220b202d746a203c2001202c6a2202202d746a22082007202b6a221b2f010020026b202d741095041a200820336a20032900ed013700002008201536000f2008201436000b2008201336000720082012360003200820176a20182d00003a0000200820032f018c023b0000200820032903e801370013203d200b20177422086a203d20022017746a220c201b2f0100221320026b2017741095041a200c2016360200201b201320106a220c3b0100203e2001201774221b6a20356a203e20086a2208200c201c712201200b6b2017741095041a20082011360200200b20014b0d002007201b6a20366a210803402008280200220b200220106a22023b0104200b20073602002008200f6a210820012002470d000b0b201920092d00003a0000200320032f01d8013b01d401200320032903c0023703c001200320032900c5023700c5010240201a2802002202450d00201a2f0104211b203721122038211520392114203a21132002211a203b211620072111410121020c070b203721122038211520392114203a211320072111203b21160b41c40310262202450d03200241003b010620024100360200200241086a200341c0026a41bc0310940421102002200d280200220836029403200d2002360200200d200d28020441016a360204200841003b010420082002360200201020022f0106220b4105746a220820032903c001370013200820032f01d4013b00002008201536000f2008201436000b2008201336000720082012360003200841186a20032900c501370000200841026a200341d4016a41026a2d00003a00002002200b4102746a41e8026a201636020020024194036a200b41016a22084102746a2011360200200220083b0106201120083b0104201120023602000c060b201a41086a2208200141016a220b4105746a200820014105746a2208200220016b4105741095041a200841186a20032900ed013700002008201536000f2008201436000b2008201336000720082012360003200841026a2003418c026a41026a2d00003a0000200820032f018c023b0000200820032903e801370013201a41e8026a2202200b41027422086a2002200141027422106a2202201a41066a22072f0100220f20016b4102741095041a200220163602002007200f41016a22023b0100201a4194036a220720106a41086a200720086a2208200241ffff03712210200b6b4102741095041a20082011360200201b41ffff037120104f0d05201a200b417f6a22024102746a4198036a210803402008280200220b200241016a22023b0104200b201a360200200841046a210820102002470d000c060b0b41c4034104102a000b4194034104102a000b41c4034104102a000b410121020c000b0b2000200341d8006a41c8001094041a20034180066a24000b0900200042003702000bc70703037f047e047f230022022103200241a0026b416071220224002001411c6a22042902002105200420022903d801370200200141146a22042902002106200420022903d0013702002001410c6a22042902002107200420022903c801370200200241003a00c00120012902042108200120022903c00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241c0016a41176a22042002290038370000200241c0016a41106a220a2002290031370300200241c0016a41086a220b2002290029370300200220022900213703c001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903c001370300411210262204450d01200441106a41002f00acc7403b0000200441086a41002900a4c7403700002004410029009cc74037000020044112413210272204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241c0016a41186a220a4200370300200241c0016a41106a220b4200370300200241c0016a41086a220c4200370300200242003703c00120044132200241c0016a100220024190016a41186a200a29030037030020024190016a41106a200b29030037030020024190016a41086a200c290300370300200220022903c0013703900120024190016a412041a886c500410041001001417f460d03200242203702b401200220024190016a3602b001200241c0016a200241b0016a10880120022d00cc014102460d0420024180016a41086a220a200241c0016a41086a280200360200200220022903c00137038001200241206a200241cd016a41c3001094041a20024190016a41086a220b200a280200360200200220022903800137039001200241c0016a200241206a41c1001094041a200141246a20024180026a2d00003a00002001411c6a200241f8016a290000370000200141146a200241f0016a2900003700002001410c6a200241c0016a41286a290000370000200120022900e00137000420002002290300370000200041086a200241086a290300370000200041106a200241106a290300370000200041176a200241176a290000370000200020093a001f200041286a200b280200360200200020022903900137022020041023200324000f0b20004100360220200324000f0b41124101102a000b41324101102a000b41faccc40041d7001021000b41d4aac10041331021000b9c0d04057f017e197f027e230041f0026b2204240002400240410d10262205450d00200541056a41002900ee9c41370000200541002900e99c413700002005410d412d10272205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41186a22064200370300200441a0026a41106a22074200370300200441a0026a41086a22084200370300200442003703a0022005412d200441a0026a1002200441e0016a41186a2006290300370300200441e0016a41106a2007290300370300200441e0016a41086a2008290300370300200420042903a0023703e001024002400240024002400240200441e0016a412041a886c500410041001001417f460d00200441003a00a002200441e0016a4120200441a0026a41014100100141016a41014d0d0520042d00a002220641034f0d052005102320064101460d0320064102470d01200441a0026a2001106e20042d00a0024101470d02200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a20022003107e20043502384201852102200441386a41106a2903002103200441386a41086a29030021090c040b200510230b200441f8006a2001106e20042d00784101470d00200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2207290000370300200420042900793703a001200441a0026a200441a0016a106b200441c0016a41186a22082005290000370300200441c0016a41106a220a2006290000370300200441c0016a41086a220b2007290000370300200420042900793703c00120042802c002220c450d00200441e0016a41186a220d2008290300370300200441e0016a41106a220e200a290300370300200441e0016a41086a220f200b290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2207200441a0026a41106a2208290300370300200441e0016a41386a2210200441a0026a41186a2211290300370300200441086a41086a2212200441cc026a2213290200370300200441086a41106a2214200441d4026a2215290200370300200441086a41186a2216200441dc026a2217290200370300200441086a41206a2218200441e4026a2219290200370300200441086a41286a221a200441ec026a221b280200360200200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221c2010290300370300200441386a41306a221d2007290300370300200441386a41286a221e2005290300370300200441386a41206a221f200429038002370300200441386a41186a2220200d290300370300200441386a41106a2221200e290300370300200441386a41086a2222200f290300370300200420042903e0013703382010201c2903003703002007201d2903003703002005201e290300370300200441e0016a41206a221c201f290300370300200d2020290300370300200e2021290300370300200f2022290300370300200420042903383703e001200441f8006a41186a2020290300370300200441f8006a41106a2021290300370300200441f8006a41086a202229030037030020042004290338370378201120102903003703002008200729030037030020062005290300370300200441c4026a2205200429030837020020132012290300370200201520142903003702002017201629030037020020192018290300370200201b201a2802003602002004200c3602c0022004201c2903003703a00220082008290300220920027c22233703002011201129030020037c2023200954ad7c37030020062903002109200420042903a002222320027c22243703a0022006200920037c2024202354ad7c370300200441c0016a200120022003107e20043502c0012102200a2903002103200b2903002109200441f8006a200441a0026a107f02402005280200450d00200441a0026a41206a28020010230b200242018521020c020b420021020c010b200441a0026a200120022003107e20043502a0024201852102200441b0026a2903002103200441a8026a29030021090b2000200937030820002002370300200041106a2003370300200441f0026a24000f0b41d4aac10041331021000b410d4101102a000b412d4101102a000bcc0202047f047e230041206b22012400200141106a41086a220242003703002001420037031041ecb5c1004116200141106a1000200141086a22032002290300370300200120012903103703000240024002402001411041a886c500410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b2000280200220041086a290300210720002903002108200242003703002001420037031041ecb5c1004116200141106a100020032002290300370300200120012903103703002001427f200520077c200620087c22072006542202ad7c22062002200620055420062005511b22021b3703182001427f200720021b37031020014110200141106a41101004200141206a24000f0b41d4aac10041331021000baa0204017f017e017f017e230041c0006b2202240042002103200241306a41086a220442003703002002420037033041ecb5c1004116200241306a1000200241206a41086a200429030037030020022002290330370320024002400240200241206a411041a886c500410041001001417f460d002002420037033820024200370330200241206a4110200241306a4110410010012204417f460d022004410f4d0d02200241106a2002290330200241306a41086a290300427f42001097042002290310220342012003420156200241106a41086a29030022034200522003501b22041b22052003420020041b22038450450d0141a0c9c300104f000b420121050b2002200020012005200310970420022903002103200241c0006a240020030f0b41d4aac10041331021000b920303017f017e027f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d00410021034100210103402002417f6a21020240200120002f01064f0d00200141016a210120020d010c020b0240024020002802002201450d0020003301044220862003ad842104410121050c010b2003ad210441002105410021010b200010232004a72103024002402004422088a7220620012f01064f0d00200121000c010b03400240024020012802002200450d00200541016a210520013301044220862003ad8421040c010b2003ad2104410021000b200110232004a72103200021012004422088a7220620002f01064f0d000b0b200020064102746a4198036a2802002100024020054101460d00410120056b210103402000280294032100200141016a22010d000b0b4100210120020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002100200110232000450d00024020002802002201450d000340200010232001210020012802002203210120030d000b0b200010230b0b8b0404027f017e037f027e230041d0006b2204240020042001103402400240024002400240024002402004290300200441086a290300844200510d00411410262205450d05200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d06200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310200441106a412041a886c500410041001001417f460d012004420037033820044200370330200441106a4120200441306a4110410010012207417f460d042007410f4d0d04200441386a290300210a200429033021060c020b20004193b5c100360204200041086a4122360200410121010c020b4200210a0b200510232001200620027c220b200a20037c200b200654ad7c10df01200041106a2003370300200041086a2002370300410021010b20002001360200200441d0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bd90201047f230041d0006b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410f106202400240410e10262203450d00200341066a41002900c6c740370000200341002900c0c7403700002003410e412e10272203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241306a41186a22004200370300200241306a41106a22044200370300200241306a41086a22054200370300200242003703302003412e200241306a1002200241106a41186a2000290300370300200241106a41106a2004290300370300200241106a41086a200529030037030020022002290330370310200241203602342002200241106a3602302001200241306a106720031023200241d0006a24000f0b410e4101102a000b412e4101102a000b02000bec0301087f23004180016b22032400200341c0006a20011082010240024020032903404201520d002002417f732104200341c0006a41086a21020340200341086a41306a2205200241306a290300370300200341086a41286a2206200241286a290300370300200341086a41206a2207200241206a290300370300200341086a41186a2208200241186a290300370300200341086a41106a2209200241106a290300370300200341086a41086a220a200241086a29030037030020032002290300370308200341c0006a41306a2005290300370300200341c0006a41286a2006290300370300200341c0006a41206a2007290300370300200341c0006a41186a2008290300370300200341c0006a41106a20092903003703002002200a29030037030020032003290308370340200441016a2204450d02200341c0006a200110820120032903404201510d000b0b2000420037030020034180016a24000f0b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a29030037030020034180016a24000bbf0703037f047e047f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042002290038370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a001370300411210262204450d01200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41186a220a4200370300200241a0016a41106a220b4200370300200241a0016a41086a220c4200370300200242003703a00120044132200241a0016a1002200241f0006a41186a200a290300370300200241f0006a41106a200b290300370300200241f0006a41086a200c290300370300200220022903a001370370200241f0006a412041a886c500410041001001417f460d0320024220370294012002200241f0006a36029001200241a0016a20024190016a106420022d00b8014102460d04200241a0016a41086a290300210820022802b001210a20022903a0012105200241206a200241b9016a41c7001094041a200241a0016a200241206a41c1001094041a200241206a200241a0016a41c1001094041a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2008370300200041286a2005370300200041386a200a360200200020093a00272000420137030020041023200324000f0b20004200370300200324000f0b41124101102a000b41324101102a000b41faccc40041d7001021000b41d4aac10041331021000be7d00106037f037e107f017e0f7f057e230041e0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410c4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0d0008050602090a070e040c0103000b200141306a2903002106200141286a29030021072001411d6a29000021082001411c6a2d000021092001411b6a2d0000210a200141196a2f0000210b200141186a2d0000210c200141176a2d0000210d200141156a2f0000210e200141146a2d0000210f200141136a2d00002110200141116a2f00002111200141106a2d000021122001410c6a2802002113200141086a2802002114200141076a2d00002115200141056a2f00002116200141046a2d0000211720012d000121182002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f01002125412a210441db94c300210520022d0000450d144101212641002127410021280c150b4101212620022d000120022d0000720d0b200141046a2802002102200341e0036a41086a22054200370300200342003703e00341a8f5c0004119200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200320023602e00320034188016a4110200341e0036a410410040c720b200141106a2903002108200141086a2903002106200141186a28020021142002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f0100212541db94c3002105412a210420022d0000450d0c4101212641002127410021280c0d0b200141086a280200211b200141046a280200211c20022d000120022d000072450d0d41002126201b450d09201c102320012d000021040c090b4101212620022d000120022d0000720d08200141046a2802002102200341e0036a41086a22054200370300200342003703e00341f399c1004116200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200320023602e00320034188016a4110200341e0036a410410040c6f0b200141106a2903002108200141086a29030021062002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f01002125412a210441db94c300210520022d0000450d0c4101212641002127410021280c0d0b20022d00000d0420022d00014101470d04200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703e801200320053a00e701200320043a00e601200320263b01e401200320273a00e301200320283a00e2012003201a3b01e0012003201b3a00df012003201c3a00de012003201d3b01dc012003201e3a00db01200320253a00d201200320143b01d001200320212020410874201f41187472723600d701200320242023410874722022411874723600d301200341e0036a200341d0016a106b2003280280042228450d0d200341c0046a41086a220220034194046a290200370300200341c0046a41106a22052003419c046a290200370300200341c0046a41186a2204200341a4046a29020037030020032003418c046a2902003703c004200341e0036a41186a290300212920034188046a280200211b200341ec036a350200211920032903f003212a200328028404211c20033502e003210620032902e4032108200341a0026a41186a2004290300370300200341a0026a41106a2005290300370300200341a0026a41086a2002290300370300200320032903c0043703a002200341e0036a41086a22024200370300200342003703e00341e199c1004112200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880141002126024020034188016a411041a886c500410041001001417f460d00200341003602e00320034188016a4110200341e0036a41044100100141016a41044d0d3c20032802e00321260b20194220862008422088842119200842208620068421080240201b41186c2202450d00202820026a2127200241686a2105202821020340200241086a2903002107200229030021062026200241106a2802002204490d264200201920077d2008200654ad7d2207200820067d2206200856200720195620072019511b22041b21194200200620041b2108200541686a2105200241186a22022027470d000b0b4108211a41002104201c450d28202810234100211b0c2f0b20022d00000d0320022d00014101470d0320012d00012109200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703a001200320053a009f01200320043a009e01200320263b019c01200320273a009b01200320283a009a012003201a3b0198012003201b3a0097012003201c3a0096012003201d3b0194012003201e3a009301200320253a008a01200320143b01880120032021202041087472201f4118747236008f012003202420234108747220224118747236008b01200341e0036a20034188016a106b2003280280042205450d0c200341c0046a41086a220220034194046a290200370300200341c0046a41106a22042003419c046a290200370300200341c0046a41186a2226200341a4046a29020037030020032003418c046a2902003703c0042003280284042127200341d0016a41186a2026290300370300200341d0016a41106a2004290300370300200341d0016a41086a2002290300370300200320032903c0043703d001410d10262202450d3f200241056a41002900ee9c41370000200241002900e99c413700002002410d412d10272202450d40200220032903d00137000d200241256a200341d0016a41186a2903003700002002411d6a200341d0016a41106a290300370000200241156a200341d0016a41086a290300370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22284200370300200342003703c0042002412d200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341203602e4032003200341c0036a3602e0032009200341e0036a1068200210232027450d6c200510230c6c0b20022d00000d0220022d00014101470d02200141106a2903002119200141086a2903002108200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703d803200320053a00d703200320043a00d603200320263b01d403200320273a00d303200320283a00d2032003201a3b01d0032003201b3a00cf032003201c3a00ce032003201d3b01cc032003201e3a00cb03200320253a00c203200320143b01c003200320212020410874201f41187472723600c703200320242023410874722022411874723600c303200341e0036a200341c0036a106e20032d00e0034101470d1c200341e0036a410c6a22272d00002102200341ed036a2900002106200341f5036a280000210520032f00e103210420032d00e303212620032902e40321072003200341f9036a290000370358200320053602542003200637024c200320023a004b20032007370043200320263a0042200320043b0140200341e0036a200341c0006a106b2003280280042205450d0b200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2228200341e0036a41c4006a29020037030020032003418c046a2902003703c004200341ac046a280200211a200341e0036a41286a280200211b20273502002106200341e0036a41186a290300212920032802e003212720032902e403210720032903f003212a200328028404210220034188016a41186a221c202829030037030020034188016a41106a2228202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a22042029370300200341d0016a410c6a20063e0200200341d0016a41286a201b360200200341f4016a221b2002360200200341d0016a41346a2026290300370200200341d0016a413c6a2028290300370200200341d0016a41c4006a201c2903003702002003202a3703e001200320073702d401200320053602f001200320273602d0012003201a36029c0220032003290388013702fc01200341186a200341c0036a10840102402003290318220620032903d001222b7d222c200656200341186a41086a2903002207200341d0016a41086a290300222d7d2006202b54ad7d220620075620062007511b0d00200341d0016a41106a2008202c202c200856200620195620062019511b22021b2208202a7c220737030020042019200620021b221920297c2007200854ad7c37030020032008202b7c22063703d00120032019202d7c2006200854ad7c3703d801200341c0006a200341d0016a107f201b28020021020b2002450d6b200341f0016a28020010230c6b0b2001410c6a280200211c200141086a280200211b200141046a28020021282002411a6a2901002119200241196a2d0000211d200241186a2d0000211e200241166a2f0100211f200241156a2d00002120200241146a2d00002121200241126a2f01002122200241116a2d00002123200241106a2d000021242002410e6a2f010021252002410d6a2d00002114200241046a2d00002109200241026a2f0100210a41db94c3002105412a210420022d0000450d0d41012126410021274100211a0c0e0b20022d00000d0020022d00014101470d00200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a290100370358200320053a0057200320043a0056200320263b0154200320273a0053200320283a00522003201a3b01502003201b3a004f2003201c3a004e2003201d3b014c2003201e3a004b200320253a0042200320143b014020032021202041087472201f4118747236004720032024202341087472202241187472360043200341e0036a200341c0006a106b2003280280042202450d09200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2227200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002128200341e0036a41286a280200211a200341e0036a410c6a3502002119200341e0036a41186a290300210820032802e003211b20032902e403210620032903f0032107200328028404210520034188016a41186a221c202729030037030020034188016a41106a2227202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a2008370300200341d0016a410c6a20193e0200200341d0016a41286a201a360200200341f4016a2005360200200341d0016a41346a2026290300370200200341d0016a413c6a2027290300370200200341d0016a41c4006a201c290300370200200320073703e001200320063702d401200320023602f0012003201b3602d0012003202836029c0220032003290388013702fc01200341d0016a412c6a220410850120041086012005450d69200210230c690b41db94c3002105412a21020c82010b4101212620022d000120022d000072450d0c0b41b394c300210541282102200441ff01712204410d4b0d11410120047441be3f710d840120044106460d102004410d470d112026450d8401200141086a280200450d8401200141046a28020010230c84010b2001411d6a29000021082001411c6a2d000021092001411b6a2d0000210a200141196a2f0000210b200141186a2d0000210c200141176a2d0000210d200141156a2f0000210e200141146a2d0000210f200141136a2d00002110200141116a2f00002111200141106a2d000021122001410c6a2802002117200141086a280200211a200141076a2d00002115200141056a2f00002116200141046a2d000021132002411a6a2901002119200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d00002124200241046a2d00002125200241026a2f0100211441db94c3002105412a210420022d0000450d0b4101212641002127410021280c0c0b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172202841187472210220260d7d200320193703d8022003201a3a00d7022003201b3a00d6022003201c3b01d4022003201d3a00d3022003201e3a00d2022003201f3b01d002200320203a00cf02200320213a00ce02200320223b01cc02200320233a00cb02200320023600c702200320053600c302200320243a00c202200320253b01c002200341e0036a200341c0026a106b2003280280042202450d03200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2227200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002128200341e0036a41286a280200211a200341e0036a410c6a3502002119200341e0036a41186a290300210720032802e003211b20032902e403212920032903f003212a200328028404210520034188016a41186a221c202729030037030020034188016a41106a2227202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a2007370300200341d0016a410c6a20193e0200200341d0016a41286a201a360200200341f4016a2005360200200341d0016a41346a2026290300370200200341d0016a413c6a2027290300370200200341d0016a41c4006a201c2903003702002003202a3703e001200320293702d401200320023602f0012003201b3602d0012003202836029c0220032003290388013702fc012014410a4d0d0f02402005450d00200210230b41bf9fc1002105411b21020c7d0b2001410c6a2802002102200341e0036a41086a22054200370300200342003703e0034181f5c0004115200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200341003602e803200342013703e003200320023602d001200341d0016a200341e0036a10412002450d1020024105742127200341e0036a41086a280200210520032802e003212820032802e4032126201c210203400240024002400240202620056b41204f0d00200541206a22042005490d7a2026410174221a20042004201a491b221a4100480d7a2026450d0120282026201a102722280d020c320b200541206a21040c020b201a10262228450d300b201a21260b202820056a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a29000037000020042105200241206a2102202741606a22270d000b200341e8036a2004360200200320263602e403200320283602e0030c110b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202841ffff0371410874202741187472200441ff017172210220260d7a200320193703582003201a3a00572003201b3a00562003201c3b01542003201d3a00532003201e3a00522003201f3b0150200320203a004f200320213a004e200320223b014c200320233a004b2003200236004720032005360043200320243a0042200320253b0140200341e0036a200341c0006a106b2003280280042204450d00200341c0046a41086a2226200341e0036a41346a290200370300200341c0046a41106a2227200341e0036a413c6a290200370300200341c0046a41186a2228200341e0036a41c4006a29020037030020032003418c046a2902003703c004200341ac046a280200211a200341e0036a41286a2802002105200341e0036a410c6a3502002129200341e0036a41186a290300211920032802e003211b20032902e403212a20032903f0032107200328028404210220034188016a41186a221c202829030037030020034188016a41106a2228202729030037030020034188016a41086a22272026290300370300200320032903c00437038801200341d0016a41186a2019370300200341d0016a410c6a20293e0200200341d0016a41286a2005360200200341f4016a2002360200200341d0016a41346a2027290300370200200341d0016a413c6a2028290300370200200341d0016a41c4006a201c290300370200200320073703e0012003202a3702d401200320043602f0012003201b3602d0012003201a36029c0220032003290388013702fc012005411f4d0d0d02402002450d00200410230b419c9fc1002105412321020c7a0b41819fc1002105411021020c790b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202841ffff0371410874202741187472200441ff017172210220260d77200320193703a0012003201a3a009f012003201b3a009e012003201c3b019c012003201d3a009b012003201e3a009a012003201f3b019801200320203a009701200320213a009601200320223b019401200320233a0093012003200236008f012003200536008b01200320243a008a01200320253b018801410e10262202450d29200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d2a200220032903880137000e200241266a20034188016a41186a2903003700002002411e6a20034188016a41106a290300370000200241166a20034188016a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f460d0641ed9ec1002105411421020c770b41012126410021274100211a20022d00014101470d002002410c6a2d0000211a2002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172201a41187472210220260d7320032019370398032003201d3a0097032003201e3a0096032003201f3b019403200320203a009303200320213a009203200320223b019003200320233a008f03200320243a008e03200320253b018c03200320143a008b0320032002360087032003200536008303200320093a0082032003200a3b018003200341e0036a20034180036a106b200328028004221a450d03200341c0046a41086a2202200341e0036a41346a290200370300200341c0046a41106a2205200341e0036a413c6a290200370300200341c0046a41186a2204200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002126200341e0036a41286a2802002127200341e0036a410c6a3502002119200341e0036a41186a290300210820032802e003211d20032902e403210620032903f0032107200328028404211e20034188016a41186a221f200429030037030020034188016a41106a2204200529030037030020034188016a41086a22052002290300370300200320032903c00437038801200341d0016a41186a2008370300200341d0016a410c6a20193e0200200341d0016a41286a2027360200200341d0016a41246a201e360200200341d0016a41346a2005290300370200200341d0016a413c6a2004290300370200200341d0016a41c4006a201f290300370200200320073703e001200320063702d4012003201a3602f0012003201d3602d0012003202636029c0220032003290388013702fc01201c450d0b201c41246c2202450d0d200341a0026a41026a2205202841036a2d00003a0000200341c0046a41086a2227202841146a290000370300200341c0046a410d6a221d202841196a290000370000200320282f00013b01a0022003202829000c3703c004202841246a210420282d0000221f4102460d0e2028280008212020282800042126200341e0026a41026a20052d00003a000020034188016a41086a202729030037030020034188016a410d6a201d290000370000200320032f01a0023b01e002200320032903c00437038801201f4101470d15200341a0036a202641067610870120032802a003212720032802a8032026413f7122054d0d1a200341c0026a41026a202720054105746a220541026a2d00003a0000200341c8006a200541136a290000370300200341cd006a200541186a290000370000200320052f00003b01c0022003200529000b37034020052800072120200528000321264101210520032802a403450d680c670b41012126200341013a00d001200341e0036a41086a22024200370300200342003703e003418f99c1004113200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880120034188016a4110200341d0016a41011004410021050c5b0b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172202841187472210220260d72200320193703b8022003201b3a00b7022003201c3a00b6022003201d3b01b4022003201e3a00b3022003201f3a00b202200320203b01b002200320213a00af02200320223a00ae02200320233b01ac02200320243a00ab02200320023600a702200320053600a302200320253a00a202200320143b01a002200341e0036a200341a0026a106e41012126024020032d00e0034101470d00200341ec036a2d00002102200341ed036a2900002119200341f5036a280000210520032f00e103210420032d00e303212620032902e40321062003200341f9036a2900003703d802200320053602d402200320193702cc02200320023a00cb02200320063700c302200320263a00c202200320043b01c002201341ff01714101470d56200341e0036a201a41067610870120032802e003210520032802e803201a413f7122024d0d0d200520024105746a2202290018210820022d0017210920022d0016210a20022f0014210b20022d0013210c20022d0012210d20022f0010210e20022d000f210f20022d000e211020022f000c211120022d000b2112200228000721262002280003212720022d0002211520022f000021164101210420032802e403450d550c540b41919fc1002105410b21024101212720012d00002204410d4d0d740c750b4110210241819fc10021054100212741012126201b0d700c720b201741ff01714101470d50200341e0036a201441067610870120032802e003210520032802e8032014413f7122024d0d0c200520024105746a2202290018210820022d0017210920022d0016210a20022f0014210b20022d0013210c20022d0012210d20022f0010210e20022d000f210f20022d000e211020022f000c211120022d000b2112200228000721262002280003212720022d0002211520022f000021164101210420032802e403450d4f0c4e0b200141086a280200450d73200141046a28020010230c730b200141086a280200450d72200141046a28020010230c720b200341d0016a412c6a2205108601200320083703302003200637032820032014360238411210262202450d23200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d24200220052900003700122002412a6a200541186a290000370000200241226a200541106a2900003700002002411a6a200541086a290000370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00420024132200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d082003422037028c012003200341c0036a36028801200341e0036a20034188016a106420032d00f80322264102460d28200341a0026a41186a20034191046a290000370300200341a0026a41106a20034189046a290000370300200341a0026a41086a20034181046a290000370300200341e0026a41086a200341a2046a290100370300200341e0026a41106a200341aa046a290100370300200341e0026a41186a200341b2046a290100370300200320032900f9033703a00220032003419a046a2901003703e00220034199046a2d000021280c440b200720062007200654201920085420192008511b22051b22062019200820051b220884500d34200341d0016a41106a200720067d370300200341e8016a201920087d2007200654ad7d370300200341e0036a41086a22024200370300200342003703e0034182b6c100411b200341e0036a100020034188016a41086a2002290300370300200320032903e00337038801024020034188016a411041a886c500410041001001417f460d00200342003703e803200342003703e00320034188016a4110200341e0036a4110410010012202417f460d252002410f4d0d25200341e0016a2202290300220720032903e0035a200341e8016a22052903002219200341e8036a29030022295a20192029511b0d002005420037030020024200370300201920087c200720067c2206200754ad7c21080b200341e0036a41086a22024200370300200342003703e00341e199c1004112200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880120034188016a411041a886c500410041001001417f460d0a200341003602e00320034188016a4110200341e0036a41044100100141016a41044d0d2120032802e00341a0056a21040c0b0b200341e8036a280200210420032802e403212620032802e00321280b20034188016a411020282004100402402026450d00202810230b410121270240201b450d00201c10230b410021260c620b41f9a0c10021054117210241012104201e450d660c650b41919fc1002105410b21020c680b202821040b41002126410121054100211f410021024100450d5b0c5c0b4100210420032802e4030d460c470b20044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00441a69ac100411a200341c0046a100220034188016a41186a200429030037030020034188016a41106a202629030037030020034188016a41086a2027290300370300200320032903c0043703880120034188016a412041a886c500410041001001417f460d06200341d8036a4200370300200341c0036a41106a4200370300200341c0036a41086a4200370300200342003703c00320034188016a4120200341c0036a4120410010012204417f460d202004411f4d0d20200341e0036a41186a2204200341c0036a41186a290300370300200341e0036a41106a2226200341c0036a41106a290300370300200341e0036a41086a2227200341c0036a41086a290300370300200320032903c0033703e00320034180036a41186a2228200429030037030020034180036a41106a2204202629030037030020034180036a41086a22262027290300370300200320032903e00337038003200341a0036a41186a2028290300370300200341a0036a41106a2004290300370300200341a0036a41086a202629030037030020032003290380033703a003411210262204450d23200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d24200420032903a0033700122004412a6a200341a0036a41186a290300370000200441226a200341a0036a41106a2903003700002004411a6a200341a0036a41086a290300370000200341c0046a41186a22264200370300200341c0046a41106a22274200370300200341c0046a41086a22284200370300200342003703c00420044132200341c0046a1002200341c0036a41186a2026290300370300200341c0036a41106a2027290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d25200342203702442003200341c0036a360240200341e0036a200341c0006a106420032d00f80322264102460d26200341e0036a41086a290300211920032802f003212720032903e003210820034188016a200341f9036a41c7001094041a200341c0006a20034188016a41c1001094041a200320263a00e003200341e0036a410172200341c0006a41c1001094041a200341a4016a20034182046a410020032d0081044101461b36020020032019370390012003200837038801200320053602a0012003202736029801200341c0046a41186a22264200370300200341c0046a41106a22274200370300200341c0046a41086a22284200370300200342003703c00420044132200341c0046a1002200341c0036a41186a2026290300370300200341c0036a41106a2027290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341003602482003420137034020034188016a41106a200341c0006a1041200320034188016a3602c004200341c0046a200341c0006a1066200328024421262003280248212720032802a001221b450d0d20262027470d0e202741016a22262027490d5d20274101742228202620262028491b22264100480d5d2027450d1020032802402027202610272228450d110c2d0b4100210420032802e4030d410c420b41181026221a450d20201a2006370300201a2004360210201a20073703082005450d08200241186a211d2028201b41186c6a41686a211f410121044101211b0340201d210202400340200241086a2903002107200229030021062026200241106a2802002205490d014200201920077d2008200654ad7d2207200820067d2206200856200720195620072019511b22051b21194200200620051b2108200241186a22022027470d000c0c0b0b0240201b2004470d00200441016a221b2004490d5d2004410174221d201b201b201d491b221bad42187e222b422088a70d5d202ba7221d4100480d5d02402004450d00201a200441186c201d1027221a0d010c220b201d1026221a450d210b200241186a211d201a200441186c6a221e2007370308201e2006370300201e2005360210200441016a2104201f2002470d000c0a0b0b41a00521040b0240200341f8016a2802002202200341f4016a280200470d00200241016a22052002490d5a20024101742226200520052026491b2226ad42187e2219422088a70d5a2019a722274100480d5a2002450d04200341f0016a280200200241186c202710272205450d050c270b200341f0016a28020021050c270b200341c0026a41026a200341e0026a41026a2d00003a0000200341c0006a41086a20034188016a41086a290300370300200341c0006a410d6a20034188016a410d6a290000370000200320032f01e0023b01c00220032003290388013703400c530b4100211b0c060b200341c0046a41186a220442003703002026420037030020274200370300200342003703c00441a69ac100411a200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003412010262204450d2020042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c0036a412020044120100420041023410021280c330b2027102622050d220b20274108102a000b4100210520032802a4030d4c0c4d0b410121044101211b0b201c450d00202810230b200341e0036a41186a202937030020034188046a200436020020034184046a2202201b360200200341a4046a200341a0026a41186a2903003702002003419c046a200341b0026a29030037020020034194046a200341a8026a2903003702002003202a3703f003200320083703e003200320032903a00237028c042003201a36028004200320193703e803200341d0016a200341e0036a107f2002280200450d3d20034180046a28020010230c3d0b20262027470d01202741016a22262027490d4f20274101742228202620262028491b22264100480d4f2027450d0420032802402027202610272228450d050c1a0b200328024021280c1f0b200328024021280c190b2026102622280d1c0b20264101102a000b2026102622280d150b20264101102a000b200341f4036a4101360200200341013602d4012003418898c4003602d001200342013702e403200341d497c4003602e0032003200341d0016a3602f003200341e0036a41c49ec1001061000b201a4101102a000b410e4101102a000b412e4101102a000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41d4aac10041331021000b410d4101102a000b412d4101102a000b41d4aac10041331021000b41d4aac10041331021000b201d4108102a000b41184108102a000b41124101102a000b41324101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b20032026360244200320283602400b200341c8006a202741016a221a360200202820276a41003a0000200341a4016a28020022270d050c060b200341f4016a2026360200200341f0016a2005360200200341f8016a28020021020b2005200241186c6a220220083703082002200637030020022004360210200341f8016a2202200228020041016a360200200341c0006a200341d0016a107f200341f4016a28020021020b2002450d1d200341f0016a28020010230c1d0b20032026360244200320283602400b200341c0006a41086a221c202741016a360200202820276a41013a0000024002400240024002402003280244221a201c28020022276b411f4b0d00202741206a22262027490d33201a410174221d20262026201d491b22264100480d33201a450d012028201a202610272228450d020c030b201a21260c030b2026102622280d010b20264101102a000b20032026360244200320283602400b201c202741206a221a360200202820276a222741086a201b41086a290000370000202741106a201b41106a290000370000202741186a201b41186a2900003700002027201b290000370000200341a4016a2802002227450d010b2026201a470d08202641016a221b2026490d2d2026410174221c201b201b201c491b221b4100480d2d2026450d0120282026201b10272228450d020c070b2026201a470d05202641016a22272026490d2c2026410174221b20272027201b491b22274100480d2c2026450d0220282026202710272228450d030c040b201b102622280d050b201b4101102a000b2027102622280d010b20274101102a000b20032027360244200320283602400b200341c8006a2226201a41016a3602002028201a6a41003a00002026280200211b20032802442128200328024021260c020b2003201b360244200320283602400b200341c8006a2226201a41016a3602002028201a6a41013a000002400240024002400240200328024422282026280200221a6b41204f0d00201a41206a2226201a490d292028410174221b20262026201b491b221b4100480d292028450d0120032802402028201b10272226450d020c030b200328024021260c030b201b102622260d010b201b4101102a000b2003201b36024420032026360240201b21280b200341c0006a41086a201a41206a221b3602002026201a6a221a41086a202741086a290000370000201a41106a202741106a290000370000201a41186a202741186a290000370000201a20272900003700000b200341c0036a41202026201b100402402028450d00202610230b20041023200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00441a69ac100411a200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003412010262204450d0220042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c0036a412020044120100420041023200341e0026a41186a200341a0036a41186a290300370300200341e0026a41106a200341a0036a41106a290300370300200341e0026a41086a200341a0036a41086a290300370300200320032903a0033703e002410121280b410021260b200341e0036a41186a200341a0026a41186a290300370300200341e0036a41106a200341a0026a41106a290300370300200341e0036a41086a200341a0026a41086a29030037030020034188016a41086a200341e0026a41086a29030037030020034188016a41106a200341e0026a41106a29030037030020034188016a41186a200341e0026a41186a290300370300200320032903a0023703e003200320032903e00237038801200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22274200370300200342003703c00420024132200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2027290300370300200320032903c0043703c0032003410036024820034201370340200341286a41106a200341c0006a10412003200341286a3602c004200341c0046a200341c0006a10662003280244210520032802482104024002400240024002400240024020264101470d0020052004470d01200441016a22052004490d2820044101742226200520052026491b22054100480d282004450d0320032802402004200510272226450d040c0a0b20052004470d01200441016a22052004490d2720044101742226200520052026491b22054100480d272004450d0420032802402004200510272226450d050c070b200328024021260c090b200328024021260c060b2005102622260d060b20054101102a000b2005102622260d020b20054101102a000b41204101102a000b20032005360244200320263602400b200341c8006a200441016a2227360200202620046a41003a00000c020b20032005360244200320263602400b200341c0006a41086a221a200441016a360200202620046a41013a00000240024002400240024020032802442227201a28020022046b411f4b0d00200441206a22052004490d212027410174221b20052005201b491b22054100480d212027450d0120262027200510272226450d020c030b202721050c030b2005102622260d010b20054101102a000b20032005360244200320263602400b201a200441206a2227360200202620046a220441086a200341e0036a41086a290300370000200441106a200341e0036a41106a290300370000200441186a200341e0036a41186a290300370000200420032903e0033700000b0240024002400240024002400240024002400240202841ff01714101470d0020052027470d08200541016a22042005490d2520054101742228200420042028491b22044100480d252005450d0120262005200410272226450d020c070b20052027470d05200541016a22042005490d2420054101742228200420042028491b22044100480d242005450d0220262005200410272226450d030c040b2004102622260d050b20044101102a000b2004102622260d010b20044101102a000b20032004360244200320263602400b200341c8006a2205202741016a360200202620276a41003a00002005280200212720032802442104200328024021050c020b20032004360244200320263602400b200341c8006a2205202741016a360200202620276a41013a00000240024002400240024020032802442204200528020022266b41204f0d00202641206a22052026490d2120044101742227200520052027491b22274100480d212004450d0120032802402004202710272205450d020c030b200328024021050c030b2027102622050d010b20274101102a000b2003202736024420032005360240202721040b200341c0006a41086a202641206a2227360200200520266a222641086a20034188016a41086a290300370000202641106a20034188016a41106a290300370000202641186a20034188016a41186a29030037000020262003290388013700000b200341c0036a412020052027100402402004450d00200510230b20021023200341f4016a280200450d08200341f0016a28020010230c080b200510230b202741d9cac40020041b21052026411520041b21022004450d2020052114200221130b200320083703e801200320093a00e7012003200a3a00e6012003200b3b01e4012003200c3a00e3012003200d3a00e2012003200e3b01e0012003200f3a00df01200320103a00de01200320113b01dc01200320123a00db01200320133600d701200320143600d301200320153a00d201200320163b01d0010240024002400240024002400240410e10262202450d00200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d01200220032903d00137000e200241266a200341d0016a41186a22272903003700002002411e6a200341d0016a41106a2228290300370000200241166a200341d0016a41086a221a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f470d0a200341e0036a41186a2027290300370300200341e0036a41106a2028290300370300200341e0036a41086a201a290300370300200320032903d0013703e003410e10262202450d02200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d03200220032903880137000e200241266a20034188016a41186a2903003700002002411e6a20034188016a41106a290300370000200241166a20034188016a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003412010262205450d04200520032903e003370000200541186a200341e0036a41186a290300370000200541106a200341e0036a41106a290300370000200541086a200341e0036a41086a290300370000200341c0036a41202005412010042005102320021023410d10262202450d05200241056a41002900ee9c41370000200241002900e99c413700002002410d412d10272202450d06200220032903880137000d200241256a20034188016a41186a22052903003700002002411d6a20034188016a41106a2204290300370000200241156a20034188016a41086a2226290300370000200341c0046a41186a22274200370300200341c0046a41106a22284200370300200341c0046a41086a221a4200370300200342003703c0042002412d200341c0046a1002200341c0036a41186a2027290300370300200341c0036a41106a2028290300370300200341c0036a41086a201a290300370300200320032903c0043703c003200341203602e4032003200341c0036a3602e0032018200341e0036a106820021023200341086a20034188016a108401200341086a41086a29030021192003290308210820034188046a4100360200200341e0036a41186a201920062008200754201920065420192006511b22021b2219370300200341a4046a20052903003702002003419c046a200429030037020020034194046a2026290300370200200342083703800420032008200720021b22083703f003200320193703e803200320083703e003200320032903880137028c04200341d0016a200341e0036a107f20034184046a280200450d0c200341e0036a41206a28020010230c0c0b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b41204101102a000b410d4101102a000b412d4101102a000b200510230b202741d9cac40020041b21052026411520041b21022004450d1d2005211a200221170b200320083703f802200320093a00f7022003200a3a00f6022003200b3b01f4022003200c3a00f3022003200d3a00f2022003200e3b01f0022003200f3a00ef02200320103a00ee02200320113b01ec02200320123a00eb02200320173600e7022003201a3600e302200320153a00e202200320163b01e002410e10262202450d04200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d05200220032903e00237000e200241266a200341e0026a41186a2903003700002002411e6a200341e0026a41106a290300370000200241166a200341e0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f470d00200341e0026a200341c0026a4120109604450d02410e10262202450d06200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d07200220032903a00237000e200241266a200341a0026a41186a2903003700002002411e6a200341a0026a41106a290300370000200241166a200341a0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003412010262205450d08200520032903e002370000200541186a200341e0026a41186a290300370000200541106a200341e0026a41106a290300370000200541086a200341e0026a41086a290300370000200341c0036a41202005412010042005102320021023410e10262202450d0941002105200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d0a200220032903c00237000e200241266a200341c0026a41186a2903003700002002411e6a200341c0026a41106a290300370000200241166a200341c0026a41086a290300370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c0030240200341c0036a412041a886c500410041001001417f460d002003422037022c2003200341c0036a360228200341e0036a200341286a106c2003280280042205450d0c200341c0046a41186a200341e0036a41186a290300370300200341c0046a41106a200341e0036a41106a290300370300200341c0046a41086a200341e0036a41086a290300370300200341d0016a41086a2003418c046a290200370300200341d0016a41106a20034194046a290200370300200341d0016a41186a2003419c046a290200370300200341d0016a41206a200341a4046a290200370300200341f8016a200341ac046a280200360200200320032903e0033703c00420032003290284043703d001200341c0036a412010030b200341a0036a41186a2004290300370300200341a0036a41106a2026290300370300200341a0036a41086a202729030037030020034188016a41086a200341d0016a41086a29030037030020034188016a41106a200341d0016a41106a29030037030020034188016a41186a200341d0016a41186a29030037030020034188016a41206a200341d0016a41206a29030037030020034188016a41286a2204200341d0016a41286a280200360200200320032903c0043703a003200320032903d001370388012005450d0120034180036a41186a2226200341a0036a41186a29030037030020034180036a41106a2227200341a0036a41106a29030037030020034180036a41086a2228200341a0036a41086a290300370300200341c0006a41086a221a20034188016a41086a290300370300200341c0006a41106a221b20034188016a41106a290300370300200341c0006a41186a221c20034188016a41186a290300370300200341c0006a41206a221d20034188016a41206a290300370300200341c0006a41286a221e2004280200360200200320032903a00337038003200320032903880137034020021023200341e0036a41186a2026290300370300200341e0036a41106a2027290300370300200341e0036a41086a202829030037030020034184046a20032903403702002003418c046a201a29030037020020034194046a201b2903003702002003419c046a201c290300370200200341a4046a201d290300370200200341ac046a201e280200360200200320053602800420032003290380033703e003410e10262202450d0c200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d0d200220032903e00237000e200241266a200341e0026a41186a2903003700002002411e6a200341e0026a41106a290300370000200241166a200341e0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341203602d4012003200341c0036a3602d001200341e0036a200341d0016a10672002102320034184046a280200450d02200341e0036a41206a28020010230c020b41d49ec1002105411921020c1b0b200210230b41002105410121260b4101212720012d00002204410d4d0d1a0c1b0b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b41204101102a000b410e4101102a000b412e4101102a000b41d4aac10041331021000b410e4101102a000b412e4101102a000b202710230b20050d0041d9cac4002126410121054100211f4100210241d9cac4000d020c010b200341286a41026a2227200341c0026a41026a2d00003a0000200341e0036a41086a2205200341c0006a41086a290300370300200341e0036a410d6a221d200341c0006a410d6a290000370000200320032f01c0023b0128200320032903403703e003200341c0036a410d6a221f201d290000370000200341c0036a41086a221d2005290300370300200320032903e0033703c0030240024002400240412010262205450d00200520032f01283b00002005202036000720052026360003200520032903c00337000b200541026a20272d00003a0000200541136a201d290300370000200541186a201f2900003700000240024002400240202820026a22152004460d00200341a0026a41026a2202202841276a2d00003a0000200341c0046a41086a2226202841386a290000370300200341c0046a410d6a22272028413d6a290000370000200320282f00253b01a002200320282900303703c004202841c8006a2104202841246a2d0000221f4102460d01202828002c21092028280028211d200341e0026a41026a20022d00003a000020034188016a41086a202629030037030020034188016a410d6a2027290000370000200320032f01a0023b01e002200320032903c00437038801201f4101470d02200341e0036a201d41067610870120032802e003212620032802e803201d413f7122024d0d03200341c0026a41026a202620024105746a220241026a2d00003a0000200341c8006a200241136a290000370300200341cd006a200241186a290000370000200320022f00003b01c0022003200229000b370340200228000721092002280003211d4101210220032802e403450d060c050b201521040b4101211f410021264101210241000d070c060b200341c0026a41026a200341e0026a41026a2d00003a0000200341c0006a41086a20034188016a41086a290300370300200341c0006a410d6a20034188016a410d6a290000370000200320032f01e0023b01c00220032003290388013703400c040b410021022020210920032802e4030d010c020b41204101102a000b202610230b20020d004101211f41d9cac40021264101210241d9cac4000d020c010b200341286a41026a2224200341c0026a41026a220d2d00003a0000200341c0036a41086a2225200341c0006a41086a220e290300370300200341c0036a410d6a2214200341c0006a410d6a220f290000370000200320032f01c0023b0128200320032903403703c003201c41246c41b87f6a2112200341cb046a212141022122412021204102211f410021274101210202400240024002400340202120032903c003370000202141086a20252903003700002021410d6a2014290000370000200320093600c7042003201d3600c304200320032f01283b01c004200320242d00003a00c2040240201f417f6a2002470d002022201f201f2022491b2202ad4205862219422088a70d0a2019a722264100480d0a20052020202610272205450d050b200520206a222620032903c004370000202641186a200341c0046a41186a290300370000202641106a200341c0046a41106a290300370000202641086a200341c0046a41086a2223290300370000202741f803460d02024020122027460d00200341a0026a41026a220a202820276a222641cb006a2d00003a00002023202641dc006a290000370300200341c0046a410d6a220b202641e1006a2900003700002003202641c9006a2f00003b01a0022003202641d4006a2900003703c004202641c8006a2d0000220c4102460d02202641d0006a2800002110202641cc006a280000211d200341e0026a41026a2211200a2d00003a000020034188016a41086a220a202329030037030020034188016a410d6a2223200b290000370000200320032f01a0023b01e002200320032903c0043703880102400240200c4101470d00200341a0036a201d410676108701201d413f7121234100210a20032802a003210b0240200341a0036a41086a28020020234d0d00200d200b20234105746a221d41026a2d00003a0000200e201d41136a290000370300200f201d41186a2900003700002003201d2f00003b01c0022003201d29000b370340201d2800072109201d280003211d4101210a0b024020032802a403450d00200b10230b200a0d010c060b200d20112d00003a0000200e200a290300370300200f2023290000370000200320032f01e0023b01c0022003200329038801370340201021090b200441246a21042024200d2d00003a0000200341e0036a41086a2226200e290300370300200341e0036a410d6a2223200f290000370000200320032f01c0023b0128200320032903403703e0032014202329000037000020252026290300370300200320032903e0033703c003202241026a2122202041206a2120201f41016a211f202741246a21270c010b0b201521044100212641000d050c040b202641ec006a21040b4100212641000d030c020b202641ec006a210441d9cac400212641d9cac4000d020c010b20264101102a000b410021200c010b4101212002402002450d00200510230b20262105411521020b200341d0016a412c6a211d2028201c41246c6a21270240034020272004460d0120042d00002126200441246a210420264102470d000b0b0240201b450d00202810230b02402020450d0041002104201e0d050c060b201d1085012003201f3602c802200320023602c402200320053602c0020240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027221c450d01201c201d290000370012201c412a6a201d41186a290000370000201c41226a201d41106a290000370000201c411a6a201d41086a290000370000200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201c4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c0030240200341c0036a412041a886c500410041001001417f460d002003422037028c012003200341c0036a36028801200341e0036a20034188016a10880120032d00ec0322024102460d03200341a0026a41086a200341f5036a290000370300200341a0026a41106a200341fd036a290000370300200341a0026a41186a20034185046a290000370300200341e0026a41086a20034196046a290100370300200341e0026a41106a2003419e046a290100370300200341e0026a41186a200341a6046a290100370300200320032900ed033703a00220032003418e046a2901003703e0022003418d046a2d0000210520032802e403450d0d20032802e00310230c0d0b20024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c00441c09ac100411a200341c0046a100220034188016a41186a200229030037030020034188016a41106a200529030037030020034188016a41086a2004290300370300200320032903c00437038801024002400240024020034188016a412041a886c500410041001001417f460d00200341d8036a4200370300200341c0036a41106a4200370300200341c0036a41086a4200370300200342003703c00320034188016a4120200341c0036a4120410010012202417f460d072002411f4d0d07200341e0036a41186a2202200341c0036a41186a290300370300200341e0036a41106a2205200341c0036a41106a290300370300200341e0036a41086a2204200341c0036a41086a290300370300200320032903c0033703e003200341a0036a41186a22262002290300370300200341a0036a41106a22022005290300370300200341a0036a41086a22052004290300370300200320032903e0033703a003200341c0006a41186a2026290300370300200341c0006a41106a2002290300370300200341c0006a41086a2005290300370300200320032903a003370340411210262202450d08200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027221b450d09201b2003290340370012201b412a6a200341c0006a41186a290300370000201b41226a200341c0006a41106a290300370000201b411a6a200341c0006a41086a290300370000200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201b4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d0a200342203702c4042003200341c0036a3602c004200341e0036a200341c0046a10880120032d00ec0322054102460d0b20032802e403211f20032802e003211e20032802e803210220034188016a200341ed036a41c3001094041a200320053a00e003200341e0036a41017220034188016a41c1001094041a20032d0081042120200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c004201b4132200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c00320034201370388012003410036029001200320023602c004200341c0046a20034188016a104120032802900121052002450d012002410574211a410020056b2104200328028c012126201e210203400240024002400240202620046a41204f0d00200541206a22272005490d1720264101742228202720272028491b22284100480d172026450d0120032802880120262028102722270d020c080b20032802880121270c020b202810262227450d060b2003202836028c012003202736028801202821260b20034188016a41086a200541206a2228360200202720056a220541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a29000037000020052002290000370000200441606a210420282105200241206a2102201a41606a221a0d000c030b0b200341c0046a41186a220242003703002005420037030020044200370300200342003703c00441c09ac100411a200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003412010262202450d0b2002201d290000370000200241186a201d41186a290000370000200241106a201d41106a290000370000200241086a201d41086a290000370000200341c0036a412020024120100420021023410021050c0e0b200521280b024002400240200328028c012028470d00202841016a22022028490d1220284101742205200220022005491b22054100480d122028450d012003280288012028200510272202450d020c0d0b20032802880121020c0d0b2005102622020d0b0b20054101102a000b20284101102a000b41124101102a000b41324101102a000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b2003200536028c0120032002360288010b20034188016a41086a2226202841016a360200200220286a41013a000002400240024002400240200328028c012227202628020022046b411f4b0d00200441206a22052004490d0820274101742228200520052028491b22054100480d082027450d0120022027200510272202450d020c030b202721050c030b2005102622020d010b20054101102a000b2003200536028c0120032002360288010b2026200441206a2228360200200220046a222641086a201d41086a290000370000202641106a201d41106a290000370000202641186a201d41186a2900003700002026201d29000037000002400240024002400240024002400240024002400240024020034182046a410020204101461b2226450d0020052028470d01200541016a22272005490d0f2005410174221a20272027201a491b22274100480d0f2005450d0320022005202710272202450d040c090b20052028470d01200541016a22262005490d0e20054101742227202620262027491b221a4100480d0e2005450d0420022005201a10272202450d050c060b200521270c080b2005211a0c050b2027102622020d050b20274101102a000b201a102622020d010b201a4101102a000b2003201a36028c0120032002360288010b20034190016a200441216a2204360200200220286a41003a00000c020b2003202736028c0120032002360288010b20034188016a41086a2220200441216a2205360200200220286a41013a000002400240024002400240202720056b411f4b0d00200541206a22282005490d092027410174221a20282028201a491b221a4100480d092027450d0120022027201a10272202450d020c030b2027211a0c030b201a102622020d010b201a4101102a000b2003201a36028c0120032002360288010b2020200441c1006a2204360200200220056a220541086a202641086a290000370000200541106a202641106a290000370000200541186a202641186a290000370000200520262900003700000b200341c0036a41202002200410040240201a450d00200210230b0240201f450d00201e10230b201b1023200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c00441c09ac100411a200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003412010262202450d052002201d290000370000200241186a201d41186a290000370000200241106a201d41106a290000370000200241086a201d41086a290000370000200341c0036a412020024120100420021023200341e0026a41186a200341c0006a41186a290300370300200341e0026a41106a200341c0006a41106a290300370300200341e0026a41086a200341c0006a41086a290300370300200320032903403703e002410121050b410021020b20034185046a20053a000020034186046a20032903e002370100200341ed036a200341a0026a41086a290300370000200341f5036a200341a0026a41106a290300370000200341fd036a200341a0026a41186a2903003700002003418e046a200341e0026a41086a29030037010020034196046a200341e0026a41106a2903003701002003419e046a200341e0026a41186a290300370100200320023a00e403200320032903a0023700e5032003200341c0026a3602e003200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201c4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c0032003410036029001200342013703880120032802c00221022003200341c0026a41086a2802002205360240200341c0006a20034188016a104102402005450d0020054105742128410020034188016a41086a28020022056b2126200328028801211a200328028c01212703400240202720266a411f4b0d00200541206a22042005490d042027410174221b20042004201b491b22044100480d04024002402027450d00201a202720041027221a0d010c070b20041026221a450d060b200421270b201a20056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000202641606a2126200541206a2105200241206a2102202841606a22280d000b20034190016a20053602002003202736028c012003201a360288010b200341e0036a41047220034188016a105d200328028c012102200341c0036a4120200328028801220520034188016a41086a280200100402402002450d00200510230b201c1023024020032802c402450d0020032802c00210230b0240200341f4016a280200450d00200341f0016a28020010230b41002127410121260b4100210520012d00002204410d4d0d090c0a0b101e000b20044101102a000b41204101102a000b201a10230b20040d00410021274101212620012d00002204410d4d0d040c050b4100212741012126201b450d020b2028102320012d00002204410d4d0d020c030b41012126410121270b20012d00002204410d4b0d010b410120047441be3f710d01024020044106460d002004410d470d012026450d02200141086a280200450d02200141046a28020010230c020b2027450d01200141086a280200450d01200141046a28020010230c010b200141086a280200450d00200141046a28020010230b2000200236020420002005360200200341e0046a24000b9a0304027f017e027f017e230041c0006b2202240002400240411410262203450d00200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034134200241206a1002200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a2903002107200229032021040c010b420021070b200310232000200737030820002004370300200241c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b9c1501077f230041c0036b220124000240024002400240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e0026a41186a22004200370300200141e0026a41106a22034200370300200141e0026a41086a22044200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2000290300370300200141b0026a41106a2003290300370300200141b0026a41086a2004290300370300200120012903e0023703b00202400240200141b0026a412041a886c500410041001001417f460d002001422037026c2001200141b0026a360268200141e0026a200141e8006a106420012d00f80222034102460d0420014188016a41186a20014191036a29000037030020014188016a41106a20014189036a29000037030020014188016a41086a20014181036a290000370300200141e8016a41086a200141a2036a290100370300200141e8016a41106a200141aa036a290100370300200141e8016a41186a200141b2036a290100370300200120012900f9023703880120012001419a036a2901003703e80120014199036a2d00002104200141b0026a412010030c010b410221030b200141286a41186a20014188016a41186a290300370300200141286a41106a220020014188016a41106a290300370300200141286a41086a220520014188016a41086a290300370300200141086a41086a2206200141e8016a41086a290300370300200141086a41106a2207200141e8016a41106a290300370300200141086a41186a200141e8016a41186a2903003703002001200129038801370328200120012903e8013703082002102320034102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2000290300370300200141e8006a41086a2005290300370300200141c8006a41086a2006290300370300200141c8006a41106a2007290300370300200141c8006a41186a200141086a41186a2903003703002001200129032837036820012001290308370348410021020240200441ff01714101470d00411210262202450d06200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d07200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d00411210262200450d09200041106a41002f00bec7403b0000200041086a41002900b6c740370000200041002900aec74037000020004112413210272200450d0a200020012903683700122000412a6a200141e8006a41186a290300370000200041226a200141e8006a41106a2903003700002000411a6a200141e8006a41086a290300370000200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220004132200141e0026a1002200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041a886c500410041001001417f460d0b200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a106420012d00f80222074102460d0c20014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001094041a200120073a00a00120014188016a41196a200141e8016a41c7001094041a200141c1016a20043a0000200141c2016a2001290348370100200141ca016a200141c8006a41086a290300370100200141d2016a200141c8006a41106a290300370100200141da016a200141c8006a41186a290300370100200141e0026a41186a220442003703002005420037030020064200370300200142003703e00220004132200141e0026a1002200141b0026a41186a2004290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a1065200010234101210420020d010c0e0b200141e0026a41186a22004200370300200141e0026a41106a22054200370300200141e0026a41086a22064200370300200142003703e00241a69ac100411a200141e0026a1002200141b0026a41186a2000290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b0020240200441ff01714101470d00412010262200450d0d20002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141b0026a412020004120100420001023410021004100210420020d010c0e0b200141b0026a4120100341002100410021042002450d0d0b200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041a886c500410041001001417f460d03200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a106420012d00f8024102460d0420014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001094041a20014188016a41196a200141e8016a41c7001094042001290368370000200141a9016a200141e8006a41086a290300370000200141b1016a200141e8006a41106a290300370000200141b9016a200141e8006a41186a290300370000200120033a00a001200141e0026a41186a220342003703002005420037030020064200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2003290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a106520021023410121032004200045720d0e0c0d0b41124101102a000b41324101102a000b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b410021032004200045720d010b200010230b2002452003720d00200210230b200141c0036a24000bf41a010f7f230041a0036b220124000240024002400240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc74037000020024112413210272202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141d0026a41186a22004200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00220024132200141d0026a1002200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a00202400240200141a0026a412041a886c500410041001001417f460d002001422037026c2001200141a0026a360268200141d0026a200141e8006a10880120012d00dc0222054102460d0420014188016a41086a200141e5026a29000037030020014188016a41106a200141ed026a29000037030020014188016a41186a200141f5026a290000370300200141d8016a41086a20014186036a290100370300200141d8016a41106a2001418e036a290100370300200141d8016a41186a20014196036a290100370300200120012900dd02370388012001200141fe026a2901003703d801200141fd026a2d0000210020012802d402210620012802d0022107200141a0026a412010030c010b410221050b200141286a41186a20014188016a41186a290300370300200141286a41106a220320014188016a41106a290300370300200141286a41086a220420014188016a41086a290300370300200141086a41086a2208200141d8016a41086a290300370300200141086a41106a2209200141d8016a41106a290300370300200141086a41186a200141d8016a41186a2903003703002001200129038801370328200120012903d8013703082002102320054102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2003290300370300200141e8006a41086a2004290300370300200141c8006a41086a2008290300370300200141c8006a41106a2009290300370300200141c8006a41186a200141086a41186a29030037030020012001290328370368200120012903083703484100210a0240200041ff01714101470d00411210262202450d06200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027220a450d07200a2001290348370012200a412a6a200141e0006a290300370000200a41226a200141c8006a41106a290300370000200a411a6a200141c8006a41086a2903003700000b0240024002400240024020054101470d00411210262202450d0c200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027220b450d0d200b2001290368370012200b412a6a200141e8006a41186a290300370000200b41226a200141e8006a41106a290300370000200b411a6a200141e8006a41086a290300370000200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d002200b4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a002200141a0026a412041a886c500410041001001417f460d0e200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10880120012d00dc0222024102460d0f20014188016a41086a2203200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001094041a200120023a00940120014188016a410d6a200141d8016a41c3001094041a200141b5016a20003a0000200141b6016a2001290348370100200141be016a200141c8006a41086a290300370100200141c6016a200141c8006a41106a290300370100200141ce016a200141c8006a41186a290300370100200141d0026a41186a22024200370300200141d0026a41106a22004200370300200c4200370300200142003703d002200b4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d002200128028801210d2001200328020022023602d801200141d8016a200141d0026a104102402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d4022108200d210203400240200820046a411f4b0d00200041206a22032000490d052008410174220f20032003200f491b22034100480d05024002402008450d00200e200820031027220e0d010c090b20031026220e450d080b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a105d20012802d4022102200141a0026a412020012802d0022200200c280200100402402002450d00200010230b0240200128028c01450d00200d10230b200b10234101210d200a0d010c110b200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00241c09ac100411a200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a0020240200041ff01714101470d00412010262202450d1020022001290348370000200241186a200141c8006a41186a290300370000200241106a200141c8006a41106a290300370000200241086a200141c8006a41086a290300370000200141a0026a4120200241201004200210234100210b4100210d200a0d010c110b200141a0026a412010034100210b4100210d200a450d100b200141d0026a41186a22024200370300200141d0026a41106a22004200370300200141d0026a41086a22034200370300200142003703d002200a4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a2003290300370300200120012903d0023703a002200141a0026a412041a886c500410041001001417f460d06200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10880120012d00dc024102460d0720014188016a41086a2202200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001094041a20014188016a410d6a200141d8016a41c30010940420012903683700002001419d016a200141e8006a41086a290300370000200141a5016a200141e8006a41106a290300370000200141ad016a200141e8006a41186a290300370000200120053a009401200141d0026a41186a22004200370300200141d0026a41106a22034200370300200c4200370300200142003703d002200a4132200141d0026a1002200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d00220012802880121052001200228020022023602d801200141d8016a200141d0026a104102402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d40221082005210203400240200820046a411f4b0d00200041206a22032000490d032008410174220f20032003200f491b22034100480d03024002402008450d00200e200820031027220e0d010c060b20031026220e450d050b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a105d20012802d4022102200141a0026a412020012802d0022200200c280200100402402002450d00200010230b0240200128028c01450d00200510230b200a102341012102200d200b45720d110c100b101e000b20034101102a000b20034101102a000b41124101102a000b41324101102a000b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b41002102200d200b45720d010b200b10230b02400240200a45200272450d002006450d020c010b200a10232006450d010b200710230b200141a0036a24000bc30201047f230041d0006b22022400024002400240410f10262203450d00200341076a41002900849544370000200341002900fd94443700002003410f411e10272203450d012003200136000f200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034113200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a102820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031023200241d0006a24000f0b410f4101102a000b411e4101102a000b41d4aac10041331021000bb80a010b7f230041f0016b22022400200220011028024020022802002203450d00200241086a28020021042002280204210541002106200241003a00d00120012802002001280204200241d0016a410120012802081001210720012001280208200741016a41014b22076a220836020802402007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220641002001280200200141046a280200200241d0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d01200241b0016a41186a22072009290300370300200241b0016a41106a2206200a290300370300200241b0016a41086a2209200b290300370300200220022903d0013703b00120024190016a41186a220a200729030037030020024190016a41106a2207200629030037030020024190016a41086a22062009290300370300200220022903b00137039001200241f0006a41186a200a290300370300200241f0006a41106a2007290300370300200241f0006a41086a20062903003703002002200229039001370370410121060b200241d0006a41186a200241f0006a41186a290300370300200241d0006a41106a200241f0006a41106a290300370300200241d0006a41086a200241f0006a41086a2903003703002002200229037037035041002109200241003a00d0012001280200200141046a280200200241d0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220741002001280200200141046a280200200241d0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d01200241b0016a41186a22012009290300370300200241b0016a41106a2207200a290300370300200241b0016a41086a2208200b290300370300200220022903d0013703b00120024190016a41186a2209200129030037030020024190016a41106a2201200729030037030020024190016a41086a22072008290300370300200220022903b00137039001200241f0006a41186a2009290300370300200241f0006a41106a2001290300370300200241f0006a41086a20072903003703002002200229039001370370410121090b200241106a41186a2201200241f0006a41186a290300370300200241106a41106a2207200241f0006a41106a290300370300200241106a41086a2208200241f0006a41086a29030037030020022002290370370310200241306a41186a220a200241d0006a41186a290300370300200241306a41106a220b200241d0006a41106a290300370300200241306a41086a220c200241d0006a41086a29030037030020022002290350370330200020063a000c2000200436020820002005360204200020033602002000412d6a20093a00002000200229033037000d200041156a200c2903003700002000411d6a200b290300370000200041256a200a2903003700002000412e6a2002290310370000200041366a20082903003700002000413e6a2007290300370000200041c6006a2001290300370000200241f0016a24000f0b200041023a000c02402005450d00200310230b200241f0016a24000f0b200041023a000c200241f0016a24000bae23032a7f037e257f230041c0026b2205240002400240024020014115490d00410121064102210741032108413221094105210a417f210b4120210c4100210d411f210e410b210f41602110411821114110211241082113419fc000211441807f2115416821164170211741782118412821194130211a4138211b4101211c4101211d4100211e0c010b410021200c010b410121200b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020200e020001010b20014102490d0c41602149200041606a214a4101214b4105214c417f214d4120214e4118214f411021504108215141002152413821534130215441282155410121564101211e0c010b024002400240201e0e03000d01010b201c201d71211f0c010b203b203e200a746a212002400340203d203e200b6a223e4f0d01200541c0016a2020200c1096042122202020106a222121202022200d480d000c100b0b200020052903c00137000020332038290300370000203520392903003700002037203a2903003700002001203d20066a2220490d0820002020200a746a2100200120206b22014115490d020b2004450d090240201c2006710d0020002001108a012004200b6a21040b2001200776222020086c21212020200674212241002123024020012009490d0020202020200b6a222320002020200a746a20002023200a746a200c1096042224200d4822251b2226202020066a22272023202020251b222020002027200a746a20002020200a746a200c109604200d4822271b222020002020200a746a20002026200a746a200c1096042226200d481b212020222022200b6a222320002022200a746a20002023200a746a200c1096042228200d4822291b222a2022200672222b2023202220291b22222000202b200a746a20002022200a746a200c1096042229200d481b222220002022200a746a2000202a200a746a200c109604222a200d481b212220212021200b6a222320002021200a746a20002023200a746a200c109604222b200d48222c1b222d202120066a222e20232021202c1b22212000202e200a746a20002021200a746a200c1096042223200d481b222120002021200a746a2000202d200a746a200c109604222c200d481b21212007200620251b2024200e7620271b2026200e766a2028200e766a2029200e766a202a200e766a202b200e766a2023200e766a202c200e766a21230b20002022200a746a20002020200a746a200c1096042225200e7620236a20002021200a746a2000202020222025200d4822251b2224200a746a200c1096042226200e766a21230240024002402000202120242026200d481b2221200a746a20002022202020251b222c200a746a200c109604200b4a0d00202320066a2223200f4b0d0120234521200c020b2021212c20234521200c010b024020012006762221450d0020002001200a746a20106a2120200021220340200541206a20116a2223202220116a2225290000370300200541206a20126a2224202220126a2226290000370300200541206a20136a2227202220136a222829000037030020052022290000370320202020136a2229290000212f202020126a222a2900002130202029000021312025202020116a222b290000370000202620303700002028202f370000202220313700002020200529032037000020292027290300370000202a2024290300370000202b2023290300370000202020106a21202022200c6a21222021200b6a22210d000b0b2001202c200b736a212c410121200b0240201f200b73202045722006710d0020002001108b010d0c0b024002402003450d00202c20014f0d0a20032000202c200a746a2220200c109604200d480d01200541206a20116a2232200020116a2233290000370300200541206a20126a2234200020126a2235290000370300200541206a20136a2236200020136a223729000037030020052000290000370320202020136a2222290000212f202020126a22212900002130202029000021312033202020116a2223290000370000203520303700002037202f3700002000203137000020232032290300370000202120342903003700002022203629030037000020202005290320370000200541c0016a20116a22382033290000370300200541c0016a20126a22392035290000370300200541c0016a20136a223a2037290000370300200520002900003703c001200020106a213b2000200c6a213c4100213d41002001223e200b6a22224f0d040c100b2001450d070b202c20014f0d05200541206a20116a221d200020116a223f290000370300200541206a20126a222d200020126a2240290000370300200541206a20136a222e200020136a2241290000370300200520002900003703202000202c200a746a2220290000212f202020136a22222900002130202020126a22212900002131203f202020116a222329000037000020402031370000204120303700002000202f370000202020052903203700002022202e2903003700002021202d2903003700002023201d290300370000200520116a2242203f290000370300200520126a22432040290000370300200520136a22442041290000370300200520002900003703002000200c6a21264100214502402001200b6a2221450d0020262120034020202005200c109604200b4a0d012020200c6a2120204520066a22452021490d000b0b20002001200a746a21202021212202400340202021232022224620454d0d012046200b6a2122202320106a22202005200c109604200d4e0d000b0b20462045490d0420212046490d03418001212c410021244100212a4100212541002129418001211c20262045200a746a2247212603400240024002400240024002400240202320266b222020144b22480d002020200a76222020156a2020202a202449202920254922227222211b21202021450d01201c202020221b211c2020202c20221b212c0b20292025470d020c010b20202020200676221c6b212c20292025470d010b201c450d0141002120200541c0006a22292125202621220340202520203a0000202520222005200c109604200b73200e766a21252022200c6a2122201c202020066a2220470d000b0b202a2024470d020c010b200541c0006a22252129202a2024470d010b0240202c450d00202320106a212041002122200541c0016a222a21240340202420223a0000202420202005200c109604200e766a2124202020106a2120202c202220066a2222470d000c020b0b200541c0016a2224212a0b02402024202a6b2220202520296b2222202220204b1b222b450d00201d202620292d0000200a746a222020116a290000370300202d202020126a290000370300202e202020136a29000037030020052020290000370320202620292d0000200a746a22202023202a2d0000200b73200a746a2222290000370000202020116a202220116a290000370000202020126a202220126a290000370000202020136a202220136a2900003700000240202b2006460d004100212003402023202a20206a22272d0000200b73200a746a22222026202920206a20066a22282d0000200a746a2221290000370000202220116a202120116a290000370000202220126a202120126a290000370000202220136a202120136a290000370000202620282d0000200a746a22222023202720066a2d0000200b73200a746a2221290000370000202220116a202120116a290000370000202220126a202120126a290000370000202220136a202120136a290000370000202020076a2122202020066a222121202022202b490d000b202a20216a212a202920216a21290b2023202a2d0000200b73200a746a22202005290320370000202020116a201d290300370000202020126a202d290300370000202020136a202e290300370000202a20066a212a202920066a21290b2023202c200a746b2023202a2024461b21232026201c200a746a202620292025461b212620480d000b02400240202920254f0d000340201d20262025200b6a22252d0000200a746a222220116a2221290000370300202d202220126a2224290000370300202e202220136a222729000037030020052022290000370320202320106a2220290000212f202320166a22282900002130202320176a222a29000021312021202320186a222329000037000020242031370000202720303700002022202f370000202020052903203700002028202e290300370000202a202d2903003700002023201d2903003700002020212320292025490d000c020b0b0240202a20244f0d002026212003402024200b6a22242d00002122201d202020116a2221290000370300202d202020126a2225290000370300202e202020136a22262900003703002005202029000037032020232022200b73200a746a2222290000212f202220136a22272900002130202220126a222829000021312021202220116a222929000037000020252031370000202620303700002020202f370000202220052903203700002027202e2903003700002028202d2903003700002029201d2903003700002020200c6a2120202a2024490d000c020b0b202621200b203f20422903003700002040204329030037000020412044290300370000200020052903003700000240024002402001202020476b200a7620456a22224d0d00201d203f290000370300202d2040290000370300202e20412900003703002005200029000037032020002022200a746a2220290000212f202020136a22212900002130202020126a22232900002131203f202020116a222529000037000020402031370000204120303700002000202f370000202020052903203700002021202e2903003700002023202d2903003700002025201d290300370000200120226b2221450d0120212022202220214b1b2123200120087621252020200c6a21240240024020222021200b6a22014f0d002000202220022003200410890120202103202421000c010b20242001200220202004108901202221010b202320254f211c204620454d211d200141154f0d02410021200c160b41f4a1c100202220011029000b4184a2c100104f000b4100211e410121200c130b410121200c120b410021200c110b4102211e410121200c100b20462021108c01000b204520461048000b41f4a1c100202c20011029000b41e4a1c100410041001029000b202020011048000b419ca2c100202c20011029000b20002001108d01200541c0026a24000f0b2056204c7421202056204d6a21222056204b6a21560240200020206a222020002022204c746a2221204e109604204d4a0d00200541c0016a204f6a22232020204f6a2225290000370300200541c0016a20506a2224202020506a2226290000370300200541c0016a20516a2227202020516a2228290000370300200520202900003703c001202020212900003700002028202120516a2900003700002026202120506a29000037000020252021204f6a2900003700004100212102402022450d00204a212002400340200541c0016a2020204e10960420524e0d012020204e6a2020290000370000202020536a2020204f6a290000370000202020546a202020506a290000370000202020556a202020516a290000370000202020496a21202022204d6a22220d000c020b0b202221210b20002021204c746a222020052903c0013700002020204f6a2023290300370000202020506a2024290300370000202020516a20272903003700000b204a204e6a214a20562001470d010b200541c0026a24000f0b4101211e410121200c060b2032203c203d200a746a222020116a22222900003703002034202020126a22232900003703002036202020136a2225290000370300200520202900003703202021200c6a2224290000212f202120196a222629000021302021201a6a2227290000213120222021201b6a222129000037000020232031370000202520303700002020202f37000020212032290300370000202720342903003700002026203629030037000020242005290320370000203d20066a223d203e200b6a22224f0d010b203c203d200a746a212002400340200541c0016a2020200c109604200b4c0d012020200c6a2120203d20066a223d2022490d000b4102211e0c020b4102211e0c020b4102211e0c020b410121200c020b410121200c010b410121200c000b0bd40608077f027e017f017e017f017e017f017e230041206b22022400024002400240024020014108490d00200141017641feffffff07712203417f6a220420014f0d032001410d74200173220541117620057322054105742005732206417f2001417f6a677622077122054100200120052001491b6b220520014f0d01200020044105746a220441186a22082900002109200020054105746a2205290000210a200541086a220b290000210c200541106a220d290000210e2008200541186a220f290000370000200441106a220829000021102008200e370000200441086a2208290000210e2008200c3700002004290000210c2004200a370000200241186a2009370300200241106a2010370300200241086a200e370300200f2009370000200d2010370000200b200e3700002005200c3700002002200c370300200320014f0d022006410d7420067322054111762005732205410574200573220620077122054100200120052001491b6b220520014f0d01200020034105746a220441186a22082900002109200020054105746a2205290000210a200541086a220b290000210c200541106a220d290000210e2008200541186a220f290000370000200441106a220829000021102008200e370000200441086a2208290000210e2008200c3700002004290000210c2004200a370000200241186a2009370300200241106a2010370300200241086a200e370300200f2009370000200d2010370000200b200e3700002005200c3700002002200c3703002003410172220420014f0d032006410d742006732205411176200573220541057420057320077122054100200120052001491b6b220520014f0d01200020044105746a220141186a22042900002109200020054105746a2200290000210a200041086a2205290000210c200041106a2203290000210e2004200041186a2206290000370000200141106a220429000021102004200e370000200141086a2204290000210e2004200c3700002001290000210c2001200a370000200241186a2009370300200241106a2010370300200241086a200e37030020062009370000200320103700002005200e3700002000200c3700002002200c3703000b200241206a24000f0b41f4a1c100200520011029000b200321040b41e4a1c100200420011029000b970909077f017e037f017e027f017e027f017e047f230041206b220224000240200141324f0d00410121030240200141014d0d00200041206a200041201096044100480d00200041c0006a21044102210503402005220320014f0d01200341016a21052004200441606a41201096042106200441206a2104200641004e0d000b0b200241206a240020032001460f0b200041a07f6a210741012103410021080240024003400240024002400240200320014f0d00200020034105746a210403402004200441606a41201096044100480d02200441206a2104200341016a22032001490d000b0b4100210420032001460d010c020b4101210420032001470d010b200241206a240041010f0b2003417f6a220520014f0d012004450d02200020054105746a22042900002109200420002003410574220a6a220529000037000020052009370000200241186a220b200441186a220c290000220d370300200241106a220e200441106a220f2900002210370300200241086a2211200441086a221229000022133703002012200541086a221429000037000020142013370000200f200541106a221529000037000020152010370000200c200541186a22162900003700002016200d37000020022009370300024020034102490d00200420002003417e6a22064105746a22174120109604417f4a0d002004290000210920042017290000370000200b200c290000370300200e200f290000370300201120122900003703002012201741086a290000370000200f201741106a290000370000200c201741186a290000370000200220093703004100210c02402006450d002007200a6a21040240034020022004412010960441004e0d01200441206a2004290000370000200441386a200441186a290000370000200441306a200441106a290000370000200441286a200441086a290000370000200441606a21042006417f6a22060d000c020b0b2006210c0b2000200c4105746a22042002290300370000200441186a200b290300370000200441106a200e290300370000200441086a20112903003700000b200841016a21080240200120036b220f4102490d00200541206a220420054120109604417f4a0d002005290000210920052004290000370000200b2016290000370300200e2015290000370300201120142900003703002014200441086a2900003700002015200441106a2900003700002016200441186a29000037000020022009370300410121120240200f4103490d00200541c0006a20024120109604417f4a0d00410321064102210c024003402005200c4105746a220441606a2004290000370000200441786a200441186a290000370000200441706a200441106a290000370000200441686a200441086a2900003700002006200f4f0d0120064105742104200c21122006210c200641016a2106200520046a200241201096044100480d000c020b0b200c21120b200520124105746a22042002290300370000200441186a200b290300370000200441106a200e290300370000200441086a20112903003700000b20084105490d000b200241206a240041000f0b41e4a1c100200520011029000b41f4a1c100200320011029000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241b488c5003602082002200241046a360228200220023602202002200241206a360218200241086a41c488c5001061000be308090d7f017e027f017e017f027e017f017e0d7f230041206b2202240002400240024020014101762203450d00417f210441022105410521064120210741002108411821094108210a4110210b4100210c0c010b410021180c010b410121180b0340024002400240024002400240024002400240024002400240024020180e020001010b4102211920014102490d01417f211a4118211b4105211c4108211d4110211e4101211f4120212041002121200121224101210c0c0a0b02400240200c0e020001010b200320046a2203210d0340200d410174221041017221180240201020056a221020014f0d00201820014f0d0620102018200020182006746a200020102006746a20071096042008481b21180b0240201820014f0d00200d20014f0d042000200d2006746a220d200020182006746a2210200710960420044a0d00200d20096a220e290000210f2010200a6a221129000021122010200b6a2213290000211420102900002115200e201020096a2216290000370000200d200b6a220e2900002117200e2014370000200d200a6a220e2900002114200e2012370000200d2900002112200d2015370000200220096a200f3703002002200b6a20173703002002200a6a20143703002016200f370000201320173700002011201437000020102012370000200220123703002018210d0c010b0b20030d07410021180c0c0b2022201a6a222220014f0d052000201b6a220d290000210f20002022201c746a221829000021152018201d6a221029000021122018201e6a220e2900002114200d2018201b6a22112900003700002000201e6a220d2900002117200d20143700002000201d6a220d2900002114200d201237000020002900002112200020153700002002201b6a220c200f3703002002201e6a222320173703002002201d6a222420143703002011200f370000200e20173700002010201437000020182012370000200220123703004100210d0340200d201f742210201f7221180240201020196a221020224f0d00201820224f0d062010201820002018201c746a20002010201c746a20201096042021481b21180b0240201820224f0d00200d20224f0d042000200d201c746a220d20002018201c746a22102020109604201a4a0d00200d201b6a220e290000210f2010201d6a221129000021122010201e6a2213290000211420102900002115200e2010201b6a2216290000370000200d201e6a220e2900002117200e2014370000200d201d6a220e2900002114200e2012370000200d2900002112200d2015370000200c200f37030020232017370300202420143703002016200f370000201320173700002011201437000020102012370000200220123703002018210d0c010b0b2022201f4b0d070b200241206a24000f0b41f8a3c100200d20011029000b41f8a3c100200d20221029000b41e8a3c100201820011029000b41e8a3c100201820221029000b41f4a1c100202220011029000b4100210c0c010b4101210c0c020b410121180c020b410121180c010b410121180c000b0baa23032a7f037e257f230041c0026b2204240002400240024020014115490d004101210541022106410321074132210841052109417f210a4120210b4100210c411f210d410b210e4160210f411821104110211141082112419fc000211341807f211441682115417021164178211741282118413021194138211a4101211b4101211c4100211d0c010b4100211f0c010b4101211f0b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240201f0e020001010b20014102490d0c41602148200041606a21494101214a4105214b417f214c4120214d4118214e4110214f4108215041002151413821524130215341282154410121554101211d0c010b024002400240201d0e03000d01010b201b201c71211e0c010b203a203d2009746a211f02400340203c203d200a6a223d4f0d01200441c0016a201f200b1096042121201f200f6a2220211f2021200c480d000c100b0b200020042903c0013700002032203729030037000020342038290300370000203620392903003700002001203c20056a221f490d082000201f2009746a21002001201f6b22014115490d020b2003450d090240201b2005710d0020002001108a012003200a6a21030b2001200676221f20076c2120201f200574212141002122024020012008490d00201f201f200a6a22222000201f2009746a200020222009746a200b1096042223200c4822241b2225201f20056a22262022201f20241b221f200020262009746a2000201f2009746a200b109604200c4822261b221f2000201f2009746a200020252009746a200b1096042225200c481b211f20212021200a6a2222200020212009746a200020222009746a200b1096042227200c4822281b22292021200572222a2022202120281b22212000202a2009746a200020212009746a200b1096042228200c481b2221200020212009746a200020292009746a200b1096042229200c481b212120202020200a6a2222200020202009746a200020222009746a200b109604222a200c48222b1b222c202020056a222d20222020202b1b22202000202d2009746a200020202009746a200b1096042222200c481b2220200020202009746a2000202c2009746a200b109604222b200c481b21202006200520241b2023200d7620261b2025200d766a2027200d766a2028200d766a2029200d766a202a200d766a2022200d766a202b200d766a21220b200020212009746a2000201f2009746a200b1096042224200d7620226a200020202009746a2000201f20212024200c4822241b22232009746a200b1096042225200d766a21220240024002402000202020232025200c481b22202009746a20002021201f20241b222b2009746a200b109604200a4a0d00202220056a2222200e4b0d01202245211f0c020b2020212b202245211f0c010b024020012005762220450d00200020012009746a200f6a211f200021210340200441206a20106a2222202120106a2224290000370300200441206a20116a2223202120116a2225290000370300200441206a20126a2226202120126a222729000037030020042021290000370320201f20126a2228290000212e201f20116a2229290000212f201f29000021302024201f20106a222a2900003700002025202f3700002027202e37000020212030370000201f20042903203700002028202629030037000020292023290300370000202a2022290300370000201f200f6a211f2021200b6a21212020200a6a22200d000b0b2001202b200a736a212b4101211f0b0240201e200a73201f45722005710d0020002001108b010d0c0b024002402002450d00202b20014f0d0a20022000202b2009746a221f200b109604200c480d01200441206a20106a2231200020106a2232290000370300200441206a20116a2233200020116a2234290000370300200441206a20126a2235200020126a223629000037030020042000290000370320201f20126a2221290000212e201f20116a2220290000212f201f29000021302032201f20106a22222900003700002034202f3700002036202e37000020002030370000202220312903003700002020203329030037000020212035290300370000201f2004290320370000200441c0016a20106a22372032290000370300200441c0016a20116a22382034290000370300200441c0016a20126a22392036290000370300200420002900003703c0012000200f6a213a2000200b6a213b4100213c41002001223d200a6a22214f0d040c100b2001450d070b202b20014f0d05200441206a20106a221c200020106a223e290000370300200441206a20116a222c200020116a223f290000370300200441206a20126a222d200020126a2240290000370300200420002900003703202000202b2009746a221f290000212e201f20126a2221290000212f201f20116a22202900002130203e201f20106a2222290000370000203f20303700002040202f3700002000202e370000201f20042903203700002021202d2903003700002020202c2903003700002022201c290300370000200420106a2241203e290000370300200420116a2242203f290000370300200420126a22432040290000370300200420002900003703002000200b6a21254100214402402001200a6a2220450d002025211f0340201f2004200b109604200a4a0d01201f200b6a211f204420056a22442020490d000b0b200020012009746a211f2020212102400340201f21222021224520444d0d012045200a6a21212022200f6a221f2004200b109604200c4e0d000b0b20452044490d0420202045490d03418001212b41002123410021294100212441002128418001211b202520442009746a2246212503400240024002400240024002400240202220256b221f20134b22470d00201f200976221f20146a201f2029202349202820244922217222201b211f2020450d01201b201f20211b211b201f202b20211b212b0b20282024470d020c010b201f201f200576221b6b212b20282024470d010b201b450d014100211f200441c0006a222821242025212103402024201f3a0000202420212004200b109604200a73200d766a21242021200b6a2121201b201f20056a221f470d000b0b20292023470d020c010b200441c0006a2224212820292023470d010b0240202b450d002022200f6a211f41002121200441c0016a222921230340202320213a00002023201f2004200b109604200d766a2123201f200f6a211f202b202120056a2221470d000c020b0b200441c0016a222321290b0240202320296b221f202420286b22212021201f4b1b222a450d00201c202520282d00002009746a221f20106a290000370300202c201f20116a290000370300202d201f20126a2900003703002004201f290000370320202520282d00002009746a221f202220292d0000200a732009746a2221290000370000201f20106a202120106a290000370000201f20116a202120116a290000370000201f20126a202120126a2900003700000240202a2005460d004100211f034020222029201f6a22262d0000200a732009746a222120252028201f6a20056a22272d00002009746a2220290000370000202120106a202020106a290000370000202120116a202020116a290000370000202120126a202020126a290000370000202520272d00002009746a22212022202620056a2d0000200a732009746a2220290000370000202120106a202020106a290000370000202120116a202020116a290000370000202120126a202020126a290000370000201f20066a2121201f20056a2220211f2021202a490d000b202920206a2129202820206a21280b202220292d0000200a732009746a221f2004290320370000201f20106a201c290300370000201f20116a202c290300370000201f20126a202d290300370000202920056a2129202820056a21280b2022202b2009746b202220292023461b21222025201b2009746a202520282024461b212520470d000b02400240202820244f0d000340201c20252024200a6a22242d00002009746a222120106a2220290000370300202c202120116a2223290000370300202d202120126a2226290000370300200420212900003703202022200f6a221f290000212e202220156a2227290000212f202220166a222929000021302020202220176a2222290000370000202320303700002026202f3700002021202e370000201f20042903203700002027202d2903003700002029202c2903003700002022201c290300370000201f212220282024490d000c020b0b0240202920234f0d002025211f03402023200a6a22232d00002121201c201f20106a2220290000370300202c201f20116a2224290000370300202d201f20126a22252900003703002004201f29000037032020222021200a732009746a2221290000212e202120126a2226290000212f202120116a222729000021302020202120106a2228290000370000202420303700002025202f370000201f202e370000202120042903203700002026202d2903003700002027202c2903003700002028201c290300370000201f200b6a211f20292023490d000c020b0b2025211f0b203e2041290300370000203f204229030037000020402043290300370000200020042903003700000240024002402001201f20466b20097620446a22214d0d00201c203e290000370300202c203f290000370300202d204029000037030020042000290000370320200020212009746a221f290000212e201f20126a2220290000212f201f20116a22222900002130203e201f20106a2224290000370000203f20303700002040202f3700002000202e370000201f20042903203700002020202d2903003700002022202c2903003700002024201c290300370000200120216b2220450d0120202021202120204b1b212220012007762124201f200b6a21230240024020212020200a6a22014f0d002000202120022003108e01201f2102202321000c010b20232001201f2003108e01202121010b202220244f211b204520444d211c200141154f0d024100211f0c160b41f4a1c100202120011029000b4184a2c100104f000b4100211d4101211f0c130b4101211f0c120b4100211f0c110b4102211d4101211f0c100b20452020108c01000b204420451048000b41f4a1c100202b20011029000b41e4a1c100410041001029000b201f20011048000b419ca2c100202b20011029000b20002001108d01200441c0026a24000f0b2055204b74211f2055204c6a21212055204a6a215502402000201f6a221f20002021204b746a2220204d109604204c4a0d00200441c0016a204e6a2222201f204e6a2224290000370300200441c0016a204f6a2223201f204f6a2225290000370300200441c0016a20506a2226201f20506a22272900003703002004201f2900003703c001201f20202900003700002027202020506a29000037000020252020204f6a29000037000020242020204e6a2900003700004100212002402021450d002049211f02400340200441c0016a201f204d10960420514e0d01201f204d6a201f290000370000201f20526a201f204e6a290000370000201f20536a201f204f6a290000370000201f20546a201f20506a290000370000201f20486a211f2021204c6a22210d000c020b0b202121200b20002020204b746a221f20042903c001370000201f204e6a2022290300370000201f204f6a2023290300370000201f20506a20262903003700000b2049204d6a214920552001470d010b200441c0026a24000f0b4101211d4101211f0c060b2031203b203c2009746a221f20106a22212900003703002033201f20116a22222900003703002035201f20126a22242900003703002004201f2900003703202020200b6a2223290000212e202020186a2225290000212f202020196a2226290000213020212020201a6a2220290000370000202220303700002024202f370000201f202e37000020202031290300370000202620332903003700002025203529030037000020232004290320370000203c20056a223c203d200a6a22214f0d010b203b203c2009746a211f02400340200441c0016a201f200b109604200a4c0d01201f200b6a211f203c20056a223c2021490d000b4102211d0c020b4102211d0c020b4102211d0c020b4101211f0c020b4101211f0c010b4101211f0c000b0bed0b05077f017e027f017e027f23004190026b22022400200241f0016a41186a22034200370300200241f0016a41106a22044200370300200241f0016a41086a22054200370300200242003703f001200241f0016a2001280200220620012802042207412020074120491b22081094041a2001200720086b3602042001200620086a360200024002402007411f4d0d00200241d0016a41186a22072003290300370300200241d0016a41106a22082004290300370300200241d0016a41086a22062005290300370300200220022903f0013703d001200241b0016a41186a2007290300370300200241b0016a41106a2008290300370300200241b0016a41086a2006290300370300200220022903d0013703b001410121070c010b410021070b200241f0016a41186a2208200241b0016a41186a290300370300200241f0016a41106a2206200241b0016a41106a290300370300200241f0016a41086a2203200241b0016a41086a290300370300200220022903b0013703f001024002400240024002402007450d00200241f0006a41186a2008290300370300200241f0006a41106a2006290300370300200241f0006a41086a2003290300370300200220022903f0013703702002200110462002290300a7450d0120022903082109200241f0016a41186a22054200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200241f0016a20012802002204200141046a22032802002207412020074120491b22081094041a2003200720086b22063602002001200420086a22083602002007411f4d0d02200241d0016a41186a22072005290300370300200241d0016a41106a2204200a290300370300200241d0016a41086a2205200b290300370300200220022903f0013703d00120024190016a41186a200729030037030020024190016a41106a200429030037030020024190016a41086a2005290300370300200220022903d00137039001200241f0016a2006412020064120491b22076a41004100412020076b2007411f4b1b1093041a200241f0016a200820071094041a2003200620076b3602002001200820076a3602002006411f4d0d03200241d0016a41186a2207200241f0016a41186a290300370300200241d0016a41106a2208200241f0016a41106a290300370300200241d0016a41086a2206200241f0016a41086a290300370300200220022903f0013703d001200241b0016a41186a22032007290300370300200241b0016a41106a22072008290300370300200241b0016a41086a22082006290300370300200220022903d0013703b001200241f0016a200110900120022802f0012201450d0420022902f401210c200241d0006a41186a2206200241f0006a41186a290300370300200241d0006a41106a2204200241f0006a41106a290300370300200241d0006a41086a2205200241f0006a41086a290300370300200241306a41086a220a20024190016a41086a290300370300200241306a41106a220b20024190016a41106a290300370300200241306a41186a220d20024190016a41186a290300370300200241106a41086a220e2008290300370300200241106a41106a22082007290300370300200241106a41186a22072003290300370300200220022903703703502002200229039001370330200220022903b0013703102000200c37020c2000200136020820002009370300200041146a20022903503702002000411c6a2005290300370200200041246a20042903003702002000412c6a2006290300370200200041346a20022903303702002000413c6a200a290300370200200041c4006a200b290300370200200041cc006a200d290300370200200041ec006a2007290300370200200041e4006a2008290300370200200041dc006a200e290300370200200041d4006a200229031037020020024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000b9d0d03027f017e137f230041f0006b22022400200241106a2001104502400240024002400240024002400240024002402002280210450d0020022802142203ad42247e2204422088a70d092004a72205417f4c0d092005450d01200510262206450d032003450d020c040b20004100360200200241f0006a24000f0b4104210620030d020b4100210e4100210d0c020b20054104102a000b200241d0006a41046a21072002413d6a2108200241d7006a2109200241e3006a220a41056a210b4100210c2003210d4100210e0340200141046a220f2802002105200241003a0050200241d0006a20012802002210200541004722111094041a02400240024002400240024020052011490d00200f200520116b22123602002001201020116a221336020002400240024002400240024002402005450d004105211120022d0050220541064b0d0a024020050e07000d030d020405000b200241086a200110452002280208450d0a200228020c2210417f4c0d122010450d05201010ac012212450d0820122001280200200f2802002205201020052010491b22051094041a200f28020022132005490d09200f201320056b3602002001200128020020056a36020020052010470d060c0b0b410521110c090b200241d0006a200110a30220022802542210450d0820022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410221110c0a0b200241d0006a2012412020124120491b22056a41004100412020056b2005411f4b1b1093041a200241d0006a201320051094041a200f201220056b3602002001201320056a3602002012411f4d0d07200241c0006a41086a200941086a280000360200200220092900003703402002200a2900003703302002200b29000037003520022f0150210520022d0052211120022800532115200841026a200241cd006a41026a2d00003a0000200820022f004d3b0000201541087621142005201141107472211741002111200228024021100c090b200241d0006a200110a30220022802542210450d0620022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410321110c080b200241d0006a200110a30220022802542210450d0520022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410121110c070b4101211241002010460d050b2010450d03201210230c030b201120051048000b20104101102a000b200520131048000b0c010b200241c0006a41086a2002280250360200200241306a41086a200741086a2902003703002002200729020037033020022010ad22044220862004843703402012410876211441042111201221150b20072002290330370200200741086a200241306a41086a2903003702002002200241c0006a41086a28020036025020114105460d022002280244210f200241186a41106a2212200241d0006a41106a280200360200200241186a41086a2213200241d0006a41086a290200370300200220022902503703180240200e200d470d00200d41016a2205200d490d04200d4101742216200520052016491b2205ad42247e2204422088a70d042004a722164100480d0402400240200d450d002006200d41246c2016102722060d010c070b201610262206450d060b2005210d0b2006200c6a220520113a00002005410c6a200f360200200541086a2010360200200541046a2014410874201541ff017172360200200541036a20174110763a0000200541016a20173b0000200541206a2012280200360200200541186a2013290300370200200541106a2002290318370200200c41246a210c200e41016a220e2003490d000b0b2000200d36020420002006360200200041086a200e360200200241f0006a24000f0b200041003602000240200e450d002006210503400240024020052d0000221141034b0d0002400240024020110e0404000102040b2005410c6a280200450d03200541086a2802001023200541246a2105200c415c6a220c0d040c050b2005410c6a280200450d02200541086a2802001023200541246a2105200c415c6a220c0d030c040b2005410c6a280200450d01200541086a2802001023200541246a2105200c415c6a220c0d020c030b200541086a280200450d00200541046a28020010230b200541246a2105200c415c6a220c0d000b0b0240200d450d00200610230b200241f0006a24000f0b101e000b20164104102a000b101d000bf71c09017f017e037f017e057f037e027f027e027f230041c0006b2200240020004188a4c10041101092012000290308210120002802002102200041306a41086a220342003703002000420037033041f3a6c1004115200041306a1000200041106a41086a2003290300370300200020002903303703100240024002400240024002400240024002400240024002400240024002400240200041106a411041a886c500410041001001417f460d00200041003a0030200041106a4110200041306a41014100100141016a41014d0d0120002d00300d050b410810262204450d0120044200370300200041306a41086a22034200370300200042003703304198a4c1004115200041306a1000200041106a41086a200329030037030020002000290330370310200041003602382000420137033020004101360220200041206a200041306a10412004290300210502400240024020002802342206200028023822076b41084f0d00200741086a22082007490d0820064101742203200820082003491b22094100480d082006450d0120002802302006200910272203450d020c050b200741086a2108200028023021030c050b2009102622030d030b20094101102a000b41d4aac10041331021000b41084108102a000b2000200936023420002003360230200921060b200041306a41086a2008360200200320076a2005370000200041106a411020032008100402402006450d00200310230b20041023024002400240410810262208450d0020084200370300200041306a41086a22034200370300200042003703304188a7c1004116200041306a1000200041106a41086a200329030037030020002000290330370310200041003602382000420137033020004101360220200041206a200041306a10412008290300210502400240024020002802342207200028023822066b41084f0d00200641086a22032006490d0720074101742204200320032004491b22034100480d072007450d0120002802302007200310272204450d020c040b200028023021040c040b2003102622040d020b20034101102a000b41084108102a000b2000200336023420002004360230200321070b200041306a41086a2203200641086a2209360200200420066a2005370000200041106a411020042009100402402007450d00200410230b200810232003420037030020004200370330419ea7c1004110200041306a1000200041106a41086a220420032903003703002000200029033037031020004200370330200041106a4110200041306a41081004200041013a0020200342003703002000420037033041f3a6c1004115200041306a10002004200329030037030020002000290330370310200041106a4110200041206a410110040b4108210a4200210b200041306a41086a22034200370300200042003703304198a4c1004115200041306a1000200041106a41086a200329030037030020002000290330370310024002400240024002400240024002400240200041106a411041a886c500410041001001417f460d00200042103702242000200041106a360220200041306a200041206a1093012000280230220a450d012000290234210b0b410821074200210c200041306a41086a22034200370300200042003703304188a7c1004116200041306a1000200041106a41086a2003290300370300200020002903303703100240200041106a411041a886c500410041001001417f460d00200042103702242000200041106a360220200041306a200041206a10930120002802302207450d022000290234210c0b200041306a41086a220342003703002000420037033041aea7c1004114200041306a1000200041106a41086a20032903003703002000200029033037031002400240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d014201200029033022052005501b210d200b422088a7210e20020d050c040b42e500210d200b422088a7210e2002450d030c040b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b200e417f6a2203200e4b0d012003200e4f0d01200a20034103746a2203450d01200329030021010b4100200e41016a2203200da7417f200d428080808010541b6b2204200420034b1b220f200e4b0d01200a200f4103746a21090240024002400240200f450d00200c4220882110200a21020340200229030021054100210302402010a722044101460d002004450d0341002103034020032004410176220820036a22062005200720064103746a290300541b2103200420086b220441014b0d000b0b2005200720034103746a22042903002211520d0320102003ad580d042004200441086a2003417f732010a76a4103741095041a200c42ffffffff0f8320104220864280808080707c84210c2010427f7c2110200241086a22022009470d000b0b200b42ffffffff0f8321100240200e200f6b2203450d000240200f450d00200a200920034103741095041a0b2003ad42208620108421100b410021030240200c4220882205a72202450d00024020024101460d004100210320022104034020032004410176220820036a22062001200720064103746a290300541b2103200420086b220441014b0d000b0b200320032001200720034103746a2903002211566a20012011511b220320024b0d060b2002200ca7470d06200241016a22042002490d072005a722064101742208200420042008491bad220c4203862211422088a70d072011a722044100480d07024002402002450d0020072006410374200410272207450d010c080b2004102622070d070b20044108102a000b4100109401000b200320052011566a109401000b41fcc3c200104f000b41c2a7c10041261021000b41cce3c400104f000b4180e4c400104f000b200720034103746a220441086a2004200220036b4103741095041a2004200137030002402010a72010422088220ba72203470d00200341016a22042003490d0120034101742208200420042008491bad22104203862211422088a70d012011a722044100480d01024002402003450d00200a200341037420041027220a450d010c020b20041026220a0d010b20044108102a000b200a20034103746a20013703002005a7221241016a2213450d052013410176220320134f0d06200720034103746a2903002111024020134101710d002003417f6a220320134f0d08200720034103746a29030020117c42018821110b200041306a41086a220f4200370300200042003703304198a4c1004115200041306a1000200041106a41086a200f2903003703002000200029033037031020004100360238200042013703302000200b42017c2201a72203360220200041206a200041306a1041024002402003450d002003410374210e4100200f28020022036b210420002802342106200a21080340200829030021050240024002400240200620046a41084f0d00200341086a22022003490d0720064101742209200220022009491b22094100480d072006450d01200028023020062009102722020d020c090b200028023021020c020b200910262202450d070b2000200936023420002002360230200921060b200841086a2108200f200341086a2209360200200220036a2005370000200441786a210420092103200e41786a220e0d000c020b0b200f280200210920002802342106200028023021020b200041106a411020022009100402402006450d00200210230b02402010a7450d00200a10230b200041306a41086a220f4200370300200042003703304188a7c1004116200041306a1000200041106a41086a200f29030037030020002000290330370310200042013703302000410036023820002013360220201241037441086a2109200041206a200041306a10414100200028023822036b210420002802342106200721080340200829030021050240024002400240200620046a41084f0d00200341086a22022003490d052006410174220e20022002200e491b220e4100480d052006450d0120002802302006200e102722020d020c060b200028023021020c020b200e10262202450d040b2000200e36023420002002360230200e21060b200841086a2108200f200341086a220e360200200220036a2005370000200441786a2104200e2103200941786a22090d000b200041106a41102002200e100402402006450d00200210230b0240200ca7450d00200710230b42002105200041306a41086a2203420037030020004200370330419ea7c1004110200041306a1000200041106a41086a220420032903003703002000200029033037031020002011370330200041106a4110200041306a410810040240200d200142ffffffff0f83520d00200342003703002000420037033041af98c300410d200041306a100020042003290300370300200020002903303703100240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d05200029033021050b200041306a41086a220342003703002000420037033041c0a8c1004117200041306a1000200041106a41086a20032903003703002000200029033037031002400240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d07200029033021100c010b42e80721100b2011200d4201887c20107c2005560d00200041306a41086a220342003703002000420037033041aec8c3004117200041306a1000200041106a41086a200329030037030020002000290330370310410810262203450d092003200d427f7c37000020034108411010272203450d0a20032011370008200041106a4110200341101004200310230b200041c0006a24000f0b101e000b200e4101102a000b20094101102a000b41d4aac10041331021000b41d4aac10041331021000b4198a8c100104f000b41b0a8c100200320131029000b41b0a8c100200320131029000b41084101102a000b41104101102a000bbd0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1000200341086a2005290300370300200320032903103703000240024002402003411041a886c500410041001001417f460d002003420037031020034110200341106a41084100100141016a41084d0d0220032903102106200341101003420121040c010b0b2000200437030020002006370308200341206a24000f0b41d4aac10041331021000bc10304027f017e087f017e230041106b2202240020022001104a02400240024002400240024002400240024002402002280200450d0020022802042203ad2204421d88a70d032004420386a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241106a24000f0b4108210620030d030b410021054100210b0c030b101d000b20054108102a000b200141046a210741002108410021094100210a2003210b034020024200370308200141086a2205410020012802002007280200200241086a410820052802001001220c200c417f461b220c4108200c4108491b20052802006a360200200c41074d0d02200a41016a2105200229030821040240200a200b470d002008200520052008491b220bad420386220d422088a70d04200da7220c4100480d040240200a450d0020062009200c102722060d010c060b200c10262206450d050b200620096a2004370300200841026a2108200941086a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610230b200241106a24000f0b101e000b200c4108102a000b7d01017f230041c0006b220124002001412e36020c200141e8a7c100360208200120003602142001413c6a41063602002001412c6a4102360200200141013602342001420237021c2001419083c5003602182001200141146a3602382001200141086a3602302001200141306a360228200141186a41a083c5001061000b1300200041013602042000419ca9c1003602000b8c0605027f027e017f027e027f230041a0016b22022400200028020021000240024002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0120054290ce005441002004501b0d0241272100200241186a21060340200241106a200520044290ce0042001097042002200229031022072006290300220842f0b17f427f109804200241206a20006a2203417c6a200520022903007ca7220941e4006e220a41017441ea86c5006a2f00003b00002003417e6a200a419c7f6c20096a41017441ea86c5006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000b2007a7220341e3004a0d030c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d032001410141d889c5004102200241206a20006a41800120006b1097012100200241a0016a240020000f0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d032001410141d889c5004102200241206a20006a41800120006b1097012100200241a0016a240020000f0b412721002005a7220341e3004c0d030b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441ea86c5006a2f00003b0000200941094a0d030c040b20004180011048000b20004180011048000b2003220941094c0d010b200241206a2000417e6a22006a200941017441ea86c5006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141a886c5004100200241206a20006a412720006b1097012100200241a0016a240020000bd70601067f024002400240024002400240024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21082006410471450d010c020b200541016a2108412d2107200028020022064104710d010b410021024101210120002802084101470d010c020b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21084101210120002802084101460d010b20002007200220031082040d012000280218200420052000411c6a28020028020c1102000f0b024002400240024002400240024002402000410c6a280200220920084d0d0020064108710d01200920086b210b410120002d0030220120014103461b2201410371450d0220014102460d03200b21094100210b0c040b20002007200220031082040d072000280218200420052000411c6a28020028020c1102000f0b41012101200041013a00302000413036020420002007200220031082040d06200920086b21084101200041306a2d0000220120014103461b2201410371450d0320014102460d0420082109410021080c050b410021090c010b200b4101762109200b41016a410176210b0b417f2101200041046a210a200041186a21082000411c6a210602400340200141016a220120094f0d012008280200200a2802002006280200280210110300450d000b41010f0b200041046a280200210a4101210120002007200220031082040d03200041186a2209280200200420052000411c6a220328020028020c1102000d0320092802002100417f2109200328020041106a21030340200941016a2209200b4f0d05410121012000200a2003280200110300450d000c040b0b410021090c010b20084101762109200841016a41017621080b417f2101200041046a210a200041186a21032000411c6a210202400340200141016a220120094f0d012003280200200a2802002002280200280210110300450d000b41010f0b200041046a280200210a41012101200041186a2209280200200420052000411c6a220328020028020c1102000d0020092802002100417f2109200328020041106a21030340200941016a220920084f0d03410121012000200a2003280200110300450d000b0b20010f0b41000f0b41000b11002000280200200028020420011099010b951102167f017e230041206b22032400410121040240200228021841222002411c6a2802002802101103000d00024002402001450d00200020016a2105200241186a21062002411c6a210720002108410021094100210a024003402008210b200841016a210c024002400240024002400240024002400240024020082c0000220d4100480d00200d41ff0171210d0c010b024002400240200c2005460d00200c2d0000413f71210e200841026a2208210c200d411f71210f200d41ff0171220d41e001490d010c020b4100210e20052108200d411f71210f200d41ff0171220d41e0014f0d010b200e200f41067472210d0c010b0240024020082005460d00200841016a220c211020082d0000413f71200e41067472210e200d41f001490d010c030b200521104100200e41067472210e200d41f0014f0d020b200e200f410c7472210d0b200c21084102210c200d41776a220f411e4d0d010c020b0240024020102005460d00201041016a210820102d0000413f71210d0c010b4100210d200c21080b200e410674200f411274418080f0007172200d72220d418080c400460d084102210c200d41776a220f411e4b0d010b41f400210e024002400240200f0e1f07010505000505050505050505050505050505050505050505040505050504070b41f200210e0c010b41ee00210e0b0c040b200d41dc00470d010b0c010b0240200d1086040d0002400240200d41ffff034b0d00200d4180fe0371410876211141a098c5002112410021134100210c0c010b0240200d41ffff074b0d00200d4180fe0371410876211641db9dc5002117410021184101210c0c010b200d41ef83384b0d01200d41e28b746a41e28d2c490d01200d419fa8746a419f18490d01200d41dee2746a410e490d01200d41feffff0071419ef00a460d01200d41a9b2756a4129490d01200d41cb91756a410a4d0d010c040b0240034002400240200c0e020001010b201241026a2114201320122d0001220c6a2110024002400240024002400240024020122d0000220e2011470d0020102013490d06201041b0024f0d05201341f098c5006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c0b0b0b200e20114b0d012010211320142112201441f098c500470d030c010b2010211320142112201441f098c500470d010b200d41ffff0371210e419f9bc500210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b0240201041db9dc500460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41b88ac500104f000b200f410173210f200c41db9dc500470d000b0b200f410171450d070c0a0b4100210c0c040b4100210c0c030b201041af02108c01000b201320101048000b201741026a2114201820172d0001220c6a211002400240024002400240024020172d0000220e2016470d0020102018490d072010419f014f0d052018419d9ec5006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c090b0b200e20164b0d0120102118201421172014419d9ec500470d030c010b20102118201421172014419d9ec500470d010b200d41ffff0371210e41bb9fc500210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b0240201041b8a2c500460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41b88ac500104f000b200f410173210f200c41b8a2c500470d000b0b200f410171450d050c080b4101210c0c020b4101210c0c010b0b2010419e01108c01000b201820101048000b200d41017267410276410773ad4280808080d0008421194103210c0b200d210e0b2003200136020420032000360200200320093602082003200a36020c02400240200a2009490d0002402009450d0020092001460d00200920014f0d01200020096a2c000041bf7f4c0d010b0240200a450d00200a2001460d00200a20014f0d012000200a6a2c000041bf7f4c0d010b2006280200200020096a200a20096b200728020028020c1102000d0103400240024002400240024002400240200c4101460d0041dc0021090240200c4102460d00200c4103470d062019422088a741ff0171417f6a220c41044b0d060240200c0e050006040503000b201942ffffffff8f608321194103210c41fd0021090c070b4101210c0c060b4100210c200e21090c050b201942ffffffff8f60834280808080c0008421194103210c0c040b201942ffffffff8f60834280808080208421194103210c41fb0021090c030b201942ffffffff8f60834280808080308421194103210c41f50021090c020b200e2019a7220f410274411c7176410f71220c413072200c41d7006a200c410a491b21090240200f450d002019427f7c42ffffffff0f832019428080808070838421194103210c0c020b201942ffffffff8f60834280808080108421194103210c0c010b4101210c0240200d418001490d004102210c200d418010490d0041034104200d41808004491b210c0b200c200a6a2109200a200b6b20086a210a20052008470d050c060b200628020020092007280200280210110300450d000b200341206a240041010f0b20032003410c6a3602182003200341086a36021420032003360210200341106a108a04000b200341206a240041010f0b200a200b6b20086a210a20052008470d000b0b2009450d0120092001460d010240200920014f0d00200020096a2c000041bf7f4a0d020b2000200120092001108304000b410021090b200241186a220c280200200020096a200120096b2002411c6a220a28020028020c1102000d00200c2802004122200a28020028021011030021040b200341206a240020040bc9bb02092b7f017efa017f027e7d7f017e797f027e057f230041e0006b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410d4b0d00024020040e0e00090607030a0c080e050d02040b000b200141186a2802002105200141146a2802002106200141106a28020021072001410c6a2802002108200141086a2802002109200141046a280200210a200241046a280200200241086a2802002204470d16200441016a220b2004490d5a2004410174220c200b200b200c491b220c4100480d5a2004450d2d20022802002004200c1027220b450d2e0c570b2001410c6a280200210b200141086a2802002107200141046a280200210520012d0001210d200241046a280200200241086a2802002204470d0d200441016a22062004490d592004410174220e20062006200e491b220e4100480d592004450d1c20022802002004200e10272206450d1d0c540b2001410c6a280200210f200141086a2802002110200141046a2802002111200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d1d2002280200200420051027220b450d1e0c510b2001410c6a2802002112200141086a2802002113200141046a2802002114200241046a280200200241086a2802002204470d0d200441016a220b2004490d5720044101742205200b200b2005491b22054100480d572004450d1e2002280200200420051027220b450d1f0c4e0b200141146a2802002115200141106a28020021162001410c6a2802002117200141086a2802002118200141056a2d00002119200141046a2d0000211a200241046a280200200241086a2802002204470d0d200441016a220b2004490d5720044101742205200b200b2005491b22054100480d572004450d1f2002280200200420051027220b450d200c4b0b2001410c6a280200211b200141086a280200211c200141046a280200211d200241046a280200200241086a2802002204470d0d200441016a220b2004490d5520044101742205200b200b2005491b22054100480d552004450d202002280200200420051027220b450d210c480b2001410c6a2802002106200141086a280200211e200141046a280200211f200241046a280200200241086a2802002204470d0d200441016a220b2004490d5420044101742205200b200b2005491b22054100480d542004450d212002280200200420051027220b450d220c450b2001410c6a2802002106200141086a2802002120200141046a2802002121200241046a280200200241086a2802002204470d0d200441016a220b2004490d5320044101742205200b200b2005491b22054100480d532004450d222002280200200420051027220b450d230c420b2001410c6a2802002106200141086a2802002122200141046a2802002123200241046a280200200241086a2802002204470d0d200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d232002280200200420051027220b450d240c3f0b2001410c6a2802002106200141086a2802002124200141046a2802002125200241046a280200200241086a2802002204470d0e200441016a220b2004490d5120044101742205200b200b2005491b22054100480d512004450d262002280200200420051027220b450d270c3c0b2001410c6a2802002126200141086a2802002127200141046a2802002128200241046a280200200241086a2802002204470d0e200441016a220b2004490d5020044101742205200b200b2005491b22054100480d502004450d272002280200200420051027220b450d280c390b200141286a2802002108200141246a2802002129200141206a280200212a2001411c6a280200212b200141186a280200212c200141146a280200212d2001410c6a290200212e200141086a280200212f200141046a2802002130200241046a280200200241086a2802002231470d0e203141016a22042031490d5020314101742232200420042032491b22324100480d502031450d2820022802002031203210272204450d290c360b2001410c6a2802002133200141086a2802002134200141046a2802002135200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d292002280200200420051027220b450d2a0c330b2001410c6a2802002136200141086a2802002137200141046a2802002138200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d2a2002280200200420051027220b450d2b0c300b200141046a2802002104200241046a280200200241086a280200220b470d0e200b41016a2205200b490d4c200b4101742206200520052006491b22064100480d4c200b450d2b2002280200200b200610272205450d2c0c2d0b200228020021060c470b2002280200210b0c440b2002280200210b0c410b2002280200210b0c3e0b2002280200210b0c3b0b2002280200210b0c380b2002280200210b0c350b2002280200210b0c320b2002280200210b0c410b2002280200210b0c2e0b2002280200210b0c2b0b200228020021040c280b2002280200210b0c250b2002280200210b0c220b200228020021050c1f0b200e102622060d370b200e4101102a000b20051026220b0d330b20054101102a000b20051026220b0d2f0b20054101102a000b20051026220b0d2b0b20054101102a000b20051026220b0d270b20054101102a000b20051026220b0d230b20054101102a000b20051026220b0d1f0b20054101102a000b20051026220b0d1b0b20054101102a000b200c1026220b0d290b200c4101102a000b20051026220b0d150b20054101102a000b20051026220b0d110b20054101102a000b2032102622040d0d0b20324101102a000b20051026220b0d090b20054101102a000b20051026220b0d050b20054101102a000b2006102622050d010b20064101102a000b20022005360200200241046a2006360200200241086a280200210b0b200241086a200b41016a3602002005200b6a41083a00004101210e410021064100210b024002400240024003400240200b2006470d0020064101742205200641016a220720072005491b22054100480d23024002402006450d00200e200620051027220e0d010c040b20051026220e450d030b200521060b200e200b6a200441807f72200441ff0071200441077622051b3a0000200b41016a210b2005210420050d000b200b417f6a2109200241086a2107200241046a2139200b210503400240024002400240203928020020072802002204470d00200441016a220d2004490d2620044101742208200d200d2008491b22084100480d262004450d012002280200200420081027220d0d020c060b2002280200210d0c020b20081026220d450d040b2002200d36020020392008360200200728020021040b2007200441016a360200200d20046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b0240200241046a2802002205200241086a28020022046b20094d0d00200228020021050c040b2004200b6a22072004490d2120054101742204200720072004491b22044100480d21024002402005450d0020022802002005200410272205450d010c040b2004102622050d030b20044101102a000b20054101102a000b20084101102a000b20022005360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200520046a200e200b1094041a4101213902402006450d00200e10230b4101210e4101210d410621040c1c0b2002200b360200200241046a2005360200200241086a28020021040b41012196024108219702200241086a200441016a360200200b20046a410a3a000041002198022003412c6a229902410036020020034201370224200320023602202038203641186c6a219a024107219b0241ff00219c0241807f219d024100219e024100219f02203621a0020240024041004100460d00411621450c010b41152145410e21040c1b0b410e21040c1a0b2002200b360200200241046a2005360200200241086a28020021040b41012189024108218a02200241086a200441016a360200200b20046a41063a00004100218b02200341dc006a228c0241003602002003420137025420032002360250203520334104746a218d024107218e0241ff00218f0241807f2190024100219102410021920220332193020240024041004100460d00411221450c010b41112145410e21040c190b410e21040c180b20022004360200200241046a2032360200200241086a28020021310b200241086a203141016a360200200420316a41003a0000202e422088a72106410121324100210b4100213141002104202ea722880221050240024002400340024020312004470d00200441016a220b2004490d1d20044101742207200b200b2007491b220b4100480d1d024002402004450d0020322004200b102722320d010c040b200b10262232450d030b200b21040b203220316a200541807f72200541ff0071200541077622071b3a0000203141016a21312007210520070d000b200420316b2088024f0d0220312088026a220b2031490d1b20044101742205200b200b2005491b220b4100480d1b024002402004450d0020322004200b10272232450d010c030b200b102622320d020b200b4101102a000b200b4101102a000b200b21040b203220316a20302088021094041a0240202f450d0020301023200b21040b20880220316a2131024002400240024002400340024020312004470d00200441016a220b2004490d1f20044101742205200b200b2005491b220b4100480d1f024002402004450d0020322004200b102722320d010c040b200b10262232450d030b200b21040b203220316a200641807f72200641ff0071200641077622051b3a0000203141016a21312005210620050d000b024002400240202d450d00202b210503400240024002400240200b2031470d00200b41016a2231200b490d25200b4101742204203120312004491b22044100480d25200b450d012032200b2004102722320d020c090b200b21040c020b200410262232450d070b200b21312004210b0b203220316a200541807f72200541ff0071200541077622061b3a0000203141016a21312006210520060d000b200420316b202b4f0d062031202b6a220b2031490d2020044101742205200b200b2005491b220b4100480d202004450d0120322004200b10272232450d020c050b200b21044101212f0c060b200b102622320d030b200b4101102a000b200b4101102a000b20044101102a000b200b21040b203220316a202d202b1094041a2031202b6a21314100212f202c450d00202d10230b202a20084104746a21302008210b024002400340024002400240024020042031470d00200441016a22312004490d1f20044101742205203120312005491b222b4100480d1f2004450d0120322004202b102722320d020c050b2004212b0c020b202b10262232450d030b20042131202b21040b203220316a200b41807f72200b41ff0071200b41077622051b3a0000203141016a21312005210b20050d000b02402008450d0041102184034108218503410c218603417f218703410621880341012189034100218a034107218b0341ff00218c0341807f218d034102218e034103218f0341c00021900341ff0121910341042192034105219303202a218802412121450c020b202a218802410821040c180b202b4101102a000b410e21040c160b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41053a000020282026410c6c6a21f9014100210b410021fa01410021fb01410121fc0120262104024002400340024020fa0120fb01470d00200b20fa0141016a22052005200b491b22fb014100480d190240200b450d0020fc0120fa0120fb01102722fc010d010c030b20fb01102622fc01450d020b20fc0120fa016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20fa0141016a21fa012005210420050d000b02402026450d00410c21fd01410221fe01410121ff01410821800241002181024104218202410721830241ff0021840241807f2185022028218602411021450c020b2028218702410721040c160b20fb014101102a000b410e21040c140b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41013a0000202520064104746a21e9014100210b410021ea01410021eb01410121ec0120062104024002400340024020ea0120eb01470d00200b20ea0141016a22052005200b491b22eb014100480d170240200b450d0020ec0120ea0120eb01102722ec010d010c030b20eb01102622ec01450d020b20ec0120ea016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ea0141016a21ea012005210420050d000b02402006450d00411021ed01410521ee01410121ef01410021f001410421f101410221f201410721f30141ff0021f40141807f21f501410321f601202521f701410f21450c020b202521f801410521040c140b20eb014101102a000b410e21040c120b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41073a00002023200641146c6a21d9014100210b410021da01410021db01410121dc0120062104024002400340024020da0120db01470d00200b20da0141016a22052005200b491b22db014100480d150240200b450d0020dc0120da0120db01102722dc010d010c030b20db01102622dc01450d020b20dc0120da016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20da0141016a21da012005210420050d000b02402006450d00411421dd01410421de01410121df01411021e001410721e10141ff0021e20141807f21e301410021e401410221e501202321e601410e21450c020b202321e701410421040c120b20db014101102a000b410e21040c100b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41033a0000202120064102746a21cd014100210b410021ce01410021cf01410121d001200621040240024002400340024020ce0120cf01470d00200b20ce0141016a22052005200b491b22cf014100480d140240200b450d0020d00120ce0120cf01102722d0010d010c030b20cf01102622d001450d020b20d00120ce016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ce0141016a21ce012005210420050d000b2006450d01410121d101410721d20141ff0021d30141807f21d401410021d501410221d601410421d701202121d801410d21450c020b20cf014101102a000b410121040c0f0b410e21040c0e0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41023a0000201f200641286c6a21aa014100210b410021ab01410021ac01410121ad0120062104024002400340024020ab0120ac01470d00200b20ab0141016a22052005200b491b22ac014100480d110240200b450d0020ad0120ab0120ac01102722ad010d010c030b20ac01102622ad01450d020b20ad0120ab016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ab0141016a21ab012005210420050d000b02402006450d00412821ae01410421af01412421b001412021b101411c21b201411a21b301411921b401411421b501411021b601410721b70141ff0021b80141807f21b901410121ba01410021bb01410221bc0141f00021bd01410321be01417f21bf01413f21c00141c00021c10141ff0121c201201f21c301410c21450c020b201f21c301410321040c0e0b20ac014101102a000b410e21040c0c0b2002200b360200200241046a2005360200200241086a28020021040b41012181014108218201200241086a200441016a360200200b20046a41093a00004100218301200341dc006a22840141003602002003420137025420032002360250201d201b411c6c6a218501410721860141ff0021870141807f21880141002189014100218a01201b218b010240024041004100460d00410821450c010b41072145410e21040c0b0b410e21040c0a0b2002200b360200200241046a2005360200200241086a28020021040b4101216d200241086a200441016a3602004100216e200b20046a41003a0000024002400240024002400240024041041026226f450d00206f41eec2b5ab063600000240024002400240024002400240201a4101460d000240201a4102460d002018217020172171201621724101217341012174201a4103460d0e41012170410021044100210b20162105034002400240024002402004200b470d00200441016a220b2004490d1e20044101742206200b200b2006491b22714100480d1e2004450d01207020042071102722700d020c0b0b200421710c020b207110262270450d090b2004210b207121040b2070200b6a200541807f72200541ff0071200541077622061b3a0000200b41016a210b2006210520060d000b2071200b6b20164f0d0d200b20166a2204200b490d1920714101742205200420042005491b22044100480d192071450d0420702071200410272270450d050c0c0b2003410036024820034201370340200341c8006a2194034101210741002105410021042018210b0340024020042005470d00200541016a22062005490d1a20054101742208200620062008491b22064100480d1a024002402005450d00200720052006102722070d010c0a0b200610262207450d090b2003200636024420032007360240200621050b209403200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b201720154104746a2194032018450d0120172195032015450d0220940341706a2196034100219703410121980341102199034104219a03417f219b034108219c034107219d0341ff00219e0341807f219f03411a21a003200341dc006a21a103410021a203201821a303201721a403410621450c0a0b4100216d2003410036024820034201370340200341086a410c6a2015360200200341086a41086a20163602002003201736020c20032018360208200341d0006a200341086a200341c0006a109b01024020032d00502279411a470d00200341c0006a41086a2802002172200328024421712003280240217041012173410021744100216e41012119410121754101102622760d080c190b200341d0006a41086a35020021a803200328025421a90320032d005321a50320032d005221a60320032d005121a703200341d0006a410c6a350200422086212e02402003280244450d00200328024010230b202e20a8038421a803410b21040c150b20172195030b209503209403460d06410c21040c130b2004102622700d070b20044101102a000b20714101102a000b20064101102a000b41044101102a000b410021040c0d0b410d21040c0c0b410e21040c0b0b200421710b2070200b6a201820161094041a200b20166a21724101216d02402017450d00201810230b41002174410121734101216e410021190b41012175410110262276450d0b410021040c080b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41043a000020142012410c6c6a215d4100210b4100215e4100215f41012160201221040240024003400240205e205f470d00200b205e41016a22052005200b491b225f4100480d0b0240200b450d002060205e205f102722600d010c030b205f10262260450d020b2060205e6a200441807f72200441ff0071200441077622051b3a0000200b41026a210b205e41016a215e2005210420050d000b02402012450d00410c21614102216241082163410121644100216541f0002166410421674107216841ff00216941807f216a2014216b410521450c020b2014216c410221040c080b205f4101102a000b410e21040c060b2002200b360200200241046a2005360200200241086a28020021040b4101213a4108213b200241086a200441016a360200200b20046a410b3a00004100213c200341dc006a223d410036020020034201370254200320023602502011200f411c6c6a213e4107213f41ff00214041807f21414100214241002143200f21440240024041004100460d00410121450c010b41002145410e21040c050b410e21040c040b20022006360200200241046a200e360200200241086a28020021040b200241086a220e200441016a360200200620046a200d3a000002400240024002400240200241046a2802002206200e28020022046b200b4f0d002004200b6a220d2004490d0820064101742204200d200d2004491b22044100480d082006450d0120022802002006200410272206450d020c030b200228020021060c030b2004102622060d010b20044101102a000b20022006360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200620046a2005200b1094041a4100210e4101213902402007450d00200510230b4101210d410621040c020b2002200b360200200241046a200c360200200241086a28020021040b4101210c200241086a200441016a360200410021e801200b20046a41003a00002003411c6a2005360200200341186a200636020020032007360214200320083602102003200936020c2003200a360208200341d0006a200341086a2002109c01200320032900513703402003200341d0006a41086a29000037004702400240024020032d00502204411a470d004101210e410021394101210d0c010b20002003290340370001200020043a0000200041086a20032900473700000c010b410621040c010b410a21040b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0f000102030405060708090a2324252c2c0b207620193a0000410121044101210b20722105034002400240024002402004200b470d00200420756a220b2004490d8c0220042075742206200b200b2006491b22774100480d8c022004450d01207620042077102722760d020c2e0b200421770c020b207710262276450d2c0b2004210b207721040b2076200b6a200541807f72200541ff0071200541077622061b3a0000200b20756a210b2006210520060d000b2077200b6b20724f0d1c200b20726a2204200b490d870220774101742205200420042005491b22044100480d87022077450d1a20762077200410272276450d1d0c1b0b02402020450d00202110230b200241086a2105200241046a210720ce01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d8a022004410174220d20062006200d491b220d4100480d8a022004450d0120022802002004200d102722060d020c290b200228020021060c020b200d10262206450d270b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20ce014f0d00200420ce016a22052004490d8602200b4101742204200520052004491b22044100480d8602200b450d122002280200200b20041027220b450d150c130b2002280200210b0c130b20142012410c6c6a206c6b2104024003402004450d01200441746a2104206c280204210b206c410c6a216c200b4102470d000b0b02402013450d00201410230b200241086a2105200241046a2107205e210b03400240024002400240200728020020052802002204470d00200441016a22062004490d89022004410174220d20062006200d491b220d4100480d89022004450d0120022802002004200d102722060d020c290b200228020021060c020b200d10262206450d270b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b205e4f0d002004205e6a22052004490d8502200b4101742204200520052004491b22044100480d8502200b450d0d2002280200200b20041027220b450d100c0e0b2002280200210b0c0e0b20c30120aa01460d9101034020c30141186a2d00004104460d920120c30141106a280200210420c301410c6a280200210b024020c30141046a280200450d0020c30128020010230b02402004450d00200b10230b20c30141286a22c30120aa01470d000c92010b0b20e70120d901460d8f01034020e701410c6a2802004104460d9001024020e70141046a280200450d0020e70128020010230b20e70141146a22e70120d901470d000c90010b0b20f80120e901460dd801034020f801410d6a2d00004105460dd901024020f80141046a280200450d0020f80128020010230b20f80141106a22f80120e901470d000cd9010b0b410121c4010c8f010b20282026410c6c6a2087026b2104024003402004450d01200441746a2104208702280204210b208702410c6a218702200b4102470d000b0b02402027450d00202810230b200241086a2105200241046a210720fa01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d84022004410174220d20062006200d491b220d4100480d84022004450d0120022802002004200d102722060d020c250b200228020021060c020b200d10262206450d230b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20fa014f0d00200420fa016a22052004490d8002200b4101742204200520052004491b22044100480d8002200b450d042002280200200b20041027220b450d070c050b2002280200210b0c050b024003402030208802460d01208802280200210420880241106a21880220044108470d000b0b02402029450d00202a10230b200241086a2105200241046a21072031210b03400240024002400240200728020020052802002204470d00200441016a22062004490d84022004410174220d20062006200d491b220d4100480d84022004450d0120022802002004200d102722060d020c250b200228020021060c020b200d10262206450d230b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20314f0d00200420316a22052004490d8002200b4101742204200520052004491b22044100480d8002200b450d0f2002280200200b20041027220b450d120c100b2002280200210b0c100b02402034450d00203510230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22072802002204470d00200441016a22062004490d82022004410174220e20062006200e491b220e4100480d82022004450d0120052802002004200e102722060d020c260b200528020021060c020b200e10262206450d240b20052006360200200d200e360200200728020021040b2007200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490dfe01200b4101742204200620062004491b22044100480dfe01200b450d162005280200200b20041027220b450d190c170b2005280200210b0c170b410121050c6f0b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420fa016a360200200b20046a20fc0120fa011094041a4100210841012139024020fb01450d0020fc0110230b4101210e4101210d410121c401410121cc01410121070c8b010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a2004205e6a360200200b20046a2060205e1094041a41002107410121390240205f450d00206010230b4101210e4101210d410121c401410121cc010c86010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ce016a360200200b20046a20d00120ce011094041a410021cc0141012139024020cf01450d0020d00110230b4101210e4101210d410121c4010c81010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420316a360200200b20046a203220311094041a0240202b450d00203210230b410021c901410121390240202d450d00202f450d00202c450d00202d10230b4101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b4101210a410121060ccf010b20044101102a000b200410262276450d020b200421770b2076200b6a207020721094041a02402071450d00207010230b200b20726a2178024002400240201a450d000240201a4101460d00201a4102470d02411a21792073450d692015450d684104217a201720154104746a217b4110217c410c217d4108217e4174217f2017218001412521450c130b411a2179206d450d682015450d672015410c6c210b201721040340024020042802002205450d00200441046a280200450d00200510230b2004410c6a2104200b41746a220b0d000c680b0b411a2179201745206e720d670c010b411a21792017452074720d660b201810230c650b20044101102a000b20041026220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b41002145410121394101210e4101210d410121c401410121cc0141012107410121080c780b20044101102a000b4100217741012176410021780c600b4110218f04410c21900441742191044104219204412321450c090b02402016450d00201710230b200341c8006a2802002172200328024421712003280240217041022119410021734101216d410021744100216e410121754101102622760d140ce3010b200d4101102a000b200d4101102a000b200d4101102a000b200d4101102a000b20774101102a000b200e4101102a000b024002400240024002400240024002400240024002400240024002400240024002400240024020450e280100030562076b0a090c0e5d0f101112bf01b201b3016766a801a90187018601797877765958575675555453085251510b200328025421040c010b2042203a6a22042042490dec012042203a74220b20042004200b491b220b203c480dec01024002402042450d0020032802542042200b102722040d010c3f0b200b10262204450d3e0b200341d0006a203b6a200b36020020032004360254203d28020021430b203d2043203a6a360200200420436a204420417220442040712044203f7622041b3a000002402004450d0020042144200341d0006a203b6a2802002242203d2802002243470d29410021450c180b20112146200f450d01411c214741182148411421494108214a4107214b41ff00214c41807f214d200341dc006a214e4101214f41002150411a215120112152410221450c160b205220476a214620522802042209450d00205220486a2802002108205220496a280200210a2052204a6a290200212e2052280200210b2052280210214503400240024002400240200341d0006a204a6a2205280200204e2802002204470d002004204f6a22062004490def012004204f742207200620062007491b22072050480def012004450d01200328025420042007102722060d020c4a0b200328025421060c020b200710262206450d480b2005200736020020032006360254204e28020021040b204e2004204f6a360200200620046a200b204d72200b204c71200b204b7622041b3a00002004210b20040d000b2003202e37024420032009360240200341086a200341c0006a200341d0006a109d0120032d000822532051470d5f2008210b034002400240024002402005280200204e2802002204470d002004204f6a22062004490def012004204f742207200620062007491b22072050480def012004450d01200328025420042007102722060d020c480b200328025421060c020b200710262206450d460b2005200736020020032006360254204e28020021040b204e2004204f6a360200200620046a200b204d72200b204c71200b204b7622041b3a00002004210b20040d000b02400240024002402005280200220b204e28020022046b20084f0d00200420086a22062004490dee01200b204f742204200620062004491b22042050480dee01200b450d012003280254200b20041027220b0d020c350b2003280254210b0c020b20041026220b450d330b200520043602002003200b360254204e28020021040b204e200420086a360200200b20046a204520081094041a0240200a450d00204510230b204621522046203e470d260c020b2046203e460d01411c215441142155410c21564108215741042158411021594109215a41ffffffff03215b4170215c410321450c130b20462802042205450d00204620556a2802002106204620576a2802002107204628021021080240204620566a2802002204450d002004205874210b200521040340024020042d0000205a470d00200420576a280200205b71450d00200420586a28020010230b200420596a2104200b205c6a220b0d000b0b02402007450d00200510230b204620546a214602402006450d00200810230b2046203e470d230b02402010450d00201110230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490dec012004410174220e20072007200e491b220e4100480dec012004450d0120052802002004200e102722070d020c3b0b200528020021070c020b200e10262207450d390b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b200541046a280200220b200541086a28020022046b20394f0d7d200420396a22062004490de701200b4101742204200620062004491b22044100480de701200b450d532005280200200b20041027220b450d550c540b206b20616a216c206b28020422092062460d16206b20636a2802002107206b2802002104024002400240205f205e470d00205e20646a220b205e490de801205e2064742205200b200b2005491b220b2065480de801205e450d012060205e200b102722600d020c370b205f210b0c010b200b10262260450d350b2060205e6a20663a00000240024002400240200b205e20646a2205470d00200b20646a2205200b490de901200b206474225e20052005205e491b225f2065480de901200b450d012060200b205f102722600d020c370b200b215f0c020b205f10262260450d350b200b21050b206020056a20092064463a0000200520646a215e2005206474220b20676a2108200b20626a210503402008210b0240205e205f470d00205e20646a2206205e490de7012005200620062005491b225f2065480de7010240205e450d002060205e205f102722600d010c450b205f10262260450d440b2060205e6a2004206a722004206971200420687622061b3a0000200b20626a2108200520626a2105205e20646a215e2006210420060d000b024020092064470d0003400240205e205f470d00205e20646a2204205e490de801200b20042004200b491b225f2065480de8010240205e450d002060205e205f102722600d010c410b205f10262260450d400b2060205e6a2007206a722007206971200720687622041b3a0000200b20626a210b205e20646a215e2004210720040d000b0b206c216b206c205d470d20205d216c0c170b2080012206207c6a218001024020062802042204450d0002402006207d6a280200220b450d00200b207d6c210b0340024020042802002205450d002004207a6a280200450d00200510230b2004207d6a2104200b207f6a220b0d000b0b2006207e6a280200450d002006207a6a28020010230b208001207b470d180c5f0b200328025421040c010b2089012081016a2204208901490de30120890120810174220b20042004200b491b220b208301480de30102400240208901450d002003280254208901200b102722040d010c350b200b10262204450d340b200341d0006a2082016a200b36020020032004360254208401280200218a010b208401208a012081016a3602002004208a016a208b0120880172208b0120870171208b012086017622041b3a000002402004450d002004218b01200341d0006a2082016a280200228901208401280200228a01470d1c410721450c0c0b201d218c01201b450d01411c218d014118218e014114218f014108219001410721910141ff0021920141807f219301200341dc006a21940141012195014100219601411a21970141022198014104219901201d219a01410921450c0a0b209a01208d016a218c01209a012802042208450d00209a01208e016a2802002107209a01208f016a280200219b01209a012090016a290200212e209a01280210219c01209a01280200210b03400240024002400240200341d0006a2090016a229d012802002094012802002204470d0020042095016a22052004490de6012004209501742206200520052006491b2206209601480de6012004450d01200328025420042006102722050d020c400b200328025421050c020b200610262205450d3e0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b2003202e37024420032008360240200341086a200341c0006a200341d0006a109d0120032d0008229e01209701470d51209c012007209801746a219f012007210b03400240024002400240209d012802002094012802002204470d0020042095016a22052004490de6012004209501742206200520052006491b2206209601480de6012004450d01200328025420042006102722050d020c3e0b200328025421050c020b200610262205450d3c0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b2007450dbc01209c0121a001410021040c7b0b208c01208501460dbc01411c21a101411421a201410c21a301410821a401410421a501411021a601410921a70141ffffffff0321a801417021a901410a21450c070b208c012802042205450dbb01208c0120a2016a2802002106208c0120a4016a2802002107208c0128021021080240208c0120a3016a2802002204450d00200420a50174210b200521040340024020042d000020a701470d00200420a4016a28020020a80171450d00200420a5016a28020010230b200420a6016a2104200b20a9016a220b0d000b0b02402007450d00200510230b208c0120a1016a218c0102402006450d00200810230b208c01208501470d170cbb010b20c301220420ae016a21c30120042d001822c40120af01460d0d200420b0016a2800002109200420b1016a28000021c501200420b2016a2800002107200420b3016a2d000021c601200420b4016a2c000021c701200420b5016a280200210a200420b6016a28020021c801200428020c21c901200428020421ca01200428020021cb014101214520ab01410174210620ab01210b200428020822cc0121050340204521040240200b20ac01470d00200b20ba016a22ac01200b490ddf01200620ac0120ac012006491b22ac0120bb01480ddf010240200b450d0020ad01200b20ac01102722ad010d010c420b20ac01102622ad01450d410b20ad01200b6a200520b90172200520b80171200520b7017622081b3a0000200420ba016a2145200620bc016a2106200b20ba016a210b2008210520080d000b024020ac01200b6b20cc014f0d00200b20cc016a2205200b490dde0120ac0120ba01742206200520052006491b220520bb01480dde010240024020ac01450d0020ad0120ac012005102722ad010d010c2d0b2005102622ad01450d2c0b200521ac010b20ad01200b6a20cb0120cc011094041a024020ca01450d0020cb0110230b20ab0120cc016a210620bb0120ab016b20cc016b2108200a210b03400240200620046a220520ac01470d00200520ba016a22ab012005490ddf01200520ba017422ac0120ab0120ab0120ac01491b22ac0120bb01480ddf01024020082004470d0020ac01102622ad010d010c410b20ad01200520ac01102722ad01450d400b20ad0120066a20046a200b20b90172200b20b80171200b20b7017622051b3a0000200420ba016a21042005210b20050d000b024002400240200820ac016a20046b200a4f0d00200620046a2205200a6a220b2005490de00120ac0120ba01742205200b200b2005491b220b20bb01480de00120ac01450d0120ad0120ac01200b102722ad010d020c2c0b20ac01210b0c010b200b102622ad01450d2a0b20ad0120066a20046a20c901200a1094041a2006200a6a2205200b6b21ab01024020c801450d0020c90110230b200520046a210520ab0120046a2104024002400240024002400240024002400240024002400240024002400240024002400240024020c40120ba01460d00024020c40120bc01460d0020c40120be01470d022004450d05200b21ab010c0f0b2004450d02200b21040c080b2004450d02200b21ab010c0a0b2004450d03200b21ac010c0f0b200b20ba016a2204200b490ded01200b20ba01742205200420042005491b220420bb01480ded01200b450d0320ad01200b2004102722ad010d040c2f0b200b20ba016a2204200b490dec01200b20ba01742205200420042005491b22ab0120bb01480dec01200b450d0520ad01200b20ab01102722ad010d060c2d0b200b20ba016a2204200b490deb01200b20ba01742205200420042005491b22ab0120bb01480deb01200b450d0720ad01200b20ab01102722ad010d080c2b0b200b20ba016a2204200b490dea01200b20ba01742205200420042005491b22ac0120bb01480dea01200b450d0920ad01200b20ac01102722ad010d0a0c290b2004102622ad01450d2b0b200b21050b20ad0120056a20bc013a000002400240024002402004200520ba016a220b470d00200420ba016a220b2004490deb01200420ba01742205200b200b2005491b22ac0120bb01480deb012004450d0120ad01200420ac01102722ad010d020c320b200421ac010c020b20ac01102622ad01450d300b2004210b0b20ad01200b6a20c50120ba01463a0000200b20ba016a21ab01200b20ba0174220420af016a2106200420bc016a210b034020062104024020ab0120ac01470d0020ab0120ba016a220520ab01490de901200b20052005200b491b22ac0120bb01480de901024020ab01450d0020ad0120ab0120ac01102722ad010d010c410b20ac01102622ad01450d400b20ad0120ab016a200720b90172200720b80171200720b7017622051b3a0000200420bc016a2106200b20bc016a210b20ab0120ba016a21ab012005210720050d000b20c50120ba01470d090340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de9012004200b200b2004491b22ac0120bb01480de901024020ab01450d0020ad0120ab0120ac01102722ad010d010c3e0b20ac01102622ad01450d3d0b20ad0120ab016a200920b90172200920b80171200920b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2109200b0d000c0a0b0b20ab01102622ad01450d270b200b21050b20ad0120056a20ba013a0000024002400240024020ab01200520ba016a220b470d0020ab0120ba016a220420ab01490de80120ab0120ba0174220b20042004200b491b220420bb01480de80120ab01450d0120ad0120ab012004102722ad010d020c2e0b20ab0121040c020b2004102622ad01450d2c0b20ab01210b0b20ad01200b6a20bd013a000002400240024002402004200b20ba016a220b470d00200420ba016a220b2004490de801200420ba01742205200b200b2005491b22ac0120bb01480de8012004450d0120ad01200420ac01102722ad010d020c2d0b200421ac010c020b20ac01102622ad01450d2b0b2004210b0b20ad01200b6a20c50120ba01463a0000200b20ba016a21ab01200b20ba0174220420af016a2106200420bc016a210b034020062104024020ab0120ac01470d0020ab0120ba016a220520ab01490de601200b20052005200b491b22ac0120bb01480de601024020ab01450d0020ad0120ab0120ac01102722ad010d010c3d0b20ac01102622ad01450d3c0b20ad0120ab016a200720b90172200720b80171200720b7017622051b3a0000200420bc016a2106200b20bc016a210b20ab0120ba016a21ab012005210720050d000b20c50120ba01470d060340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de6012004200b200b2004491b22ac0120bb01480de601024020ab01450d0020ad0120ab0120ac01102722ad010d010c3a0b20ac01102622ad01450d390b20ad0120ab016a200920b90172200920b80171200920b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2109200b0d000c070b0b20ab01102622ad01450d230b200b21050b20ad0120056a20be013a0000024002400240024020ab01200520ba016a220b470d0020ab0120ba016a220420ab01490de50120ab0120ba0174220b20042004200b491b220420bb01480de50120ab01450d0120ad0120ab012004102722ad010d020c290b20ab0121040c020b2004102622ad01450d270b20ab01210b0b20ad01200b6a20c70120bf0173220520c0017120c10172200520c70120bf014a1b3a000002400240024002402004200b20ba016a220b470d00200420ba016a220b2004490de501200420ba01742205200b200b2005491b22ac0120bb01480de5012004450d0120ad01200420ac01102722ad010d020c280b200421ac010c020b20ac01102622ad01450d260b2004210b0b20ad01200b6a20c60120c2017120bb01473a0000200b20ba016a21ab0120c30120aa01470d180c6f0b20ac01102622ad01450d1f0b200b21050b20ad0120056a20bb013a0000200520ba016a21ab01200520ba017420bc016a21040340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de0012004200b200b2004491b22ac0120bb01480de001024020ab01450d0020ad0120ab0120ac01102722ad010d010c360b20ac01102622ad01450d350b20ad0120ab016a200720b90172200720b80171200720b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2107200b0d000b0b20c30120aa01470d150c6b0b20ce0120d10174210b20d80128020021040340024020ce0120cf01470d0020ce0120d1016a220520ce01490dde01200b20052005200b491b22cf0120d501480dde01024020ce01450d0020d00120ce0120cf01102722d0010d010c420b20cf01102622d001450d410b20d00120ce016a200420d40172200420d30171200420d2017622051b3a0000200b20d6016a210b20ce0120d1016a21ce012005210420050d000b20d80120d7016a22d80120cd01470d12410121040cdb010b20e60120dd016a21e70120e60128020c220920de01460d0a20e601280204214520e601280200210820da0120df0174210520e60120e0016a280200210420e6012802082207210b0340024020da0120db01470d0020da0120df016a220620da01490ddd012005200620062005491b22db0120e401480ddd01024020da01450d0020dc0120da0120db01102722dc010d010c3e0b20db01102622dc01450d3d0b20dc0120da016a200b20e30172200b20e20171200b20e1017622061b3a0000200520e5016a210520da0120df016a21da012006210b20060d000b02400240024020db0120da016b20074f0d0020da0120076a220b20da01490dde0120db0120df01742205200b200b2005491b220b20e401480dde0120db01450d0120dc0120db01200b102722dc010d020c290b20db01210b0c010b200b102622dc01450d270b20dc0120da016a200820071094041a2007200b6b20da016a210502402045450d00200810230b024002402005450d00200720da016a2105200b21db010c010b200b20df016a2205200b490ddc01200b20df017422da012005200520da01491b22db0120e401480ddc0102400240200b450d0020dc01200b20db01102722dc010d010c270b20db01102622dc01450d260b200b21050b20dc0120056a20093a0000200520df016a21da01200520df017420e5016a210b0340024020da0120db01470d0020da0120df016a220520da01490ddd01200b20052005200b491b22db0120e401480ddd01024020da01450d0020dc0120da0120db01102722dc010d010c3d0b20db01102622dc01450d3c0b20dc0120da016a200420e30172200420e20171200420e1017622051b3a0000200b20e5016a210b20da0120df016a21da012005210420050d000b20e70121e60120e70120d901470d100c680b20f70120ed016a21f80120f7012d000d220920ee01460d0820f7012d000c210420f701280208210820f701280204210a20f70128020021f701024020eb0120ea01470d0020ea0120ef016a220b20ea01490ddb0120ea0120ef01742205200b200b2005491b22eb0120f001480ddb01024020ea01450d0020ec0120ea0120eb01102722ec010d010c260b20eb01102622ec01450d250b20ec0120ea016a20043a000020ea0120ef016a210420ea0120ef0174220b20f1016a2107200b20f2016a21052008210b0340200721060240200420eb01470d00200420ef016a22ea012004490ddc01200520ea0120ea012005491b22eb0120f001480ddc0102402004450d0020ec01200420eb01102722ec010d010c3b0b20eb01102622ec01450d3a0b20ec0120046a200b20f50172200b20f40171200b20f3017622ea011b3a0000200620f2016a2107200520f2016a2105200420ef016a210420ea01210b20ea010d000b2008450dad014100210502400340200420056a210b20f70120056a2d0000220720f6014b0db00141ff0021ea0102400240024002400240024020070e0401000203010b41fe0021ea010b200b20eb01470d030c020b41fd0021ea01200b20eb01460d010c020b41fc0021ea01200b20eb01470d010b200b20ef016a2207200b490ddd012006200720072006491b22eb0120f001480ddd010240200b450d0020ec01200b20eb01102722ec010d010c030b20eb01102622ec01450d020b20ec0120046a20056a20ea013a0000200620f2016a21062008200520ef016a2205470d000b200420056a210b200a0db0010cb1010b20eb014101102a000b410e21040cd8010b410e21040cd7010b410e21040cd6010b410e21040cd5010b410e21040cd4010b410e21040cd3010b410e21040cd2010b410e21040cd1010b410521040cd0010b410421040ccf010b410321040cce010b410221040ccd010b410221040ccc010b410021040ccb010b41252145410e21040cca010b410e2145410e21040cc9010b410d2145410e21040cc8010b410c2145410e21040cc7010b410c2145410e21040cc6010b410a2145410e21040cc5010b41082145410e21040cc4010b41052145410e21040cc3010b41032145410e21040cc2010b41022145410e21040cc1010b41012145410e21040cc0010b20ac014101102a000b20ab014101102a000b20ab014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20db014101102a000b20eb014101102a000b200b4101102a000b200b4101102a000b20054101102a000b205f4101102a000b200b4101102a000b200e4101102a000b200b4101102a000b200b4101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b205f4101102a000b20064101102a000b20074101102a000b20064101102a000b20074101102a000b205f4101102a000b20eb014101102a000b20db014101102a000b20db014101102a000b20ac014101102a000b20ac014101102a000b20cf014101102a000b20a504220420a4046a21a504024020042802042206450d00200428020821070240200420a6046a2802002204450d00200420a6046c210b200621040340024020042802002205450d00200420a8046a280200450d00200510230b200420a6046a2104200b20a7046a220b0d000b0b2007450d00200610230b20a504209403460d1a41272145410e21040c9a010b209c042206209e046a219c04024020062802042204450d0002402006209b046a280200220b450d00200b209b046c210b0340024020042802002205450d00200420a0046a280200450d00200510230b2004209b046a2104200b20a1046a220b0d000b0b2006209f046a280200450d00200620a0046a28020010230b209c04209d04460d4e41262145410e21040c99010b20a102280200220b450d3520a1022094046a280200210420a1022095046a280200210620a10228020c2105024020a102280204450d00200b10230b02402004450d00200420960474210b200521040340024020042d0000209704470d0020042098046a28020020990471450d0020042096046a28020010230b20042095046a2104200b209a046a220b0d000b0b20a1022093046a21a10202402006450d00200510230b20a102209a02460d3541242145410e21040c98010b2095032204208f046a219503024020042802042206450d0020042802082107024020042090046a2802002204450d0020042090046c210b200621040340024020042802002205450d0020042092046a280200450d00200510230b20042090046a2104200b2091046a220b0d000b0b2007450d00200610230b0240209503209403470d00410d21040c98010b41232145410e21040c97010b2089042206208b046a218904024020062802042204450d00024020062088046a280200220b450d00200b2088046c210b0340024020042802002205450d002004208d046a280200450d00200510230b20042088046a2104200b208e046a220b0d000b0b2006208c046a280200450d002006208d046a28020010230b208904208a04460d8d0141222145410e21040c96010b024020800420fd036a280200220b450d002080042802042104200b20ff0374210b0340024020042d0000208504470d0020042082046a28020020860471450d00200420ff036a28020010230b20042084046a2104200b2087046a220b0d000b0b02402080042082046a280200450d0020800420ff036a28020010230b20800420fe036a210402402080042083046a280200450d0020800428021010230b20042180042004208104460d4641202145410e21040c95010b024020f603280208220b450d0020f6032802002104200b20f50374210b0340024020042d000020f903470d00200420fa036a28020020fb0371450d00200420f5036a28020010230b200420f8036a2104200b20fc036a220b0d000b0b20f60320f8036a2104024020f60320f5036a280200450d0020f60328020010230b200421f603200420f703460d43411f2145410e21040c94010b024020ed0320ea036a280200220b450d0020ed032802042104200b20ec0374210b0340024020042d000020f203470d00200420ef036a28020020f30371450d00200420ec036a28020010230b200420f1036a2104200b20f4036a220b0d000b0b024020ed0320ef036a280200450d0020ed0320ec036a28020010230b20ed0320eb036a2104024020ed0320f0036a280200450d0020ed0328021010230b200421ed03200420ee03460d3c411e2145410e21040c93010b024020e20320e1036a280200450d0020e20328020010230b024020e20320e4036a280200220b450d0020e20328020c2104200b20e10374210b0340024020042d000020e603470d00200420e7036a28020020e80371450d00200420e1036a28020010230b200420e5036a2104200b20e9036a220b0d000b0b20e20320e0036a2104024020e20320e5036a280200450d0020e20320df036a28020010230b200421e203200420e303460d36411d2145410e21040c92010b20041026220b450d010b2005200b360200200541046a2004360200200541086a28020021040c290b20044101102a000b208c012802042205450d01208c0120d7036a2802002106208c0120d9036a2802002107208c0128021021080240208c0120d8036a2802002204450d00200420da0374210b200521040340024020042d000020dc03470d00200420d9036a28020020dd0371450d00200420da036a28020010230b200420db036a2104200b20de036a220b0d000b0b02402007450d00200510230b208c0120d6036a218c0102402006450d00200810230b208c01208501460d01410b2145410e21040c8e010b200341146a28020021d003200341106a28020021d103200328020c21d20320032d000b21d30320032d000a21d40320032d000921d5030240209b01450d00209c0110230b208c01208501460d00411c21d603411421d703410c21d803410821d903410421da03411021db03410921dc0341ffffffff0321dd03417021de03410b21450c020b0240201c450d00201d10230b0240200341d0006a41086a280200450d00200328025410230b200020d5033a00012000209e013a00002000410c6a20d003360000200041086a20d103360000200041046a20d203360000200041036a20d3033a0000200041026a20d4033a000041002105410121e8014101210c0b410121060c290b410e21040c8a010b20462802042205450d01204620c8036a2802002106204620ca036a2802002107204628021021080240204620c9036a2802002204450d00200420cb0374210b200521040340024020042d000020cd03470d00200420ca036a28020020ce0371450d00200420cb036a28020010230b200420cc036a2104200b20cf036a220b0d000b0b02402007450d00200510230b204620c7036a214602402006450d00200810230b2046203e460d0141042145410e21040c89010b200341146a28020021c103200341106a28020021c203200328020c21c30320032d000b21c40320032d000a21c50320032d000921c6030240200a450d00204510230b2046203e460d00411c21c703411421c803410c21c903410821ca03410421cb03411021cc03410921cd0341ffffffff0321ce03417021cf03410421450c010b02402010450d00201110230b0240200341d0006a41086a280200450d00200328025410230b200020c6033a0001200020533a00002000410c6a20c103360000200041086a20c203360000200041046a20c303360000200041036a20c4033a0000200041026a20c5033a000041002107410121e8014101210c41012105410121060c260b410e21040c86010b20bb0320bc036a2d000020bd03460d4e20bb03280204210620bb032802002105024020bb032802082204450d00200420b80374210b200521040340024020042d000020be03470d00200420bf036a28020020c00371450d00200420b8036a28020010230b200420ba036a2104200b20b9036a220b0d000b0b20bb0320ba036a21bb0302402006450d00200510230b20bb03208d02460d4e41142145410e21040c85010b0240024020940220ab036a2d000020ac03460d002094022802042106209402280200210502402094022802082204450d00200420ad0374210b200521040340024020042d000020ae03470d00200420af036a28020020b00371450d00200420ad036a28020010230b200420aa036a2104200b20b1036a220b0d000b0b20940220aa036a21940202402006450d00200510230b0240209402208d02470d00410921040c87010b411321450c010b410921040c85010b410e21040c84010b2016450d00201710230b0b0240024002402079411a470d002003411c6a2078360200200341086a41106a20773602002003207636021420034284808080c00037020c2003206f360208200341d0006a200341086a2002109c01200320032900513703402003200341d0006a41086a29000037004720032d00502204411a470d0141002106410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b4101210a0c660b20a50341ff017141107420a60341ff01714108747220a70341ff017172210402402077450d00207610230b200041086a20a803370200200041046a20a90336020020002004410874207972360200206f10230c010b20002003290340370001200020043a0000200041086a20032900473700000b4100210b410121e8014101210c41012105410121064101210720012d00002204410e4b0d220c210b20a4032105024003402005209a036a28020022080d0120a2032098036a21a20320940320052099036a2205470d000c080b0b20052099036a21a40320a2032098036a210a20a303209b036a21a3032005209c036a290200212e20052802002109200341c0006a209c036a227928020021042003280244210b034002400240024002402004200b470d00200b2098036a2206200b490d8701200b209803742207200620062007491b2207209703480d8701200b450d012003280240200b2007102722060d020c060b200328024021060c020b200710262206450d040b20032007360244200320063602402007210b0b207920042098036a2207360200200620046a20a203209f037220a203209e037120a203209d037622061b3a000020072104200621a20320060d000b200341086a209c036a202e3703002003200836020c20032009360208200341d0006a200341086a200341c0006a109b01024020032d0050227920a003470d00024020a303450d00200a21a2032096032005470d040b200541106a229503209403470d060c050b20a10335020021a204200341d0006a209c036a35020021a304200328025421a90320032d005321a50320032d005221a60320032d005121a70320940341706a2005460d00411021a404200541106a21a504410c21a604417421a704410421a804412721450c080b02402016450d00201710230b20a20442208621a80302402003280244450d00200328024010230b20a80320a3048421a8030c020b20074101102a000b410621450c040b410b21040c7c0b410d21040c7b0b410c21040c7a0b410d21040c790b410e21040c780b410e21040c770b20880222052084036a2188020240024002400240024020052802002206208503460d0020052085036a28020021042005280204210b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020062087036a22062088034b0d0020052086036a2802002108024002400240024020060e0700050203010607000b202b2031470d0b202b2089036a2231202b490dd201202b208903742205203120312005491b2206208a03480dd201202b450d1b2032202b2006102722320d1c0c490b202b2031470d06202b2089036a2231202b490dd101202b208903742205203120312005491b2206208a03480dd101202b450d0e2032202b2006102722320d0f0c450b202b2031470d06202b2089036a2231202b490dd001202b208903742205203120312005491b2206208a03480dd001202b450d102032202b2006102722320d110c450b202b2031470d06202b2089036a2231202b490dcf01202b208903742205203120312005491b2206208a03480dcf01202b450d122032202b2006102722320d130c450b202b2031470d06202b2089036a2231202b490dce01202b208903742205203120312005491b2206208a03480dce01202b450d142032202b2006102722320d150c410b202b2031470d07202b2089036a2231202b490dcd01202b208903742205203120312005491b2206208a03480dcd01202b450d192032202b2006102722320d1a0c450b202b2031470d07202b2089036a2231202b490dcc01202b208903742205203120312005491b2206208a03480dcc01202b450d1b2032202b2006102722320d1c0c450b202b2031470d07202b2089036a2231202b490dcb01202b208903742205203120312005491b2206208a03480dcb01202b450d1d2032202b2006102722320d1e0c450b202b21060c090b202b21060c0b0b202b21060c0d0b202b21060c0f0b202b21060c110b202b21060c130b202b21060c150b202b21060c170b200610262232450d360b202b21310b203220316a2093033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dc5012006208903742205203120312005491b2205208a03480dc5012006450d01203220062005102722320d020c270b200621050c020b200510262232450d250b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dc501200520890374220b20312031200b491b220b208a03480dc5012005450d0120322005200b102722320d020c280b2005210b0c020b200b10262232450d260b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc801200b208903742205203120312005491b2205208a03480dc801200b450d012032200b2005102722320d020c380b200b21050c020b200510262232450d360b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dc1012005208903742204203120312004491b222b208a03480dc1012005450d1720322005202b102722320d180c3c0b2005212b0c180b200610262232450d340b202b21310b203220316a208f033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dc2012006208903742205203120312005491b2205208a03480dc2012006450d01203220062005102722320d020c260b200621050c020b200510262232450d240b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dc201200520890374220b20312031200b491b220b208a03480dc2012005450d0120322005200b102722320d020c270b2005210b0c020b200b10262232450d250b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc501200b208903742205203120312005491b2205208a03480dc501200b450d012032200b2005102722320d020c360b200b21050c020b200510262232450d340b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dbe012005208903742204203120312004491b222b208a03480dbe012005450d1720322005202b102722320d180c3a0b2005212b0c180b200610262232450d320b202b21310b203220316a2092033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dbf012006208903742205203120312005491b2205208a03480dbf012006450d01203220062005102722320d020c250b200621050c020b200510262232450d230b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dbf01200520890374220b20312031200b491b220b208a03480dbf012005450d0120322005200b102722320d020c260b2005210b0c020b200b10262232450d240b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc201200b208903742205203120312005491b2205208a03480dc201200b450d012032200b2005102722320d020c340b200b21050c020b200510262232450d320b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dbb012005208903742204203120312004491b222b208a03480dbb012005450d1720322005202b102722320d180c380b2005212b0c180b200610262232450d2c0b202b21310b203220316a208a033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dbc012006208903742205203120312005491b2205208a03480dbc012006450d01203220062005102722320d020c1c0b200621050c020b200510262232450d1a0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dbc01200520890374220b20312031200b491b222b208a03480dbc012005450d0120322005202b102722320d020c1d0b2005212b0c020b202b10262232450d1b0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c0d0b0b200610262232450d2d0b202b21310b203220316a2089033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db9012006208903742205203120312005491b2205208a03480db9012006450d01203220062005102722320d020c210b200621050c020b200510262232450d1f0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db901200520890374220b20312031200b491b222b208a03480db9012005450d0120322005202b102722320d020c220b2005212b0c020b202b10262232450d200b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c0a0b0b200610262232450d2b0b202b21310b203220316a208e033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db6012006208903742205203120312005491b2205208a03480db6012006450d01203220062005102722320d020c200b200621050c020b200510262232450d1e0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db601200520890374220b20312031200b491b222b208a03480db6012005450d0120322005202b102722320d020c210b2005212b0c020b202b10262232450d1f0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c070b0b200610262232450d290b202b21310b203220316a2088033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db3012006208903742205203120312005491b2205208a03480db3012006450d01203220062005102722320d020c1f0b200621050c020b200510262232450d1d0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db301200520890374220b20312031200b491b222b208a03480db3012005450d0120322005202b102722320d020c200b2005212b0c020b202b10262232450d1e0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c040b0b200610262232450d270b202b21310b203220316a208b033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db0012006208903742205203120312005491b2205208a03480db0012006450d01203220062005102722320d020c1e0b200621050c020b200510262232450d1c0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db001200520890374220b20312031200b491b222b208a03480db0012005450d0120322005202b102722320d020c1f0b2005212b0c020b202b10262232450d1d0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000b0b2088022030470d280c090b202b10262232450d240b200521310b203220316a20093a000020312089036a21312088022030470d260c060b202b10262232450d220b200521310b203220316a20093a000020312089036a21312088022030470d250c030b202b10262232450d200b200521310b203220316a20093a000020312089036a21312088022030470d210b20302188020c220b20054101102a000b202b4101102a000b20054101102a000b200b4101102a000b20054101102a000b200b4101102a000b20054101102a000b200b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b20054101102a000b20054101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b202b4101102a000b202b4101102a000b202b4101102a000b412121450c050b412121450c050b412121450c050b412121450c050b410821040c7b0b410821040c7a0b410e21040c790b410e21040c780b410e21040c770b410e21040c760b024020fc0220f9026a280200220b450d0020fc022802042104200b20fb0274210b0340024020042d0000208103470d00200420fe026a28020020820371450d00200420fb026a28020010230b20042080036a2104200b2083036a220b0d000b0b024020fc0220fe026a280200450d0020fc0220fb026a28020010230b20fc0220fa026a2104024020fc0220ff026a280200450d0020fc0228021010230b200421fc02200420fd02460d66411c2145410e21040c750b024020f202280208220b450d0020f2022802002104200b20f10274210b0340024020042d000020f502470d00200420f6026a28020020f70271450d00200420f1026a28020010230b200420f4026a2104200b20f8026a220b0d000b0b20f20220f4026a2104024020f20220f1026a280200450d0020f20228020010230b200421f202200420f302460d63411b2145410e21040c740b024020e90220e6026a280200220b450d0020e9022802042104200b20e80274210b0340024020042d000020ee02470d00200420eb026a28020020ef0271450d00200420e8026a28020010230b200420ed026a2104200b20f0026a220b0d000b0b024020e90220eb026a280200450d0020e90220e8026a28020010230b20e90220e7026a2104024020e90220ec026a280200450d0020e90228021010230b200421e902200420ea02460d5c411a2145410e21040c730b024020de0220dd026a280200450d0020de0228020010230b024020de0220e0026a280200220b450d0020de0228020c2104200b20dd0274210b0340024020042d000020e202470d00200420e3026a28020020e40271450d00200420dd026a28020010230b200420e1026a2104200b20e5026a220b0d000b0b20de0220dc026a2104024020de0220e1026a280200450d0020de0220db026a28020010230b200421de02200420df02460d5641192145410e21040c720b02402022450d00202310230b200241086a2105200241046a210720da01210b024003400240024002400240200728020020052802002204470d00200441016a22062004490d782004410174220d20062006200d491b220d4100480d782004450d0120022802002004200d102722060d020c050b200228020021060c020b200d10262206450d030b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200241046a280200220b200241086a28020022046b20da014f0d00200420da016a22052004490d78200b4101742204200520052004491b22044100480d78200b450d012002280200200b20041027220b450d040c020b2002280200210b0c020b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420da016a360200200b20046a20dc0120da011094041a4100210541012139024020db01450d0020dc0110230b4101210e4101210d410121c401410121cc014101210741012108410121450c080b20044101102a000b200d4101102a000b0240201e450d00201f10230b200241086a2105200241046a210720ab01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d762004410174220d20062006200d491b220d4100480d762004450d0120022802002004200d102722060d020c0c0b200228020021060c020b200d10262206450d0a0b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200241046a280200220b200241086a28020022046b20ab014f0d00200420ab016a22052004490d75200b4101742204200520052004491b22044100480d75200b450d012002280200200b20041027220b450d0a0c020b2002280200210b0c020b20041026220b450d080b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ab016a360200200b20046a20ad0120ab011094041a410021c40141012139024020ac01450d0020ad0110230b4101210e4101210d0b410121cc010b410121070b410121080b410121450b410121050b410121090c490b20044101102a000b200d4101102a000b2005280200210b0b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b4100210a410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b0c470b20a102280200220b450d2520a10220d4026a280200210420a10220d5026a280200210620a10228020c2105024020a102280204450d00200b10230b02402004450d00200420d60274210b200521040340024020042d000020d702470d00200420d8026a28020020d90271450d00200420d6026a28020010230b200420d5026a2104200b20da026a220b0d000b0b20a10220d3026a21a10202402006450d00200510230b20a102209a02460d2541182145410e21040c650b20c00220a4026a21a10220c00228020022c102450d2320c00220a5026a28020021c20220c00220a6026a28020021c30220c00228020c21c40220c002290204212e410021c50220a8024100360200200320a90237024420c102202e20aa0288a722c60220ab02746a21c7022003200341206a360240202ea721c802410021c902024041004100460d00410121040c010b410221040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000102040607070b20a001280200210b03400240024002400240209d012802002094012802002204470d0020042095016a22052004490d84012004209501742206200520052006491b2206209601480d84012004450d01200328025420042006102722050d020c0d0b200328025421050c020b200610262205450d0b0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b20a0012099016a22a001209f01470d130c5a0b200328024421040c010b20c50220a2026a220420c502490d7d20c50220a20274220b20042004200b491b220b20af02480d7d0240024020c502450d00200328024420c502200b102722040d010c0a0b200b10262204450d090b20b102200b3602002003200436024420a80228020021c9020b20a80220c90220a2026a360200200420c9026a20c60220ae027220c60220ad027120c60220ac027622041b3a000002402004450d00200421c60220b10228020022c50220a80228020022c902470d12410221040c170b20c70220c102460d0120c10221ca02410321040c160b20ca0220b0026a21cb0220ca02290200222e20aa0288a7220420bc027120b202460d13200420a4027420a402752107202ea7210b0340024002400240024020b10228020020a8022802002204470d00200420a2026a22052004490d8001200420a202742206200520052006491b220620af02480d80012004450d01200328024420042006102722050d020c0a0b200328024421050c020b200610262205450d080b20b10220063602002003200536024420a80228020021040b20a802200420a2026a360200200520046a200b20ae0272200b20ad0271200b20ac027622041b3a00002004210b20040d000b024002400240024020b10228020020a8022802002204470d00200420a2026a220b2004490d7f200420a202742205200b200b2005491b220520af02480d7f2004450d012003280244200420051027220b0d020c0c0b2003280244210b0c020b20051026220b450d0a0b20b10220053602002003200b36024420a80228020021040b20a802200420a2026a360200200b20046a200720bd0273220420be027120bf02722004200720bd024a1b3a000020cb0221ca0220cb0220c702470d1120c70220c70222cb02470d140c030b20c10221cb02410421040c140b20c70220cb02460d01410521040c130b20cb022d0004210420cb0220b0026a21cb02200420b202470d0f0b024020c802450d0020c10210230b20c40220c20220b2027422046a210602400240024002400240024002400240024020c202450d0020c40220a4026a210b200420b6026a210720c4022104034020042d0000210520b802200420ab026a2d00003a00002003200420a2026a2f00003b0108200520b502460d02200341306a20b7026a220820b8022d00003a0000200320032f01083b0130200420b2026a290200212e200341086a20a7026a200420a7026a28020036020020a30220032f01303b000020a30220b7026a20082d00003a0000200320053a00082003202e37020c200341d0006a200341086a200341c0006a109e0120032d005022cc0220b902462205450d05200b20a6026a210b200720b6026a2107200420a6026a22042006470d000c040b0b20c40222042006460d020c010b200420a6026a22042006460d010b03400240024020042d0000220b20b302460d00200b20b502470d010c030b200420b0026a28020020b40271450d00200420b2026a28020010230b200420a6026a22042006470d000b0b024020c302450d0020c40210230b20b102280200210a200328024421092003280240210520a80228020022c002210b03400240024002400240200520b0026a2208280200200520a7026a22062802002204470d00200420a2026a22072004490d8101200420a202742245200720072045491b224520af02480d81012004450d01200520b2026a28020020042045102722070d020c0d0b200520b2026a28020021070c020b204510262207450d0b0b20082045360200200520b2026a2007360200200628020021040b2006200420a2026a360200200720046a200b20ae0272200b20ad0271200b20ac027622041b3a00002004210b20040d000b02402008280200220b200628020022046b20c0024f0d00200420c0026a22072004490d7d200b20a202742204200720072004491b220420af02480d7d200b450d02200520b2026a280200200b20041027220b0d030c0b0b200520b2026a280200210b0c030b200341d0006a20a7026a28020021cd02200341d0006a20b0026a28020021ce02200328025421cf0220032d005321d00220032d005221d10220032d005121d20202402007450d00034002400240200b20ba026a22042d0000220720b302460d00200720b502470d010c030b200b28020020b40271450d00200b20bb026a28020010230b200b20a6026a210b200420a6026a2006470d000b0b024020c302450d0020c40210230b024020b102280200450d00200328024410230b2005450d0320a10221c00220a102209a02470d0b0c390b20041026220b450d080b20082004360200200520b2026a200b360200200628020021040b2006200420c0026a360200200b20046a200920c0021094041a0240200a450d00200910230b20a10221c00220a102209a02470d070c360b20a102209a02460d1241182193044114219404411021950441042196044109219704410821980441ffffffff032199044170219a04412421450c0a0b20064101102a000b20064101102a000b200b4101102a000b20454101102a000b20054101102a000b20044101102a000b411721450c010b411721450c010b410e21040c6c0b410e21040c6b0b410e21040c6a0b410021040c050b410121040c040b410321040c030b410421040c020b410421040c010b410521040c000b0b02402037450d00203810230b0240200341206a41086a280200450d00200328022410230b200020d2023a0001200020cc023a00002000410c6a20cd02360000200041086a20ce02360000200041046a20cf02360000200041036a20d0023a0000200041026a20d1023a000041002106410121e8014101210c410121050b410121070b4101210b20012d00002204410e4b0d010b024020040e0f000c0b0a05070d0e12011003080602000b200141086a280200450d63200141046a2802001023200341e0006a24000f0b2001109f01200341e0006a24000f0b0240200141086a280200450d00200141046a28020010230b0240200141146a2802002202450d00200141186a280200450d00200210230b200141246a280200450d61200141206a2802001023200341e0006a24000f0b2006450d60410c21df032001410c6a2802002204450d00411821e003410421e103200141046a28020022e203200441186c6a21e303411421e403411021e503410921e603410821e70341ffffffff0321e803417021e903411d21450c130b200141086a280200450d5f200141046a2802001023200341e0006a24000f0b200141086a280200450d5e200141046a2802001023200341e0006a24000f0b200b450d5d200141046a2d000022044102460d0d20044101460d0c20040d0f2001410c6a280200450d5d200141086a2802001023200341e0006a24000f0b200141086a280200450d5c200141046a2802001023200341e0006a24000f0b2007450d5b410c21ea032001410c6a2802002204450d00411c21eb03410421ec03200141046a28020022ed032004411c6c6a21ee03410821ef03411421f003411021f103410921f20341ffffffff0321f303417021f403411e21450c0f0b200141086a280200450d5a200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a2802002102203141286c213103400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241286a2102203141586a22310d000b0b200141086a280200450d59200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a28020021022031410474213103400240200241046a280200450d00200228020010230b200241106a2102203141706a22310d000b0b200141086a280200450d58200141046a2802001023200341e0006a24000f0b20e801450d570240200141086a280200450d00200141046a28020010230b200141146a280200450d57200141106a2802001023200341e0006a24000f0b200141086a280200450d56200141046a2802001023200341e0006a24000f0b200c450d552001410c6a2802002204450d00410421f503200141046a28020022f60320044104746a21f703411021f803410921f903410821fa0341ffffffff0321fb03417021fc03411f21450c0a0b200141086a280200450d54200141046a2802001023200341e0006a24000f0b2005450d53410c21fd032001410c6a2802002204450d00411c21fe03410421ff03200141046a2802002280042004411c6c6a218104410821820441142183044110218404410921850441ffffffff032186044170218704412021450c090b200141086a280200450d52200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a2802002102203141146c213103400240200241046a280200450d00200228020010230b200241146a21022031416c6a22310d000b0b200141086a280200450d51200141046a2802001023200341e0006a24000f0b0240200141146a2802002231450d002001410c6a28020021022031410c6c21310340024020022802002204450d00200241046a280200450d00200410230b2002410c6a2102203141746a22310d000b0b200141106a280200450d502001410c6a2802001023200341e0006a24000f0b200141146a2802002204450d00410c219b042001410c6a280200229c0420044104746a219d044110219e044108219f04410421a004417421a104412621450c060b200141106a280200450d4e2001410c6a2802001023200341e0006a24000f0b2001410c6a280200450d4d200141086a2802001023200341e0006a24000f0b410e21040c480b410e21040c470b410e21040c460b410e21040c450b410e21040c440b209e022096026a2204209e02490d45209e0220960274220b20042004200b491b220b209802480d45024002400240209e02450d002003280224209e02200b102722040d010c020b200b10262204450d010b200341206a2097026a200b36020020032004360224209902280200219f020c020b200b4101102a000b200328022421040b209902209f022096026a3602002004209f026a20a002209d027220a002209c027120a002209b027622041b3a000002402004450d00200421a002200341206a2097026a280200229e02209902280200229f02470d03411521450c040b203821a1022036450d00410121a202200341086a41017221a302411821a402411421a502411021a602410c21a702200341c0006a410c6a21a802420121a902422021aa02410321ab02410721ac0241ff0021ad0241807f21ae02410021af02410821b002200341c0006a41086a21b102410421b202410921b30241ffffffff0321b40241ac0121b502417021b602410221b702200341086a41026a21b802411a21b902417821ba02417c21bb0241ff0121bc02417f21bd02413f21be0241c00021bf02203821c002411721450c050b20a102209a02460d00411821d302411421d402411021d502410421d602410921d702410821d80241ffffffff0321d902417021da02411821450c050b02402037450d00203810230b200341206a41086a2802002145200328022421082003280220220541046a210d2003412c6a2802002239210b024003400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490d472004410174220e20072007200e491b220e4100480d472004450d0120052802002004200e102722070d020c050b200528020021070c020b200e10262207450d030b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490d47200b4101742204200620062004491b22044100480d47200b450d012005280200200b20041027220b450d040c020b2005280200210b0c020b20041026220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b4100210b410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121090c210b20044101102a000b200e4101102a000b411621450c010b410e21040c3d0b410e21040c3c0b410e21040c3b0b410e21040c3a0b2091022089026a2204209102490d3a20910220890274220b20042004200b491b220b208b02480d3a024002400240209102450d002003280254209102200b102722040d010c020b200b10262204450d010b200341d0006a208a026a200b36020020032004360254208c022802002192020c020b200b4101102a000b200328025421040b208c022092022089026a36020020042092026a20930220900272209302208f0271209302208e027622041b3a000002402004450d002004219302200341d0006a208a026a280200229102208c02280200229202470d04411121450c070b2035219402024002402033450d004100210602400340200341086a41086a2209203520066a220b41086a2802003602002003200b290200370308200b410d6a2d0000220a4102460d01200341306a41086a2204200928020036020020032003290308370330200b410c6a2d0000219502200341206a41086a22cc012004280200360200200320032903303703200240024002400240200341d0006a41086a2207280200200341d0006a410c6a22052802002204470d00200441016a22082004490d40200441017422c4012008200820c401491b22c4014100480d402004450d012003280254200420c401102722080d020c090b200328025421080c020b20c40110262208450d070b200720c40136020020032008360254200528020021040b2005200441016a360200200820046a41fdf9ff7720950241037441187141107376413f7141c000723a00000240024002400240200728020020052802002204470d00200441016a22082004490d40200441017422950220082008209502491b2295024100480d402004450d0120032802542004209502102722080d020c0a0b200328025421080c020b20950210262208450d080b200720950236020020032008360254200528020021040b2005200441016a360200200820046a200a4100473a0000200341c0006a41086a20cc0128020036020020032003290320370340200341086a200341c0006a200341d0006a109d0120032d0008229502411a470d03200641106a2106200b41106a208d02470d000c090b0b200b41106a2194020b209402208d02460d05411021aa03410d21ab03410221ac03410421ad03410921ae03410821af0341ffffffff0321b003417021b103411321450c090b200341086a410c6a28020021b203200928020021b303200328020c21b40320032d000b21b50320032d000a21b60320032d000921b703410421b803417021b903203341047441706a2006460d00411021ba03200b41106a21bb03410d21bc03410221bd03410921be03410821bf0341ffffffff0321c003411421450c090b02402034450d00203510230b0240200341d0006a41086a280200450d00200328025410230b200020b7033a000120002095023a00002000410c6a20b203360000200041086a20b303360000200041046a20b403360000200041036a20b5033a0000200041026a20b6033a00004100210c410121e801410a21040c360b20c4014101102a000b2095024101102a000b411221450c030b410921040c320b410921040c310b410e21040c300b410e21040c2f0b410e21040c2e0b410e21040c2d0b20860220fd016a218702024002400240208602280204220920fe01460d002086022080026a2802002107208602280200210b0240024002400240024020fb0120fa01470d0020fa0120ff016a220420fa01490d3520fa0120ff01742205200420042005491b22fb01208102480d35024020fa01450d0020fc0120fa0120fb01102722fc010d010c020b20fb01102622fc01450d010b20fc0120fa016a200920ff01463a000020fa0120ff016a210420fa0120ff017422052082026a2108200520fe016a21fa01024002400340200821050240200420fb01470d00200420ff016a22062004490d3820fa012006200620fa01491b22fb01208102480d3802402004450d0020fc01200420fb01102722fc010d010c030b20fb01102622fc01450d020b20fc0120046a200b20850272200b20840271200b2083027622061b3a0000200520fe016a210820fa0120fe016a21fa01200420ff016a21042006210b20060d000b02400240200920ff01470d00200421fa010340024020fa0120fb01470d0020fa0120ff016a220420fa01490d3a2005200420042005491b22fb01208102480d3a024020fa01450d0020fc0120fa0120fb01102722fc010d010c060b20fb01102622fc01450d050b20fc0120fa016a20072085027220072084027120072083027622041b3a0000200520fe016a210520fa0120ff016a21fa012004210720040d000b20870221860220870220f901470d050c010b200421fa0120870221860220870220f901470d050b20f9012187020c050b20fb014101102a000b20fb014101102a000b20fb014101102a000b411021450c030b411021450c030b410721040c2f0b410721040c2e0b410e21040c2d0b410e21040c2c0b2004210b0b200a450d010b20f70110230b024002400240024002400240200920f101470d0020eb01200b470d02200b20ef016a2204200b490d2f200b20ef01742205200420042005491b22eb0120f001480d2f200b450d0120ec01200b20eb01102722ec010d020c070b024020eb01200b470d00200b20ef016a2204200b490d2f200b20ef01742205200420042005491b220420f001480d2f200b450d0320ec01200b2004102722ec010d040c080b20eb0121040c030b20eb01102622ec01450d050b20ec01200b6a20f0013a00000c020b2004102622ec01450d040b20ec01200b6a20ef013a000002400240024002402004200b20ef016a220b470d00200420ef016a220b2004490d2e200420ef01742205200b200b2005491b22eb0120f001480d2e2004450d0120ec01200420eb01102722ec010d020c080b200421eb010c020b20eb01102622ec01450d060b2004210b0b20ec01200b6a200920f3017120f401733a00000b200b20ef016a21ea0120f80121f70120f80120e901470d040b02402024450d00202510230b200241086a2105200241046a210720ea01210b024003400240024002400240200728020020052802002204470d00200441016a22062004490d2e2004410174220d20062006200d491b220d4100480d2e2004450d0120022802002004200d102722060d020c050b200228020021060c020b200d10262206450d030b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200241046a280200220b200241086a28020022046b20ea014f0d00200420ea016a22052004490d2e200b4101742204200520052004491b22044100480d2e200b450d012002280200200b20041027220b450d040c020b2002280200210b0c020b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ea016a360200200b20046a20ec0120ea011094041a4100210d41012139024020eb01450d0020ec0110230b4101210e410621040c290b20044101102a000b200d4101102a000b20eb014101102a000b20044101102a000b20eb014101102a000b410f2145410e21040c230b0240209b01450d00209c0110230b208c01219a01208c01208501470d1c0b0240201c450d00201d10230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490d282004410174220e20072007200e491b220e4100480d282004450d0120052802002004200e102722070d020c1f0b200528020021070c020b200e10262207450d1d0b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490d27200b4101742204200620062004491b22044100480d27200b450d012005280200200b20041027220b450d190c020b2005280200210b0c020b20041026220b450d170b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b41002109410121394101210e4101210d410121c401410121cc01410121074101210841012145410121050b4101210b0b4101210a0b410121060b410121c9010b2000411a3a000020012d00002204410e4b0d0f02400240024020040e0f000b0a0904060c0d11120f02070501000b200e450d22200141086a280200450d22200141046a2802001023200341e0006a24000f0b20c901450d210240200141086a280200450d00200141046a28020010230b0240200141146a2802002202450d00200141186a280200450d00200210230b200141246a280200450d21200141206a2802001023200341e0006a24000f0b200b450d20410c21db022001410c6a2802002204450d00411821dc02410421dd02200141046a28020022de02200441186c6a21df02411421e002411021e102410921e202410821e30241ffffffff0321e402417021e502411921450c170b200141086a280200450d1f200141046a2802001023200341e0006a24000f0b20cc01450d1e200141086a280200450d1e200141046a2802001023200341e0006a24000f0b2006450d1d200141046a2d000022044102460d0f20044101460d0e20040d112001410c6a280200450d1d200141086a2802001023200341e0006a24000f0b2007450d1c200141086a280200450d1c200141046a2802001023200341e0006a24000f0b200a450d1b410c21e6022001410c6a2802002204450d00411c21e702410421e802200141046a28020022e9022004411c6c6a21ea02410821eb02411421ec02411021ed02410921ee0241ffffffff0321ef02417021f002411a21450c130b200141086a280200450d1a200141046a2802001023200341e0006a24000f0b20c401450d1902402001410c6a2802002231450d00200141046a2802002102203141286c213103400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241286a2102203141586a22310d000b0b200141086a280200450d19200141046a2802001023200341e0006a24000f0b200d450d1802402001410c6a2802002231450d00200141046a28020021022031410474213103400240200241046a280200450d00200228020010230b200241106a2102203141706a22310d000b0b200141086a280200450d18200141046a2802001023200341e0006a24000f0b2039450d170240200141086a280200450d00200141046a28020010230b200141146a280200450d17200141106a2802001023200341e0006a24000f0b2008450d16200141086a280200450d16200141046a2802001023200341e0006a24000f0b2045450d152001410c6a2802002204450d00410421f102200141046a28020022f20220044104746a21f302411021f402410921f502410821f60241ffffffff0321f702417021f802411b21450c0e0b200141086a280200450d14200141046a2802001023200341e0006a24000f0b2009450d13410c21f9022001410c6a2802002204450d00411c21fa02410421fb02200141046a28020022fc022004411c6c6a21fd02410821fe02411421ff024110218003410921810341ffffffff032182034170218303411c21450c0d0b200141086a280200450d12200141046a2802001023200341e0006a24000f0b2005450d1102402001410c6a2802002231450d00200141046a2802002102203141146c213103400240200241046a280200450d00200228020010230b200241146a21022031416c6a22310d000b0b200141086a280200450d11200141046a2802001023200341e0006a24000f0b2001109f010c100b20044101102a000b0240200141146a2802002231450d002001410c6a28020021022031410c6c21310340024020022802002204450d00200241046a280200450d00200410230b2002410c6a2102203141746a22310d000b0b200141106a280200450d0e2001410c6a2802001023200341e0006a24000f0b200141146a2802002204450d00410c2188042001410c6a28020022890420044104746a218a044110218b044108218c044104218d044174218e04412221450c080b200141106a280200450d0c2001410c6a2802001023200341e0006a24000f0b2001410c6a280200450d0b200141086a2802001023200341e0006a24000f0b200e4101102a000b41092145410e21040c050b410e21040c040b410e21040c030b410e21040c020b410e21040c010b410e21040c000b0b101e000b101e000b41014101102a000b200341e0006a24000bf807030e7f017e017f200241086a2103200241046a21042001280200220521060240024002400240024003400240024002400240200428020020032802002207470d00200741016a22082007490d0520074101742209200820082009491b22094100480d052007450d01200228020020072009102722080d020c060b200228020021080c020b200910262208450d040b2002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b2001280204220a2001410c6a2802002206410c6c6a210b200141086a280200210c200a2107024002402006450d00200a21072005450d00200b41746a210d200241086a210341002107200a210e0340200e2108024003402008280200220f0d01200741016a2107200b2008410c6a2208470d000c040b0b2008410c6a210e200741016a21102005417f6a2105200841046a290200211103400240024002400240200241046a220428020020032802002206470d00200641016a22092006490d0820064101742201200920092001491b22014100480d082006450d01200228020020062001102722090d020c0a0b200228020021090c020b200110262209450d080b2002200936020020042001360200200328020021060b2003200641016a360200200920066a200741807f72200741ff0071200741077622061b3a00002006210720060d000b2011422088a72212210603400240024002400240200428020020032802002207470d00200741016a22092007490d0820074101742201200920092001491b22014100480d082007450d01200228020020072001102722090d020c0b0b200228020021090c020b200110262209450d090b2002200936020020042001360200200328020021070b2003200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b024002400240024020042802002206200328020022076b20124f0d00200720126a22092007490d0720064101742207200920092007491b22074100480d072006450d01200228020020062007102722060d020c0b0b200228020021060c020b200710262206450d090b2002200636020020042007360200200328020021070b2003200720126a360200200620076a200f20121094041a02402011a7450d00200f10230b0240200d2008460d002010210720050d010b0b2008410c6a21070b2007200b460d000340024020072802002206450d00200741046a280200450d00200610230b2007410c6a2207200b470d000b0b0240200c450d00200a10230b2000411a3a00000f0b101e000b20094101102a000b20014101102a000b20014101102a000b20074101102a000bd806010a7f200128020421032001280200210441002105410121064100210720012802082208210902400240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d05024002402005450d0020062005200a102722060d010c040b200a10262206450d030b200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d032005410174220a20092009200a491b22094100480d03024002402005450d0020062005200910272206450d010c030b2009102622060d020b20094101102a000b200a4101102a000b200921050b200620076a200420081094041a02402003450d00200410230b200128020c210c02400240024002400240200520086b20076b200141146a28020022094f0d00200820076a220a20096a2203200a490d052005410174220a20032003200a491b220a4100480d052005450d0120062005200a10272206450d020c030b200820096a20076a21030c030b200a102622060d010b200a4101102a000b200a21050b200620086a20076a200c20091094041a200241086a210a200241046a210820032109034002400240024002402008280200200a2802002207470d00200741016a220b2007490d0520074101742204200b200b2004491b22044100480d052007450d012002280200200720041027220b0d020c060b2002280200210b0c020b20041026220b450d040b2002200b36020020082004360200200a28020021070b200a200741016a360200200b20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b024002400240200241046a2802002209200241086a28020022076b20034f0d00200720036a220a2007490d0320094101742207200a200a2007491b22074100480d032009450d0120022802002009200710272209450d020c050b200228020021090c050b2007102622090d030b20074101102a000b101e000b20044101102a000b20022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a200620031094041a02402005450d00200610230b2000411a3a00000240200141106a280200450d00200c10230b0bbd04020d7f017e230041c0006b22032400200128020022042001280208220541047422066a2107200128020421082004210102400240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d02400340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b013020012d0000220e41ac01460d012003410c6a41026a220f200b2d00003a0000200320032f01303b010c200141046a2902002110200341306a410c6a2001410c6a280200360200200920032f010c3b0000200941026a200f2d00003a00002003200e3a003020032010370234200341206a200341306a200210ae022003200c2900003703102003200d29000037001720032d0020220e411a470d042006200a41106a220a470d000c030b0b200141106a21010b20012007460d0003400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a22012007470d000b0b02402008450d00200410230b2000411a3a00000c010b200020032903103700012000200e3a0000200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d002001417c6a28020010230b200141106a2101200a41106a2007470d000b0b2008450d0020041023200341c0006a24000f0b200341c0006a24000bd3ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610272205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610272205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810272209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810272206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610272205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810272209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810272209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810272209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610272205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810272209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610272205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910272206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610272205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510272208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610272205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810272209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910272206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610272205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610272205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610272205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610272208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510272208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610272205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610272205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610272205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610272205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610272205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510272208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910272206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610272205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510272208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610272205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610272205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610272205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610272205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610272205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610272205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810272209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610272205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810272209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610272205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610272205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610272205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610272205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610272205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610272205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610272205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610272205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610272205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610272205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610272205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610272205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610272205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810272209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810272209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610272205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610272205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610272205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810272209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810272209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610272205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610272205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610272205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610272205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610272205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610272205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610272205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610272205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810272209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610272205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610272205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610272205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610272205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610272205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610272205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610272205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910272206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610272205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610272205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610272205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610272205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610272205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610272205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610272205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510272208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810272209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610272205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610272205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610272205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610272205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610272205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610272205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610272205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610272205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610272205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610272205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610272205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610272205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610272205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610272205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610272205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610272205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610272205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610272205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610272205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610272205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610272205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610272205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610272205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610272205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610272205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610272205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610272205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610272205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610272205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810272209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810272205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910272206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610272205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610272205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610272205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610272205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610272205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610272205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610272205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610272205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610272205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610272205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610272205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610272205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610272205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610272205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610272205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610272205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610272205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610272205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610272205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810272209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810272209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610272205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610272205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610272205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910272206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610272205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610272205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610272205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810272209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610272205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610272205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610272205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610272205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610272205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610272205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610272205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610272205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510272208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610272205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610272205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810272209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610272205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610272205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810272209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810272209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610272205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110272206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810272209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610272205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810272209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510272208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610272205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510272208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610272205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102622050db4050b20064101102a000b2008102622090dad050b20084101102a000b2008102622060da9050b20084101102a000b2006102622050da5050b20064101102a000b2008102622090da1050b20084101102a000b2008102622090d9a050b20084101102a000b2008102622090d96050b20084101102a000b2006102622050d92050b20064101102a000b2008102622090d8e050b20084101102a000b2006102622050d8a050b20064101102a000b2009102622060d86050b20094101102a000b2006102622050d82050b20064101102a000b2005102622080dfe040b20054101102a000b2006102622050dfa040b20064101102a000b2008102622090df6040b20084101102a000b2009102622060df2040b20094101102a000b2006102622050dee040b20064101102a000b2006102622050dea040b20064101102a000b2006102622050de6040b20064101102a000b2006102622080de2040b20064101102a000b2005102622080dde040b20054101102a000b2006102622050dda040b20064101102a000b2006102622050dd6040b20064101102a000b2006102622050dd2040b20064101102a000b2006102622050dce040b20064101102a000b2006102622050dca040b20064101102a000b2005102622080dc6040b20054101102a000b2009102622060dc2040b20094101102a000b2006102622050dbe040b20064101102a000b2005102622080dba040b20054101102a000b2006102622050db6040b20064101102a000b2006102622050db2040b20064101102a000b2006102622050dae040b20064101102a000b2006102622050daa040b20064101102a000b2006102622050da6040b20064101102a000b2006102622050da2040b20064101102a000b2006102622050dee040b20064101102a000b2008102622090d9c040b20084101102a000b2006102622050d98040b20064101102a000b2008102622090d94040b20084101102a000b2006102622050d90040b20064101102a000b2006102622050d8c040b20064101102a000b2006102622050d88040b20064101102a000b2006102622050d84040b20064101102a000b2006102622050d80040b20064101102a000b2006102622050dfc030b20064101102a000b2006102622050df8030b20064101102a000b2006102622050df4030b20064101102a000b2006102622050df0030b20064101102a000b2006102622050dec030b20064101102a000b2006102622050de8030b20064101102a000b2006102622050de4030b20064101102a000b2006102622050de0030b20064101102a000b2008102622090ddc030b20084101102a000b2008102622090dd8030b20084101102a000b2006102622050dd4030b20064101102a000b2006102622050dd0030b20064101102a000b2006102622050dcc030b20064101102a000b2008102622090dc8030b20084101102a000b2008102622090dc4030b20084101102a000b2006102622050dc0030b20064101102a000b2006102622050dbc030b20064101102a000b2006102622050db8030b20064101102a000b2006102622050db4030b20064101102a000b2006102622050db0030b20064101102a000b2006102622050dac030b20064101102a000b2006102622050da8030b20064101102a000b2006102622050da4030b20064101102a000b2008102622090da0030b20084101102a000b2006102622050d9c030b20064101102a000b2006102622050d98030b20064101102a000b2006102622050d94030b20064101102a000b2006102622050d90030b20064101102a000b2006102622050d8c030b20064101102a000b2006102622050d88030b20064101102a000b2006102622050d84030b20064101102a000b2009102622060d80030b20094101102a000b2006102622050dfc020b20064101102a000b2006102622050df8020b20064101102a000b2006102622050df4020b20064101102a000b2006102622050df0020b20064101102a000b2006102622050dec020b20064101102a000b2006102622050de8020b20064101102a000b2006102622050de4020b20064101102a000b2005102622080de0020b20054101102a000b2008102622090ddc020b20084101102a000b2006102622050dd8020b20064101102a000b2006102622050dd3020b20064101102a000b2006102622050dcf020b20064101102a000b2006102622050dcb020b20064101102a000b2006102622050dc7020b20064101102a000b2006102622050dc3020b20064101102a000b2006102622050dbf020b20064101102a000b2006102622050dbb020b20064101102a000b2006102622050db7020b20064101102a000b2006102622050db3020b20064101102a000b2006102622050daf020b20064101102a000b2006102622050dab020b20064101102a000b2006102622050da7020b20064101102a000b2006102622050da3020b20064101102a000b2006102622050d9f020b20064101102a000b2006102622050d9b020b20064101102a000b2006102622050d97020b20064101102a000b2006102622050d93020b20064101102a000b2006102622050d8f020b20064101102a000b2006102622050d8b020b20064101102a000b2006102622050d87020b20064101102a000b2006102622050d83020b20064101102a000b2006102622050dff010b20064101102a000b2006102622050dfb010b20064101102a000b2006102622050df7010b20064101102a000b2006102622050df3010b20064101102a000b2006102622050def010b20064101102a000b2006102622050deb010b20064101102a000b2006102622050de7010b20064101102a000b2008102622090de3010b20084101102a000b2008102622050ddf010b20084101102a000b2009102622060ddb010b20094101102a000b2006102622050dd7010b20064101102a000b2006102622050dd3010b20064101102a000b2006102622050dcf010b20064101102a000b2006102622050dcb010b20064101102a000b2006102622050dc7010b20064101102a000b2006102622050dc3010b20064101102a000b2006102622050dbf010b20064101102a000b2006102622050dbb010b20064101102a000b2006102622050db7010b20064101102a000b2006102622050db3010b20064101102a000b2006102622050daf010b20064101102a000b2006102622050dab010b20064101102a000b2006102622050da7010b20064101102a000b2006102622050da3010b20064101102a000b2006102622050d9f010b20064101102a000b2006102622050d9b010b20064101102a000b2006102622050d97010b20064101102a000b2006102622050d93010b20064101102a000b2006102622050d8f010b20064101102a000b2008102622090d8b010b20084101102a000b2008102622090d87010b20084101102a000b2006102622050d83010b20064101102a000b2006102622050d7f0b20064101102a000b2006102622050d7b0b20064101102a000b2009102622060d770b20094101102a000b2006102622050d730b20064101102a000b2006102622050d6f0b20064101102a000b2006102622050d6b0b20064101102a000b2008102622090d670b20084101102a000b2006102622050d630b20064101102a000b2006102622050d5f0b20064101102a000b2006102622050d5b0b20064101102a000b2006102622050d570b20064101102a000b2006102622050d530b20064101102a000b2006102622050d4f0b20064101102a000b2006102622050d4b0b20064101102a000b2006102622050d470b20064101102a000b2005102622080d430b20054101102a000b2006102622050d3f0b20064101102a000b2006102622050d3b0b20064101102a000b2008102622090d370b20084101102a000b2006102622050d330b20064101102a000b2006102622050d2f0b20064101102a000b2008102622090d2b0b20084101102a000b2008102622090d270b20084101102a000b2006102622050d230b20064101102a000b2001102622060d1f0b20014101102a000b2008102622090d1b0b20084101102a000b2006102622050d170b20064101102a000b2008102622090d130b20084101102a000b2005102622080d0f0b20054101102a000b2006102622050d0b0b20064101102a000b2005102622080d070b20054101102a000b2006102622050d030b20064101102a000b101e000b101e000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d4101102a000b20094101102a000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210af020240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102722050d020c060b200928020021050c020b200810262205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10230b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1023200341106a24000f0b20084101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210b00220032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a200210b10220032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001023200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d4101102a000b20094101102a000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b20094101102a000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102722080d020c050b200b28020021080c020b200710262208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610272205450d020c040b200b28020021050c040b2006102622050d020b20064101102a000b20074101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102722060d020c070b200728020021060c020b200910262206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b101e000b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102722050d020c070b200728020021050c020b200910262205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b101e000b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200341106a24000bf30f01347f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002201410d4b0d00024020010e0e000203040506070809140a0b0c0d000b200041086a280200450d13200041046a28020010230f0b0240200041086a280200450d00200041046a28020010230b0240200041146a2802002201450d00200041186a280200450d00200110230b200041246a280200450d12200041206a28020010230f0b0240200041086a280200450d00200041046a28020010230b200041146a280200450d11200041106a28020010230f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b200041086a280200450d10200041046a28020010230f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200241586a22020d000b0b200041086a280200450d0f200041046a28020010230f0b200041086a280200450d0e200041046a28020010230f0b200041086a280200450d0d200041046a28020010230f0b200041086a280200450d0c200041046a28020010230f0b2000410c6a2802002201450d0a41042103200041046a280200220420014104746a210541102106410921074108210841ffffffff0321094170210a410021010c050b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d00200128020010230b200141146a21012002416c6a22020d000b0b200041086a280200450d0a200041046a28020010230f0b410c210b2000410c6a2802002201450d07411c210c4104210d200041046a280200220e2001411c6c6a210f4108211041142111411021124109211341ffffffff03211441702115410121010c030b410c21162000410c6a2802002201450d054118211741042118200041046a2802002219200141186c6a211a4114211b4110211c4109211d4108211e41ffffffff03211f41702120410221010c020b410c21212000410c6a2802002201450d03411c212241042123200041046a28020022242001411c6c6a21254108212641142127411021284109212941ffffffff03212a4170212b410321010c010b024002400240200041046a2d000022014102460d0020014101460d0120010d022000410c6a280200450d09200041086a28020010230f0b200041146a2802002201450d03410c212c2000410c6a280200222d20014104746a212e4110212f410821304104213141742132410421010c020b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002206450d00200141046a280200450d00200610230b2001410c6a2101200241746a22020d000b0b200041106a280200450d072000410c6a28020010230f0b2000410c6a280200450d06200041086a28020010230f0b0340024002400240024002400240024002400240024020010e050001020304040b024020042802082202450d0020042802002101200220037421020340024020012d00002007470d00200120086a280200200971450d00200120036a28020010230b200120066a21012002200a6a22020d000b0b200420066a21010240200420036a280200450d00200428020010230b2001210420012005470d040c0e0b0240200e200b6a2802002202450d00200e28020421012002200d7421020340024020012d00002013470d00200120106a280200201471450d002001200d6a28020010230b200120126a2101200220156a22020d000b0b0240200e20106a280200450d00200e200d6a28020010230b200e200c6a21010240200e20116a280200450d00200e28021010230b2001210e2001200f470d040c0c0b0240201920186a280200450d00201928020010230b02402019201b6a2802002202450d00201928020c2101200220187421020340024020012d0000201d470d002001201e6a280200201f71450d00200120186a28020010230b2001201c6a2101200220206a22020d000b0b201920176a210102402019201c6a280200450d00201920166a28020010230b200121192001201a470d040c0a0b0240202420216a2802002202450d0020242802042101200220237421020340024020012d00002029470d00200120266a280200202a71450d00200120236a28020010230b200120286a21012002202b6a22020d000b0b0240202420266a280200450d00202420236a28020010230b202420226a21010240202420276a280200450d00202428021010230b2001212420012025470d040c080b202d2233202f6a212d024020332802042201450d0002402033202c6a2802002202450d002002202c6c21020340024020012802002234450d00200120316a280200450d00203410230b2001202c6a2101200220326a22020d000b0b203320306a280200450d00203320316a28020010230b202d202e470d040c060b410021010c040b410121010c030b410221010c020b410321010c010b410421010c000b0b200041106a280200450d042000410c6a28020010230c040b200041086a280200450d03200041046a28020010230f0b200041086a280200450d02200041046a28020010230f0b200041086a280200450d01200041046a28020010230f0b200041086a280200450d00200041046a28020010230f0b0be3da012d067f017e017f017e027f017e027f017e3b7f027e107f017e0f7f027e067f017e117f027e0e7f017e0b7f027e107f027e177f027e177f017e067f017e017f017e027f017e017f017e1a7f017e097f017e0b7f017e0b7f017e277f230041f080046b2202240002400240200141046a280200220320012802082204470d00200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802dc8004210120022802d88004210420004101360200200041003a00042001450d01200410230c010b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d01200128020020046a2d00002104200141086a20053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004410b4b0d0002400240024002400240024002400240024002400240024020040e0c00070405020809060b030a01000b200241c0006a200110a301410121062002280244210720022802404101470d1220074108762101200241d0006a2802002104200241c0006a41086a29030021080cb0010b200241c0006a200110a40120022802404101470d0b200228024422014108762109200241c0006a41086a290300220a4220882108200241d0006a280200210b0cc3010b200241c0006a200110a40120022802404101470d0b200228024422044108762103200241c0006a41086a2903002208422088210a200241d0006a28020021010cc0010b200241c0006a200110a40120022802404101470d0b20022802442201410876210c200241c0006a41086a290300220d4220882108200241d0006a280200210e0cbd010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cba010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb7010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb4010b200241c0006a200110a40120022802404101470d0c200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb1010b200241c0006a200110a40120022802404101470d0c200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cae010b200241c0006a200110a40120022802404101470d0c2002280244220f4108762101200241c0006a41086a29030022104220882108200241d0006a28020021110cab010b200241c0006a200110a40120022802404101470d0c200228024422124108762101200241c0006a41086a2903002208422088210a200241d0006a28020021130ca8010b200241c0006a200110a40120022802404101470d0c200041013602002000200241c0006a41047222012902003702042000410c6a200141086a290200370200200241f080046a24000f0b200041123a000420004101360200200041056a20043a0000200241f080046a24000f0b200241386a200241d4006a280200360200200241306a2214200241c0006a410c6a2902003703002002200229024437032841002109410021014100211503402001411f4b0d0c20142802002205200241286a410c6a22162802002204460d1d200441016a21032004417f460d5820052003490d59200228022820046a2d0000210420162003360200200441ff00712001411f71742015722115200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a41002109410d21170c0c0b200241e880046a200241d4006a280200360200200241e080046a2201200241cc006a290200370300200220022902443703d88004200128020021034100210420022802e48004210120022802d8800421184100211903402004411f4b0d0d20032001460d1d2001417f460d592003200141016a2207490d5a201820016a2d0000220541ff00712004411f71742019722119200441076a2104200721012005418001710d000b200241e480046a200736020020044120490d2a20056741686a41ff017141044f0d2a41002104410d21070c0d0b200241e880046a200241d4006a280200360200200241e080046a221a200241c0006a410c6a290200370300200220022902443703d880044100210c410021014100211b03402001411f4b0d0e201a2802002205200241d880046a410c6a221c2802002204460d1d200441016a21032004417f460d5a20052003490d5b20022802d8800420046a2d00002104201c2003360200200441ff00712001411f7174201b72211b200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a4100210c410d211d0c0e0b200241e880046a200241d4006a280200360200200241e080046a221e200241c0006a410c6a290200370300200220022902443703d880044100211f410021014100210603402001411f4b0d0f201e2802002205200241d880046a410c6a22202802002204460d1d200441016a21032004417f460d5b20052003490d5c20022802d8800420046a2d0000210420202003360200200441ff00712001411f71742006722106200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a410d2101410021070cad010b200241d4006a2802002121200241d0006a2802002101200241cc006a2802002122200241c8006a28020021232002280244212441002120410021044100212503402004411f4b0d0f20222001460d1d2001417f460d5c2022200141016a2226490d5d202420016a2d0000220341ff00712004411f71742025722125200441076a2104202621012003418001710d000b20044120490d2a20036741686a41ff017141044f0d2a410d2101410021040caa010b200241e880046a200241d4006a280200360200200241e080046a2227200241c0006a410c6a290200370300200220022902443703d8800441002128410021014100212903402001411f4b0d0f20272802002205200241d880046a410c6a22202802002204460d1d200441016a21032004417f460d5d20052003490d5e20022802d8800420046a2d0000210420202003360200200441ff00712001411f71742029722129200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a410d2101410021070ca7010b200241c0006a4100418080011093041a410021184100210502402007450d00200141086a2125200141046a21294101210641002118410021034100211903402029280200221b202528020022056b200720196b220441808001200441808001491b2204490d25200520046a22222005490d69201b2022490d6a200241c0006a200128020020056a20041094041a202520223602000240024002400240201820036b20044f0d00200320046a22052003490d890120184101742222200520052022491b22224100480d89012018450d01200620182022102722060d020c6f0b200420036a21050c020b202210262206450d6d0b202221180b200620036a200241c0006a20041094041a200521032007200420196a22194b0d000b0b200241003602d08004200220053602cc8004200220063602c88004200241c0006a200241c880046a10a301410121292002280244210720022802404101470d1520074108762101200241c0006a41086a2903002208422088a72122200241d0006a28020021042008a721250c9c010b200241d4006a280200212a200241d0006a2802002101200241cc006a2802002107200241c8006a280200212b2002280244212c41002120410021044100212d03402004411f4b0d0e20072001460d1c2001417f460d5d2007200141016a222e490d5e202c20016a2d0000220341ff00712004411f7174202d72212d200441076a2104202e21012003418001710d000b20044120490d2920036741686a41ff017141044f0d29410d2101410021070ca3010b200241e880046a200241d4006a280200360200200241e080046a2201200241cc006a290200370300200220022902443703d88004200128020021054100210420022802e48004210120022802d8800421184100210303402004411f4b0d0e20052001460d1c2001417f460d5e2005200141016a2207490d5f201820016a2d0000221941ff00712004411f71742003722103200441076a2104200721012019418001710d000b200241e480046a200736020020044120490d2920196741686a41ff017141044f0d2941002104410d21180c0e0b200241e880046a200241d4006a280200360200200241e080046a222f200241c0006a410c6a290200370300200220022902443703d8800441002130410021014100212003402001411f4b0d0f202f2802002211200241d880046a410c6a22052802002204460d1c200441016a21032004417f460d5f20112003490d6020022802d88004221f20046a2d0000210420052003360200200441ff00712001411f71742020722120200141076a21012004418001710d000b20014120490d2920046741686a41ff017141044f0d29410d210f410021310c9d010b200241d4006a2802002132200241d0006a2802002101200241cc006a2802002118200241c8006a280200213320022802442134410021044100213503402004411f4b0d0f20182001460d1c2001417f460d602018200141016a2219490d61203420016a2d0000220341ff00712004411f71742035722135200441076a2104201921012003418001710d000b20044120490d2920036741686a41ff017141034b0d29410d21120c0f0b200241d4006a2802002106200241d0006a2802002101200241cc006a2802002103200241c8006a280200212220022802442118410021044100210503402004411f4b0d1020032001460d1d2001417f460d612003200141016a2219490d62201820016a2d0000220741ff00712004411f71742005722105200441076a2104201921012007418001710d000b024020044120490d00410d210120076741686a41ff01714104490d1e0b2006201946210102402022450d00201810230b2001450d2b410921040c95010b410f21170b41002136410021370ca9010b200241e480046a200136020041002104410f21070b41002118410021220ca5010b410f211d0b41002138410021390ca1010b410f2101410021070c9e010b410f2101410021040c9b010b410f2101410021070c98010b410f2101410021070c95010b200241e480046a200136020041002104410f21180b41002122410021060c91010b410f210f410021310c8e010b410f21120b0c0c0b410f21010c0d0b2007450d18200241c0006a41004180081093041a200241d080046a222d280200210420022802cc8004211520022802c8800421354101212941002125410021034100211b0340201520046b2007201b6b22014180082001418008491b2201490d1a200420016a22192004490d5520152019490d56200241c0006a203520046a20011094041a202d20193602000240024002400240202520036b20014f0d00200320016a22222003490d7220254101742204202220222004491b22044100480d722025450d01202920252004102722290d020c5b0b200120036a21220c020b200410262229450d590b200421250b202920036a200241c0006a20011094041a201921042022210320072001201b6a221b4b0d000b200241c0006a2029202210a50120022802404101470d27410821072025450d2a202910230c86010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7213620022802e08004210b2008a7213741052117410021090c99010b200241e480046a2003360200200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72118200228023021012008a7212241052107410021040c96010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a721382002280230210e2008a721394105211d4100210c0c93010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a7211f200228023021032008a72107410521010c90010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7212020022802e0800421032008a72104410521010c8d010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72128200228023021032008a72107410521010c8a010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7212020022802e0800421032008a72107410521010c87010b200241e480046a2005360200200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72122200228023021032008a7210641052118410021040c84010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72130200228023021112008a721314105210f0c81010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802e08004211320022903d880042108410521120b2008422088a7213a2008a7213b0c7d0b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201410521010b2000200136020420004101360200200041086a20022902d88004370200200041106a200241d880046a41086a2802003602002022450d8f0120181023200241f080046a24000f0b200241013a00c88004200241ec80046a410136020020024107360224200242013702dc80042002419cf6c4003602d880042002200241c880046a3602202002200241206a3602e88004200241286a200241d880046a10a20120022802302104200229032821084105210702402018450d00200610230b0c790b2015450d0c4100213c4104213d4101213e411f213f410c2140200241286a410c6a214141082142200241286a41086a2143417f214441ff002145410721464180012147416821484120214941ff01214a41808004214b421c214c4220214d411c214e4110214f410321504118215141142152410421054100211441002116410021200c540b2019450d0c41042105200241d880046a410c6a21294108211b4100210641002125024020032007460d000340200741016a21012007417f460d4a20032001490d4b201820076a2c000021042029200136020020044100480d1d41072107200441c00071450d1e200441807f7222044170470d20200241c0006a200241d880046a10a60120022f004520022d004741107472210420022d0044210720022802404101460d1f200241c0006a410c6a2802002103200241c0006a41086a280200211802400240024020252006470d0020064101742201200641016a222220222001491b2222ad420c7e2208422088a70d622008a722014100480d622006450d0120052006410c6c2001102722050d020c530b200621220c010b200110262205450d510b2005201b6a220120033602002001417b6a200441ffffff077122044110763a0000200141796a20043b00002001417c6a2018360200200141786a20073a0000202541016a220120194f0d21201b410c6a211b20022802d8800421182022210620012125200241d880046a41086a280200220320292802002207470d000b0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200241306a2802002101200228022c211820022802282122410521070c1e0b201b450d0c4100215f4104216041012161411f2162410c2163200241d880046a410c6a216441082165200241d880046a41086a2166417f216741ff00216841072169418001216a4168216b4120216c41ff01216d421c216e4220216f411c2170411021714103217241182173411421744102217542022176417c2177410421054100211a4100211c410121200c530b2006450d0c41042178410021794101217a410c217b200241c0006a410c6a217c4108217d200241c0006a41086a217e417f217f4103218001411f21810141ff0021820141072183014180012184014168218501412021860141ff01218701422821880142202189014128218a01411c218b01411a218c014119218d014118218e014114218f014110219001410221910141c00021920141807f219301417021940141fc012195014100211e4104210541002196014100219701410221200c530b410421052025450d0c41002199014101219a01411f219b01417f219c0141ff00219d014107219e01418001219f01416821a001412021a10141ff0121a201410321a301420221a401422021a501410221a601410021a701410021a801410321200c530b2029450d0c410421a901410021aa01410121ab01410c21ac01410821ad01417f21ae01410321af01411f212841ff0021b001410721b10141800121b201416821b301412021b40141ff0121b501421421b601422021b701411421b8014100212741042105410021b901410021ba01410421200c530b202d450d0c410021bb01410020076b21bc01410421bd01410121be01417f21bf0141e00021c001410321c101411f21c20141ff0021c301410721c40141800121c501416821c601412021c70141ff0121c801411021c901410821ca0141c00021cb0141807f21cc0141fb0121cd014180807c21ce01420421cf01422021d001410221d101410021d20141042105410021d301410021d401410521200c530b2003450d0c200241c0006a410c6a2129200241c0006a41086a21154100212541002119410021014100211b410421050340200241c0006a200241d880046a10a60120022f004520022d0047411074722104202928020021222015280200210620022d0044211820022802404101460d14200141016a210702402001201b470d002025200720072025491b221bad420c7e2208422088a70d592008a7222d4100480d5902402001450d0020052019202d102722050d010c440b202d10262205450d430b200520196a220120183a0000200141036a20044110763a0000200141016a20043b0000200141086a2022360200200141046a2006360200202541026a21252019410c6a21192007210120072003490d000c0e0b0b2020450d0d200241d880046a410c6a215c200241c0006a41086a215b4100215941002158410021544100212f41042153410421d60141042105024020112003460d000340200341016a21042003417f460d4520112004490d46201f20036a2c00002101205c200436020020014100480d1c4106210f200141c00071450d1d200141807f72225d41ff017141fc01490d1e20112004460d1f200341026a21032004417f460d4720112003490d48201f20046a2d00002101410c210f200241d880046a410c6a20033602004100210302402001450d0020014101470d2241800221030b200241c0006a200241d880046a10a701200241c0006a410c6a2802002130205b28020021312002280244210f20022802404101460d22205441016a210402402054202f470d002059200420042059491b222fad420486225e422088a70d59205ea722014100480d59024002402054450d00205320582001102722530d010c4d0b200110262253450d4c0b205321d601205321050b200520586a2201200f3602002001410c6a205a4180807c71205d417f7341ff017172200372225a360200200141086a2030360200200141046a2031360200200420204f0d23205941026a2159205841106a215820022802d88004211f20042154200241d880046a41086a2802002211205c2802002203470d000b0b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2010c1e0b2035450d0d200241c9006a21d701410021d801410421d901410121da01411f21db01417f21dc0141ff0021dd01410721de0141800121df01416821e001412021e10141ff0121e2014180800121e301411021e401200241286a41106a21e501410c21e601200241286a410c6a21e701422021e801410221e901410821ea01200241c0006a41086a21eb01410621ec01411421ed01200241c0006a41146a21ee01420421ef01410321f001421821f101411821f201417e21f301420321f401410721f501420121f601419cf6c40021f70141c00021f80141807f21f90141fb0121fa014180807c21fb0141042105410021fc01410021fd01410621200c510b4100210741002122410021250c0f0b200241013a00c78004200241ec80046a410136020020024107360224200242013702dc80042002419cf6c4003602d880042002200241c780046a3602202002200241206a3602e88004200241286a200241d880046a10a20120022903282208422088a72122200228023021042008a72103410521074100210102402025450d00202910230b200321250c6c0b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201200241cb006a200241e080046a280200360000200220022903d88004370043200041053a000420004101360200200020022900403700052000410c6a200241c7006a290000370000200241f080046a24000f0b410021144104210541002116410021010c500b4100212241042105410021040c130b4100211a410421054100211c410121010c4e0b410021960141042105410021010c640b410021a701410021a8010c620b410021b90141042105410021010c600b410021d30141042105410021590c5e0b41042105410021074100211b0b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b2001450d022007ad422086201bad84210a410621040c600b41042105410021044100212f0c460b410021fc0141042105410021fd01410221010c460b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088210a200228023021034105210141002104201b450d66200510230c660b202941087621070b2005200241d080046a2802002203490d37200520036b2204417f4c0d38024002402004450d00200410262201450d3b2001200620036a20041094041a0c010b410121010b2022ad42208621082025ad210a2004ad220d422086211002402018450d00200610230b2008200a84210a2010200d8421082007410874202941ff0171722105410121040c5b0b200241d0006a2802002103201b450d62200510230c620b0c5b0b411821070b0c010b20044180feff07714108762103200241d0006a2802002101200241cc006a2802002118200241c0006a41086a28020021220b2003410874200441ff01717221042006450d69200510230c690b202541016a21040b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b02402001450d002004ad4220862022ad84210a410521040c540b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088210a2002280230210141052104410021032022450d68200510230c680b4118210f0b0c030b205d21010c020b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2010b20022802302111200228022c2130200228022821314105210f0b200141ff0171410874200f72210f2054450d3f0c330b200241d0006a280200211120540d320c3e0b205441016a21040c320b417f20051048000b20052003108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2003108c01000b417f20031048000b20032005108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2022108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2007108c01000b417f200141016a1048000b200141016a2005108c01000b417f20031048000b20032011108c01000b417f200141016a1048000b200141016a2018108c01000b417f200141016a1048000b200141016a2003108c01000b200520221048000b2022201b108c01000b20224101102a000b200420191048000b20192015108c01000b20044101102a000b202d4104102a000b417f20011048000b20012003108c01000b417f20041048000b20042011108c01000b417f20031048000b20032011108c01000b20014104102a000b20014104102a000b200320051048000b101d000b20044101102a000b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b200520586a21be02411021bf02410421c002410921c102410821c20241ffffffff0321c302417021c402410c2120410321010c010b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b02402001450d002004ad422086202fad84210a410721040c190b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201422021910220022903282110200228023021112004450d124104219202200520044104746a21930241102194024109219502410821960241ffffffff032197024170219802200521990241082120410321010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010206060b200241346a28020020022802384621010240200228022c450d00200228022810230b2001450d032016ad4220862014ad84210a410c21040cdf010b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b2001450d01201cad422086201aad84210a410a21040cde010b2019203246210102402033450d00203410230b2001450d0220fd01ad42208620fc01ad84210a410b21040cdd010b20024103410220011b3a00c880044114219a02200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2014220219b022002290328210d2002280230210e201c450d03411c219c022005201c411c6c6a219d02410c219e024108219f02410421a002411021a102410921a20241ffffffff0321a302417021a402200521a502410921200cb9010b20024103410220011b3a00c88004411421a602200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241d880046a200241c0006a10a201422021a70220022903d88004210a20022802e08004210b2016450d04411c21a80220052016411c6c6a21a902410c21aa02410821ab02410421ac02411021ad02410921ae0241ffffffff0321af02417021b002200521b102410a21200cba010b20024103410220011b3a0028411421b202200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201422021b30220022903d88004210820022802e08004211320fd01450d05411821b402200520fd0141186c6a21b502410421b602411021b702410c21b802410921b902410821ba0241ffffffff0321bb02417021bc02200521bd02410b21200cbb010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024020200e0f000102030405060b0d1416181c202c2c0b20162253203e6a2116410021014100211f0340410021092001203f4b0d0c2043280200225420412802002204460d0e2004203e6a210320042044460d7420542003490d75200228022820046a2d000021042041200336020020042045712001203f7174201f72211f200120466a210120042047710d000b024020012049490d0020046720486a204a71203d490d530b200241c0006a200241286a10a7012002280240203e460d53200241c0006a20406a2802002155200241c0006a20426a280200215620022802442157410021044100215803402004203f4b0d1d2043280200225420412802002203460d1f2003203e6a210120032044460d840120542001490d85012002280228225920036a2d000021032041200136020020032045712004203f71742058722158200420466a210420032047710d000b024020042049490d0020036720486a204a71203d490d5e0b4100215a200241c0006a4100204b1093041a024002402058450d004100215a4101215b410021034100215c0340205420016b2058205c6b2204204b2004204b491b2204490d3d200120046a225d2001490d9b012054205d490d9c01200241c0006a205920016a20041094041a2041205d3602000240024002400240205a20036b20044f0d00200320046a225d2003490ddd01205a203e742201205d205d2001491b2201203c480ddd01205a450d01205b205a20011027225b0d020ca1010b200420036a215d0c020b20011026225b450d9f010b2001215a0b205b20036a200241c0006a20041094041a20582004205c6a225c4d0d02204128020021012043280200215420022802282159205d21030c000b0b4101215b4100215d0b024020142053470d002014203e7422012014203e6a220420042001491b2204ad204c7e225e204d88a70dd701205ea72201203c480dd701024002402014450d0020052014204e6c2001102722050d010c9e010b200110262205450d9d010b200421140b20052053204e6c6a2201201f20427622043b00012001205b360210200120573602042001201f3a0000200120506a2004204f763a0000200120516a205d360200200120526a205a360200200120406a2055360200200120426a205636020020162015490dae010cbd010b201c225820616a211c410021014100211f03404100210c200120624b0d072066280200225420642802002204460d09200420616a210320042067460d7120542003490d7220022802d8800420046a2d00002104206420033602002004206871200120627174201f72211f200120696a21012004206a710d000b02402001206c490d00200467206b6a206d712060490d4b0b200241c0006a200241d880046a10a70120022802402061460d4b200241c0006a20636a2201280200215c200241c0006a20656a2204280200215d2002280244215a200241c0006a200241d880046a10a80120022802402061460d4c2004280200215b2002280244215902400240024020012802002201450d00200120757422032075752253ad207686225e206f88a70dd801205ea72201205f480dd801200110262254450d9e01200320776a21552054210120592104034020012004280200360200200120606a2101200420606a2104200320776a22030d000b205520757620616a2104205b450d020c010b410021534104215441002104205b450d010b205910230b0240201a2058470d00201a2061742201201a20616a220320032001491b2203ad206e7e225e206f88a70dd601205ea72201205f480dd60102400240201a450d002005201a20706c2001102722050d010c9f010b200110262205450d9e010b2003211a0b2005205820706c6a2201201f20657622033b0001200120543602102001205a3602042001201f3a0000200120726a20032071763a0000200120736a2004360200200120746a2053360200200120636a205c360200200120656a205d360200201c201b490dae010cbd010b200241c0006a200241d880046a10a901207c280200211f207e280200215d2002280244215b2002280240207a460d23200241c0006a200241d880046a10a901207c2802002157207e2802002153200228024421552002280240207a460d24200241d880046a207d6a2802002203200241d880046a207b6a22592802002220460d252020207a6a21012020207f460d850120032001490d860120022802d88004225c20206a2d00002104205920013602004100215a20042080014b0d2602400240024002400240024020040e0400030102000b4100215a4100210441002120034020042081014b0d1d20032001460d1e2001207f460d7f20032001207a6a2258490d8001205c20016a2d000021542059205836020020542082017120042081017174202072212020042083016a2104205821012054208401710d000b4100215a02402004208601490d002054672085016a208701712078490d5b0b209601209701460d030c040b200241c0006a200241d880046a10a601207e290300215e200228024421202002280240207a460d424102215a209601209701460d020c030b20032001460d4320202091016a21582001207f460d9f0120032058490da001205c20016a2c000021042059205836020020042079480d44200420920171450d38200420930172220420870171209501490d3820032058460d4820202080016a21012058207f460da10120032001490da2012004207f732154205c20586a2d00002104410c2120200241d880046a410c6a20013602004103215a4100210302402004450d002004207a470d4b410121030b209601209701460d010c020b20032001460d4120202091016a21042001207f460d900120032004490d9101205c20016a2c00002101205920043602002001207f4c0d44200120920171450d382001209301722201209401470d38200241c0006a200241d880046a10a601207e290300215e200228024421202002280240207a460d484101215a209601209701470d010b209601207a742201209601207a6a220420042001491b2204ad2088017e22980120890188a70dd501209801a722012079480dd50102400240209601450d002005209601208a016c2001102722050d010c93010b200110262205450d92010b20042196010b2005209701208a016c6a2201205536020c2001201f3602082001205d3602042001205b36020020012086016a205e3702002001208b016a20203602002001208c016a20033a00002001208d016a20543a00002001208e016a205a3a00002001208f016a205736020020012090016a2053360200201e208a016a211e209701207a6a220121970120012006490dae010cea010b20a701221f209a016a21a70120262101410021044100210303402004209b014b0d0420222001460d062001209c01460d6d20222001209a016a2226490d6e202420016a2d00002220209d01712004209b01717420037221032004209e016a2104202621012020209f01710d000b0240200420a101490d0020206720a0016a20a2017120a3014d0d480b024020a801201f470d00201f209a0174220120a70120a7012001491b22a801ad20a40186225e20a50188a70dd401205ea72201209901480dd4010240201f450d002005201f20a601742001102722050d010ca1010b200110262205450da0010b2005201f20a601746a200336020020a7012025490dae010ce8010b200241c0006a200241d880046a10a901200228024020ab01460d2b200241c0006a20ad016a280200215a2002280244215d200241d880046a20ad016a2802002204200241d880046a20ac016a22202802002203460d2c200320ab016a2101200320ae01460d8f0120042001490d9001200241c0006a20ac016a280200215320022802d88004221f20036a2d0000215c20202001360200205c20af014b0d2f02400240024002400240205c0e0400030102000b4100215c41002154410021030340205420284b0d1e20042001460d24200120ae01460d86012004200120ab016a2259490d8701201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4100215c205420b401490d0320586720b3016a20b5017120a9014f0d030c620b41002154410021030340205420284b0d1220042001460d21200120ae01460d89012004200120ab016a2259490d8a01201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4102215c205420b401490d0220586720b3016a20b5017120a9014f0d020c550b41002154410021030340205420284b0d1120042001460d21200120ae01460d7e2004200120ab016a2259490d7f201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4103215c205420b401490d0120586720b3016a20b5017120a9014f0d010c540b41002154410021030340205420284b0d1020042001460d1e200120ae01460d7b2004200120ab016a2259490d7c201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4101215c205420b401490d0020586720b3016a20b5017120a901490d530b200241c880046a20ad016a20033602002002205c3602cc8004200220533602c8800420022902cc8004215e024020b90120ba01470d0020b90120ab0174220120b90120ab016a220420042001491b2204ad20b6017e22980120b70188a70dd301209801a7220120aa01480dd3010240024020b901450d00200520b90120b8016c2001102722050d010c94010b200110262205450d93010b200421b9010b200520ba0120b8016c6a2201205e37020c200120533602082001205a3602042001205d360200202720b8016a212720ba0120ab016a220121ba0120012029490dae010ce6010b2007202e460d34202e20be016a2101202e20bf01460d910120072001490d9201202c202e6a2d0000225820c001470d3820d40120be016a2159202e20c1016a211f4100215841002104410021200340201f212e200420c2014b0d0c20072001460d0d200120bf01460d732007200120be016a2203490d74202c20016a2d0000225420c30171200420c20171742020722120202e20be016a211f200420c4016a210420032101205420c501710d000b0240200420c701490d0020546720c6016a20c8017120bd01490d510b41002104024002402020450d0020bc0120036a2153202c20036a215b4101215a41002154410021014100215d0340205320016a450d30202e450da2012007202e490da301205b20016a2c0000225820bb01480d324106215c205820cb0171450d33205820cc0172225820c8017120cd014d0d33200120be016a211f02402001205d470d002054201f201f2054491b225d20bb01480dd50102402001450d00205a2001205d1027225a0d010ca3010b205d1026225a450da2010b205a20016a205820bf01733a0000205420d1016a2154202e20be016a212e201f2101201f2020490d000b2003201f6a21030c010b4101215a4100211f4100215d0b205a20c9017620c901742253205a20ca017620c8017120ca0174225b72205a20c80171225a72215441002101034041002158200420c2014b0d2820072003460d2a200320bf01460d87012007200320be016a222e490d8801202c20036a2d0000222020c30171200420c20171742001722101200420c4016a2104202e2103202020c501710d000b0240200420c701490d0020206720c6016a20c8017120bd01490d620b024002400240200120be01460d0020010d654104210420d30120d401460d010c020b2007202e460d65202e20bf01460da9012007202e20be016a2201490daa01202c202e6a2c0000225820bb01480d664106215c205820cb0171450d2a205820cc0172225820c8017120cd014d0d2a205820bf017321042001212e20d30120d401470d010b20d30120be0174220120d30120be016a220320032001491b2203ad20cf0186225e20d00188a70dd201205ea7220120bb01480dd2010240024020d301450d00200520d30120bd01742001102722050d010ca4010b200110262205450da3010b200321d3010b200520d40120bd01746a220120d50120ce0171200420c8017120ca01747220c0017222d50136020c2001201f3602082001205d3602042001205b205a7220537236020020d20120c9016a21d201205921d4012059202d490dae010ce4010b20fd01225d20da016a21fd0141002101410021030340200120db014b0d0920182019460d0a201920dc01460d702018201920da016a2204490d71203420196a2d0000221f20dd0171200120db0171742003722103200120de016a210120042119201f20df01710d000b0240200120e101490d00201f6720e0016a20e2017120d901490d4f0b41002158200241c0006a410020e3011093041a024002402003450d004100215c4101215a41002154410021590340201820046b200320596b220120e301200120e301491b2201490d21200420016a22192004490d7e20182019490d7f200241c0006a203420046a20011094041a0240024002400240205c20546b20014f0d00205420016a221f2054490dd701205c20da01742204201f201f2004491b220420d801480dd701205c450d01205a205c20041027225a0d020c8e010b200120546a211f0c020b20041026225a450d8c010b2004215c0b205a20546a200241c0006a20011094041a20192104201f21542003200120596a22594b0d000c020b0b4101215a200421194100215c4100211f0b20e501201f36020020e70141003602002002205a3602282002201fad20e80186205cad8437022c41002101410021590340200120db014b0d24201f2058460d25205820dc01460d8901201f205820da016a2203490d8a01205a20586a2d0000210420e7012003360200200420dd0171200120db0171742059722159200120de016a210120032158200420df01710d000b0240200120e101490d0020046720e0016a20e2017120d901490d5e0b4100215b024002402059450d004100215c410421554100215a0340205a225320da016a215a410021014100211f02400240024002400340200120db014b0d01200241286a20ea016a280200225420e7012802002204460d02200420da016a2103200420dc01460d7b20542003490d7c2002280228225820046a2d0000211220e7012003360200201220dd0171200120db017174201f72211f200120de016a2101201220df01710d000b02400240200120e101490d0020126720e0016a20e2017120f0014d0d010b0240024020542003470d00200220da013a00c8800420ee0120da01360200200220f501360224200241c0006a20e4016a200241206a360200200220f601370244200220f7013602402002200241c880046a360220200241d880046a200241c0006a10a201200241d880046a20ea016a28020021fe0120022802dc800421ff0120022802d880042180024105211f0c010b200420e9016a2101200320dc01460daa0120542001490dab01205820036a2c0000210420e701200136020002400240200420d801480d00200420f801710d014106211f0c020b4118211f0c010b0240200420f90172220120e2017120fa014d0d00201f20fb01712103201f20ea01762104200120dc01732101410021540c060b4106211f200121040b20800220ea0176218102410121544100210320ff0121820220fe0121830220800221010c040b203b2101203a218202410d211f0c020b410f211f203b2101203a2182020c010b200220da013a00c8800420ee0120da01360200200220f501360224200241c0006a20e4016a200241206a360200200220f601370244200220f7013602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e20e80188a7218202200241d880046a20ea016a2802002113205ea721014105211f0b200120ea017621810241012154410021042013218302410021032001213b208202213a0b2003200420e2017120ea017472201f20e2017172211220540d3b0240205c2053470d00205c20da01742204205c20da016a220320032004491b2204ad20f40186225e20e80188a70dd401205ea7220320d801480dd40102400240205c450d002055205c20f001742003102722550d010ca9010b200310262255450da8010b2004215c0b2055205320f001746a220420013a000420042012360200205a2059490d000c020b0b410421554100215c4100215a0b4101211f4108215641002101410021034100218402034020012104200241c0006a200241286a10aa01200228024020da01460d3a200241d880046a20e9016a220120d70120e9016a2d00003a0000200220d7012f00003b01d88004200241c0006a20e6016a2802002159200241c0006a20e4016a280200215820ee0128020021530240024020eb012d0000225420ec01470d00201f20dc016a211f0c010b205420f3016a20e9014b0d00201f20da016a2257201f4f2185022057211f208502450d540b200241c0006a20e9016a225720012d00003a0000200220022f01d880043b014002402003208402470d00200320da016a22012003490dd201205b20012001205b491b228402ad20ef0186225e20e80188a70dd201205ea7220120d801480dd20102402003450d00205620042001102722560d010ca7010b200110262256450da6010b205620046a220120543a0000200120e6016a2053360200200120ea016a2058360200200120d9016a2059360200200120f0016a20572d00003a0000200120da016a20022f01403b0000205b20e9016a215b200420e4016a2101200320da016a2103201f0d000b20e70128020020e5012802004621010240200228022c450d00200228022810230b2001450d64024020fc01205d470d0020fc0120da0174220120fc0120da016a220420042001491b2204ad20f1017e225e20e80188a70dd101205ea7220120d801480dd1010240024020fc01450d00200520fc0120f2016c2001102722050d010ca8010b200110262205450da7010b200421fc010b2005205d20f2016c6a2201205636020c2001205a3602082001205c36020420012055360200200120ed016a2003360200200120e4016a20840236020020fd012035490dae010cb9010b410f210120a8010de1010cf4010b410f211d20580d480c490b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802e08004210320022802dc8004212020022802d8800421044105210120a801450df2010cdf010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a2012002290328225e422088a72138200241306a280200210e205ea721394105211d0c440b02402090022088026a2802002204450d0020900228020421012004208b027421040340024020012d0000208d02470d0020012089026a280200208e0271450d002001208b026a28020010230b2001208c026a21012004208f026a22040d000b0b02402090022089026a280200450d00209002208b026a28020010230b2090022086026a21010240209002208a026a280200450d0020900228021010230b20012190022001208702470daa010c460b410f211720530d540c550b02402099022802082204450d00209902280200210120042092027421040340024020012d0000209502470d0020012096026a28020020970271450d0020012092026a28020010230b20012094026a210120042098026a22040d000b0b2099022094026a210102402099022092026a280200450d0020990228020010230b20012199022001209302470da9010cda010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a72136200241e080046a280200210b205ea721374105211720530d520c530b410f2112205d0d5e0c5f0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a7213a200241e080046a2802002113205ea7213b41052112205d0d5d0c5e0b410f215c0cc8010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a20120022903d880042208422088a72120200241e080046a28020021012008a721074105215c0cc7010b410f21014100215c0cc7010b024020a502209e026a2802002204450d0020a5022802042101200420a0027421040340024020012d000020a202470d002001209f026a28020020a30271450d00200120a0026a28020010230b200120a1026a2101200420a4026a22040d000b0b024020a502209f026a280200450d0020a50220a0026a28020010230b20a502209c026a2101024020a502209a026a280200450d0020a50228021010230b200121a5022001209d02470da3010b200d209b02882108410521014100210c201a450deb01200510230ceb010b024020b10220aa026a2802002204450d0020b1022802042101200420ac027421040340024020012d000020ae02470d00200120ab026a28020020af0271450d00200120ac026a28020010230b200120ad026a2101200420b0026a22040d000b0b024020b10220ab026a280200450d0020b10220ac026a28020010230b20b10220a8026a2101024020b10220a6026a280200450d0020b10228021010230b200121b102200120a902470da2010b200a20a70288210841052101410021092014450ded01200510230ced010b024020bd0220b6026a280200450d0020bd0228020010230b024020bd0220b2026a2802002204450d0020bd0228020c2101200420b6027421040340024020012d000020b902470d00200120ba026a28020020bb0271450d00200120b6026a28020010230b200120b7026a2101200420bc026a22040d000b0b20bd0220b4026a2101024020bd0220b7026a280200450d0020bd0220b8026a28020010230b200121bd02200120b502470da1010b200820b30288210a410521124100210120fc01450dd901200510230cd9010b410f21200cc6010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c210820022802282107410521204100215a0cc6010b024020052802082204450d0020052802002101200420c0027421040340024020012d000020c102470d00200120c2026a28020020c30271450d00200120c0026a28020010230b200120bf026a2101200420c4026a22040d000b0b200520bf026a21010240200520c0026a280200450d00200528020010230b2001210520be022001470d9e010cc3010b410f211720550d410c420b410f21010cbc010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a72136200241e080046a280200210b205ea72137410521170c1c0b024020cf0220c7026a2802002204450d0020cf022802042101200420ca027421040340024020012d000020cc02470d00200120c8026a28020020cd0271450d00200120ca026a28020010230b200120cb026a2101200420ce026a22040d000b0b024020cf0220c8026a280200450d0020cf0220ca026a28020010230b20cf0220c5026a2101024020cf0220c9026a280200450d0020cf0228021010230b200121cf02200120c602470d9b010c410b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c100b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c0f0b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c0e0b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a201200229022c210820022802282107410521010cb6010b200241013a00c78004200241ec80046a410136020020024107360224200241e880046a200241206a360200200242013702dc80042002419cf6c4003602d880042002200241c780046a360220200241c880046a200241d880046a10a20120022903c88004225e422088a7213a200241d080046a2802002113205ea7213b41052112205c450d46205a1023205d0d480c490b200241d0006a2802002103205d2107205b21012097010dbf010cc0010b200241d0006a2802002103205321072057211f20552101205d0dbc010cbd010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c210820022802282107410521204100215a410021030cba010b41092120410021030cb9010b410f2112200228022c0d3a0c3b0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a7218202200241e080046a280200218302205ea7213b410521120c300b024020da0220d2026a280200450d0020da0228020010230b024020da0220d3026a2802002204450d0020da0228020c2101200420d2027421040340024020012d000020d602470d00200120d7026a28020020d80271450d00200120d2026a28020010230b200120d4026a2101200420d9026a22040d000b0b20da0220d0026a2101024020da0220d4026a280200450d0020da0220d5026a28020010230b200121da02200120d102470d90010c420b410f215c0b205d0daf010cb0010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c205d450daf010cae010b2002200241cc006a2902003703c88004200241c8006a28020021072002280244210120022802c88004212820022802cc8004210320ba010dab010cac010b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010b200229022c210820022802282107410521014100215c0ca8010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e080046a280200210120022802dc8004212020022802d8800421074105215c205d0d030ca6010b410a21010ca6010b4118215c0b205d450da3010b205a10230ca2010b41062120410021030caa010b410721030c0c0b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c0ca4010b200241013a00c78004200241ec80046a410136020020024107360224200241e880046a200241206a360200200242013702dc80042002419cf6c4003602d880042002200241c780046a360220200241c880046a200241d880046a10a201200241d080046a280200210b20022802cc8004213620022802c88004213741052117205a0d010b2055450d230c220b205b102320550d210c220b4117215c0ca0010b20810220ea0174200120e2017172213b205c0d1d0c1c0b200241d0006a280200218302200241cc006a280200218202200241c8006a280200213b200228024421122003450d1a0c190b200241c0006a41086a200241d0006a2802003602002020418080807871215a20204180807c712103202041087621040c97010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200241306a28020021042002290328215e410521030c040b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a20141052120200229022c210820022802282107410021030c9f010b41182120410021030c9e010b411821030b0b200141ff017141087420037221200c90010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c21082002280228210741052120410021030c9a010b200241d0006a28020021040c8e010b4100215a0c98010b410d210120a8010d9d010cb0010b410d211d20580d040c050b2002280244221d410876210c200241d0006a280200210e200241cc006a2802002138200241c0006a41086a280200213920580d030c040b2002280244211d200241c0006a41106a280200210e200241cc006a2802002138200241c0006a41086a28020021390240205c450d00205c4104742104205a21010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b201d410876210c205d0d010b2058450d020c010b205a10232058450d010b411c21860220052058411c6c6a218702410c21880241082189024114218a024104218b024110218c024109218d0241ffffffff03218e024170218f022005219002410721200c760b201a450dad01200510230cad010b410d211720530d0d0c0e0b200228024422174108762109200241d0006a280200210b200241cc006a2802002136200241c0006a41086a280200213720530d0c0c0d0b410d2112205d0d180c190b410d215c0c83010b410d21014100215c0c83010b410d21200c88010b024020544109470d00205841ffffffff0371450d00205910230b411521820241a4c5c200213b410421122003450d010b205621010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b0240208402450d00205610230b205c0d010b200228022c450d090c080b20551023200228022c0d070c080b410d21172055450d010b20554104742104205721010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b4100210902402056450d00205710230b2053450d010b411c21c50220052053411c6c6a21c602410c21c702410821c802411421c902410421ca02411021cb02410921cc0241ffffffff0321cd02417021ce02200521cf02410d21200c700b2014450da101200510230ca1010b410d21010c770b410d2112200228022c450d010b200228022810230b208202213a20830221130c050b410d215c205d0d760c770b4104215c41eb93c300210741242120205d0d750c760b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c205d0d740c750b4118215c205d0d730c740b200220f00120e90120011b3a00c88004200241d4006a410136020020024107360224200241c0006a41106a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a201200241d880046a41086a280200211320022802dc8004213a20022802d88004213b02402003450d00200441106a21034100210103400240205620016a22042d00004109470d00200441086a28020041ffffffff0371450d00200441046a28020010230b2003200141106a2201470d000b0b0240208402450d00205610230b41052112205c0d010b205d450d020c010b20551023205d450d010b411821d0022005205d41186c6a21d102410421d202411421d302411021d402410c21d502410921d602410821d70241ffffffff0321d802417021d902200521da02410e21200c650b20fc01450d8201200510230c82010b417f200141016a1048000b200141016a2022108c01000b417f20031048000b20032054108c01000b417f20031048000b20032054108c01000b417f201941016a1048000b201941016a2018108c01000b417f200141016a1048000b200141016a2007108c01000b417f20031048000b20032054108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2004108c01000b417f200141016a1048000b200141016a2004108c01000b200420191048000b20192018108c01000b417f20011048000b20012054108c01000b417f200141016a1048000b200141016a2004108c01000b417f20011048000b20012003108c01000b417f200141016a1048000b200141016a2004108c01000b417f200341016a1048000b200341016a2007108c01000b20044101102a000b417f205841016a1048000b205841016a201f108c01000b417f20041048000b20042003108c01000b20014104102a000b417f20011048000b20012004108c01000b20014104102a000b417f20011048000b20012007108c01000b2001205d1048000b205d2054108c01000b20014101102a000b20014104102a000b20014104102a000b20014104102a000b417f20581048000b20582003108c01000b417f20011048000b20012003108c01000b20014104102a000b205d4101102a000b417f202e1048000b202e2007108c01000b20014104102a000b417f20011048000b20012054108c01000b20034104102a000b20014108102a000b20014104102a000b417f202e41016a1048000b202e41016a2007108c01000b410021200c110b410121200c110b410221200c110b410321200c110b410421200c110b410521200c110b410621200c110b410721200c120b410821200c120b410921200c130b410a21200c140b410b21200c150b410c21200c150b410d21200c160b410e21200c170b410021010c170b410121010c160b410221010c150b410321010c140b410321010c130b410321010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b410321010c0a0b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b410321010c010b410321010c000b0b101e000b200241c0006a41086a20043602002020418080807871215a20204180807c712103202041087621040b2002205e37034020022902442108205ea721070c090b20014110762104200141087621030c040b205c4108742001722101200220083703c880042008a721280240205a450d00205d10230b20022802cc8004210320ba01450d010b2005210403400240200441046a280200450d00200428020010230b200441146a21042027416c6a22270d000b0b20b901450d1c200510230c1c0b205410230b200341ff0171410874200141ff017172210320044110742104205841ff01714108742119024020d401450d002005210103400240200141046a280200450d00200128020010230b200141106a210120d20141706a22d2010d000b0b200320047221032019205c72210120d301450d18200510230c180b202f450d1320d60110230c130b0b41002103410021040b202041ff0171200441ff0171410874722003418080fc077172205a7221012008422088a721032008a7211f02402053450d00205510230b205d450d010b205b10230b209701450d010b2005210403400240200441046a280200450d00200428020010230b0240200441106a280200450d002004410c6a28020010230b200441286a2104201e41586a221e0d000b0b209601450d16200510230c160b20102091028821084105210f41002101202f450d0c200510230c0c0b200510230c120b202e202a4621010240202b450d00202c10230b02402001450d002059ad42208620d301ad84210a410221040c040b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d88004210820022802e08004210302402059450d00205941047421042005210103400240200141046a280200450d00200128020010230b200141106a2101200441706a22040d000b0b2008422088210a410521014100210420d301450d0e200510230c0e0b200241e480046a28020020022802e88004462104024020022802dc8004450d0020022802d8800410230b02402004450d002001ad42208620b901ad84210a410821040c030b20024103410220041b3a00c88004200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201200229032821082002280230210302402001450d00200141146c21042005210103400240200141046a280200450d00200128020010230b200141146a21012004416c6a22040d000b0b2008422088210a410521014100210420b901450d0f200510230c0f0b2026202146210102402023450d00202410230b02402001450d0020a701ad42208620a801ad84210a410421040c020b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088210a20022802e080042103410521014100210420a801450d10200510230c100b200241e480046a28020020022802e88004462104024020022802dc8004450d0020022802d8800410230b2004450d012001ad422086209601ad84210a410321040b200020043a000420004100360200200041056a20022f001d3b0000200041186a2008370200200041146a20013602002000410c6a200a370200200041086a2005360200200041206a200229020c370200200041076a2002411f6a2d00003a0000200041286a2002410c6a41086a290200370200200241f080046a24000f0b20024103410220041b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201200229032821082002280230210302402001450d00200141286c21042005210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200441586a22040d000b0b2008422088210a4105210141002104209601450d0f200510230c0f0b2022ad4220862025ad8421082018450d00200610230b20004101360200200041106a2004360200200041086a200837020020002001410874200741ff017172360204200241f080046a24000f0b20124108762101203aad220a422086203bad8421082033450d00203410230b20004101360200200041106a2013360200200041086a200a422086200842ffffffff0f838437020020002001410874201241ff017172360204200241f080046a24000f0b200f41087621012030ad22084220862031ad84211020022802dc8004450d0020022802d8800410230b20004101360200200041106a2011360200200041086a2008422086201042ffffffff0f838437020020002001410874200f41ff017172360204200241f080046a24000f0b200441ffffff07712204410874201841ff01717221012022ad220a4220862006ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200141087621042020ad220a4220862007ad842108202b450d00202c10230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200141087621042028ad220a4220862007ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b2020ad220a4220862004ad842108410021042023450d00202410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b20014108762104201fad220a4220862007ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200c410874201d41ff01717221012038ad22084220862039ad84210d20022802dc8004450d0020022802d8800410230b20004101360200200041106a200e360200200041086a2008422086200d42ffffffff0f83843702002000200c410874200141ff017172360204200241f080046a24000f0b200441ffffff07712203410874200741ff01717221042018ad220a4220862022ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2001360200200041086a200a422086200842ffffffff0f838437020020002003410874200441ff017172360204200241f080046a24000f0b2009410874201741ff01717221012036ad22084220862037ad84210a200228022c450d00200228022810230b20004101360200200041106a200b360200200041086a2008422086200a42ffffffff0f838437020020002009410874200141ff017172360204200241f080046a24000f0b200241f080046a24000b6b000240024020002d000022004101460d0020004102470d0120012802184190f6c400410b2001411c6a28020028020c1102000f0b20012802184183f6c400410d2001411c6a28020028020c1102000f0b200128021841f7f5c400410c2001411c6a28020028020c1102000b800301067f230041306b22022400200128020021030240024002400240024002400240200128020422044103742205450d00200341046a2106410021070340200628020020076a2107200641086a2106200541786a22050d000b200141146a280200450d010c020b41002107200141146a2802000d010b200721060c010b2004450d02024002402007410f4b0d002003280204450d010b200720076a220620074f0d010b4101210541002106200241086a21070c010b2006417f4c0d02200241086a210702402006450d002006102622050d0120064101102a000b41012105410021060b200241003602102002200636020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a290200370300200220012902003703180240200241146a41c482c500200241186a10e2030d0020002007290200370200200041086a200741086a280200360200200241306a24000f0b10fb03000b41b482c500410041001029000b101d000b960301087f230041c0006b2202240041002103200141086a2104200141046a210541002106024002400240024002400340200341204f0d012005280200220720042802002208460d02200841016a21092008417f460d0420072009490d05200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b20034120490d0220086741686a41ff017141034b0d02200041013602002000410d3a0004200241c0006a24000f0b200041013602002000410f3a0004200241c0006a24000f0b200241013a000f200241346a41013602002002410736023c200242013702242002419cf6c40036022020022002410f6a3602382002200241386a360230200241106a200241206a10a2012002412b6a200241186a28020036000020022002290310370023200041053a000420004101360200200020022900203700052000410c6a200241276a290000370000200241c0006a24000f0b2000410036020020002006360204200241c0006a24000f0b417f20091048000b20092007108c01000ba005010c7f230041c080016b22022400200241086a200110a30141012103024020022802084101470d002000200229020c370204200041013602002000410c6a200241086a410c6a290200370200200241c080016a24000f0b200228020c2104200241086a4100418080011093041a41002105410021060240024002400240024002402004450d00200141086a2107200141046a21084100210941002105410121034100210a03402008280200220b200728020022066b2004200a6b220c41808001200c41808001491b220c490d022006200c6a220d2006490d03200b200d490d04200241086a200128020020066a200c1094041a2007200d3602000240024002400240200520096b200c4f0d002009200c6a22062009490d092005410174220d20062006200d491b220d4100480d092005450d0120032005200d102722030d020c0a0b200c20096a21060c020b200d10262203450d080b200d21050b200320096a200241086a200c1094041a200621092004200c200a6a220a4b0d000b0b2000200336020420004100360200200041146a2006360200200041106a41003602002000410c6a2006360200200041086a2005360200200241c080016a24000f0b200241013a008f8001200241b480016a4101360200200241073602bc8001200242013702a480012002419cf6c4003602a0800120022002418f80016a3602b880012002200241b880016a3602b080012002419080016a200241a080016a10a201200241ab80016a2002419880016a2802003600002002200229039080013700a38001200041053a000420004101360200200020022900a080013700052000410c6a200241a780016a29000037000002402005450d00200310230b200241c080016a24000f0b2006200d1048000b200d200b108c01000b101e000b200d4101102a000bbd0602057f027e0240024002402002450d00200241796a4100200241074b1b2103410021040340024002400240024002400240024002400240024002400240024002400240200120046a22052d000022064118744118752207417f4c0d002005410371450d01200441016a22042002490d0f0c100b42808080801021082006419684c5006a2d000022054104460d0120054103460d0220054102470d08200441016a220620024f0d094280808080802021094280808080102108200120066a2d000041c00171418001460d0d0c110b0240200420034f0d000340200120046a220641046a280200200628020072418081828478710d01200441086a22042003490d000b0b0240200420024f0d000340200120046a2c00004100480d01200441016a22042002490d000b0b20042002490d0d0c0e0b42002109200441016a220520024f0d08200120056a2d00002105200641f001460d01200641f401470d022005411874411875417f4a0d06200541ff0171418f014d0d030c060b42002109200441016a220520024f0d07200120056a2d00002105200641e001460d03200641ed01470d042005411874411875417f4a0d05200541ff017141a001490d090c050b200541f0006a41ff01714130490d010c040b200541ff017141bf014b0d032007410f6a41ff017141024b0d03200541187441187541004e0d030b200441026a220620024f0d04200120066a2d000041c00171418001470d0a42002108200441036a220620024f0d0b200120066a2d000041c00171418001460d070c050b200541e0017141a001470d010c050b02402007411f6a41ff0171410c4f0d002005411874411875417f4a0d01200541ff017141bf014d0d050c010b200541ff017141bf014b0d00200741fe017141ee01470d0020054118744118754100480d040b4280808080802021090c080b420021090b420021080c060b428080808080e000210942808080801021080c050b42002108200441026a220620024f0d04200120066a2d000041c00171418001470d030b200641016a22042002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210942808080801021080b200020092008842004ad84370204200041013602000be607010a7f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204470d00200241013a000f2002413c6a4101360200200241073602242002420137022c2002419cf6c40036022820022002410f6a3602202002200241206a360238200241106a200241286a10a201200241326a200241186a2802003601002002200229031037012a20022002412e6a29010037010620022002290128370300410521050c010b200441016a21062004417f460d0b20032006490d0c2001280200220720046a2d00002108410c21052001410c6a2006360200410021064100210902402008450d004101210920084101470d010b410120036b210a200441026a21042001410c6a210b4100210503402006411f4b0d02200a20046a4102460d032004450d0a20032004490d0b200720046a417f6a2d00002108200b2004360200200841ff00712006411f71742005722105200441016a2104200641076a21062008418001710d000b024020064120490d00410d210620086741686a41ff017141034d0d040b2009450d042004417f6a2104410021062001410c6a210b4100210a03402006411f4b0d0720032004460d082004417f460d0e2003200441016a2201490d0f200720046a2d00002108200b2001360200200841ff00712006411f7174200a72210a200641076a2106200121042008418001710d000b024020064120490d00410d210420086741686a41ff017141034d0d090b410121040c050b200020083a0005200020053a000420002002290300370106200041013602002000410c6a2002290106370100200241c0006a24000f0b410f21060c010b200241013a00102002413c6a4101360200200241073602242002420137022c2002419cf6c4003602282002200241106a3602202002200241206a3602382002200241286a10a201410521060b2000200636020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b410021040b20002005360204200041003602002000410c6a200a360200200041086a2004360200200241c0006a24000f0b410f21040c010b200241013a00102002413c6a4101360200200241073602242002420137022c2002419cf6c4003602282002200241106a3602202002200241206a3602382002200241286a10a201410521040b2000200436020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b417f20041048000b20042003108c01000b417f20061048000b20062003108c01000b417f200441016a1048000b200441016a2003108c01000bd503020a7f017e230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a200110aa0120022802184101460d01200220032900003703082002200429000037000f200241186a41086a2d0000210a2002200229000f37001f20022002290308370318024020072008470d00200741016a220b2007490d032005200b200b2005491b2208ad420486220c422088a70d03200ca7220b4100480d0302402007450d0020092006200b102722090d010c050b200b10262209450d040b200920066a220b200a3a0000200b41086a200229001f370000200b41016a2002290318370000200541026a2105200641106a2106200741016a2107200a41ff01714106470d000b20002009360204200041003602002000410c6a2007360200200041086a2008360200200241306a24000f0b2000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a28020010230b200741106a2107200641706a22060d000b0b02402008450d00200910230b200241306a24000f0b101e000b200b4108102a000bbf07030d7f017e017f230041c0006b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0920072009490d0a200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d032001410c6a2107200141086a210a4100210b4104210c4100210d0340200d220e41016a210d410021034100210403402003411f4b0d07200a280200220520072802002208460d08200841016a21092008417f460d0c20052009490d0d200128020020086a2d0000210820072009360200200841ff00712003411f71742004722104200341076a21032008418001710d000b024020034120490d0020086741686a41ff01714104490d090b0240200b200e470d00200b4101742203200b41016a220820082003491b2203ad420286220f422088a70d0e200fa722084100480d0e02400240200b450d00200c200b41027420081027220c0d010c110b20081026220c450d100b2003210b0b20044108762110200c200e4102746a2004360200200d2006490d000c050b0b410f21030c010b200241013a000f2002413c6a4101360200200241073602142002420137022c2002419cf6c40036022820022002410f6a3602102002200241106a360238200241186a200241286a10a201410521030b200241086a2208200241186a41086a280200360200200220022902183703002000200336020420004101360200200041086a2002290300370200200041106a20082802003602000c0c0b4104210c4100210b4100210d0b2000200c360204200041003602002000410c6a200d360200200041086a200b360200200241c0006a24000f0b410f21030c080b200241013a00002002413c6a4101360200200241073602142002420137022c2002419cf6c400360228200220023602102002200241106a360238200241186a200241286a10a20120022802202104200228021c21092002280218210841002110410521030c070b410d21030c060b417f20091048000b20092007108c01000b417f20091048000b20092005108c01000b101e000b20084104102a000b20004101360200200041106a20043602002000410c6a2009360200200041086a200836020020002010410874200372360204200b450d00200c1023200241c0006a24000f0b200241c0006a24000bcf07010d7f230041c0086b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d082001280200220a20086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d03200241086a41004180081093041a2001410c6a210b200141086a210c4101210d4100210e41002108410021040340200720096b200620046b22034180082003418008491b2203490d05200920036a22052009490d0920072005490d0a200241086a200a20096a20031094041a200b20053602000240024002400240200e20086b20034f0d00200820036a22052008490d0f200e4101742209200520052009491b22094100480d0f200e450d01200d200e20091027220d0d020c100b200320086a21050c020b20091026220d450d0e0b2009210e0b200d20086a200241086a20031094041a02402006200320046a22044d0d00200b2802002109200c28020021072001280200210a200521080c010b0b200241086a200d200510a50120022802084101470d050240200e450d00200d10230b200041083a000420004101360200200241c0086a24000f0b410f21030c010b200241013a0098082002411c6a41013602002002410736028c082002420137020c2002419cf6c400360208200220024198086a36028808200220024188086a360218200241a8086a200241086a10a201410521030b2000200336020420004101360200200041086a20022902a808370200200041106a200241a8086a41086a2802003602000c090b2000428080808010370200200041086a4200370200200241c0086a24000f0b200241013a009708200241bc086a41013602002002410736028c08200242013702ac082002419cf6c4003602a808200220024197086a36028808200220024188086a3602b80820024198086a200241a8086a10a201200241b3086a200241a0086a28020036000020022002290398083700ab08200041053a000420004101360200200020022900a8083700052000410c6a200241af086a290000370000200e450d07200d1023200241c0086a24000f0b2000200d3602042000410c6a2005360200200041086a200e36020020004100360200200241c0086a24000f0b417f20091048000b20092007108c01000b200920051048000b20052007108c01000b101e000b20094101102a000b200241c0086a24000bcbbe0103087f017e037f230041e0006b22022400024020012802082203200128020c2204470d00200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d000021072001410c6a220820053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070ec001b504b50400840124b504aa01aa01aa01aa01aa01a801a501a701a101200b11aa01aa01aa01aa01aa01aa01aa01aa01a60103aa01aa01aa01aa0112189801511aaa01aa01aa0121520533069f0186016f238f019e01a40132080d8801379b01a20104013841714970548b010209441476783f8101752226778701070c252c1016920194011f96019a01a3015ba0011599015e1b5a0f9c019d011d900174720a0e42452813950119602f91018e01890129173497013a27644b5565624a7d407b2e8a0185012b8c0193011c463e2d8d016e3b1e7c5f487982012a3130363d6d5c6c80017f3583014e4f7e7366617a695d39533c674c436a4d6b5768634756505859b5040b20032005470dae01200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cb0020b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db30220046741686a41ff017141034b0db302410d21010cb2010b200320056b41084f0da801200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a2012002290318210a200041106a2002280220360200200041086a200a37020020004281808080d000370300200241e0006a24000f0b410e21070ca5010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de8012001450da70320032001490da803200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb1010b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb2010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb3010b413d21070ca1010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db00220046741686a41ff017141034b0db002410d21010cb3010b413121070c9f010b41d70021070c9e010b410021014100210903402001411f4b0db20120032005460de9012005417f460da8032003200541016a2207490da903200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dea010b410b21070ca8040b413e21070c9c010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dac0220046741686a41ff017141034b0dac02410d21010cb1010b41d80021070c9a010b41d00021070c99010b41c10021070c98010b410021014100210903402001411f4b0daf0120032005460de7012005417f460da6032003200541016a2204490da703200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b024020014120490d00410d210120076741686a41ff017141034d0de8010b20032004470dbf02200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b410021014100210903402001411f4b0daf0120032005460de8012005417f460da7032003200541016a2207490da803200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de9010b410f21070ca1040b41dc0021070c95010b413321070c94010b41cb0021070c93010b41c20021070c92010b41e50021070c91010b410021014100210903402001411f4b0daa0120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411021070c9b040b41de0021070c8f010b410021014100210903402001411f4b0da90120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411321070c99040b41ce0021070c8d010b41f90021070c8c010b41d30021070c8b010b41800121070c8a010b41c50021070c89010b410a21070c88010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d990220046741686a41ff017141034b0d9902410d21010ca3010b413921070c86010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d980220046741686a41ff017141034b0d9802410d21010ca3010b20032005470d8701200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090c88020b413f21070c83010b413a21070c82010b41e90021070c81010b41db0021070c80010b41e40021070c7f0b41860121070c7e0b41f60021070c7d0b41c00021070c7c0b41fc0021070c7b0b41f30021070c7a0b41e00021070c790b41880121070c780b41870121070c770b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c96010b410120036b2107200441026a2101410021054100210903402005411f4b0d9701200720016a4102460dd3012001450d920320032001490d9303200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c97010b41e60021070c740b41900121070c730b41890121070c720b410120036b2107200441026a2101410021054100210903402005411f4b0d9501200720016a4102460dd1012001450d900320032001490d9103200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c95010b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c96010b419b0121070c6f0b41e80021070c6e0b41ff0021070c6d0b419d0121070c6c0b418a0121070c6b0b41fb0021070c6a0b413621070c690b41f10021070c680b410120036b2107200441026a2101410021054100210903402005411f4b0d8f01200720016a4102460dcb012001450d8a0320032001490d8b03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dff0120046741686a41ff017141034b0dff01410d21010c8f010b41d90021070c660b41a00121070c650b413221070c640b41da0021070c630b41fa0021070c620b41a70121070c610b41830121070c600b20032005470d63200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41ef0021070c5e0b41eb0021070c5d0b419f0121070c5c0b41a20121070c5b0b41920121070c5a0b41930121070c590b41a90121070c580b410021014100210903402001411f4b0d810120032005460dbd012005417f460dfc022003200541016a2207490dfd02200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dbe010b411221070ce2030b410120036b2107200441026a2101410021054100210903402005411f4b0d8101200720016a4102460dbe012001450dfd0220032001490dfe02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490def0120046741686a41ff017141034b0def01410d21010c81010b419c0121070c550b4200210a410021010340410e21072001413f4b0dff0120032005460dbe012005417f460dfd022003200541016a2209490dfe02200620056a2d0000210420082009360200200441ff0071220bad2001413f71ad86200a84210a200141076a210120092105200441187441187522094100480d000b200941c0007121052001413f4b0dee012005450dee01200a427f2001413f71ad8684210a412e21070cde030b41ec0021070c530b41a80121070c520b41a40121070c510b41aa0121070c500b41ab0121070c4f0b41cf0021070c4e0b41c90021070c4d0b418c0121070c4c0b419a0121070c4b0b41cd0021070c4a0b41820121070c490b41df0021070c480b41970121070c470b41ee0021070c460b41a60121070c450b41ea0021070c440b41ed0021070c430b41960121070c420b419e0121070c410b41a50121070c400b41990121070c3f0b41a10121070c3e0b41a30121070c3d0b418d0121070c3c0b418b0121070c3b0b41fe0021070c3a0b410120036b2107200441026a2101410021054100210903402005411f4b0d66200720016a4102460da4012001450de40220032001490de502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dd40120046741686a41ff017141034b0dd401410d21010c660b41002101410021090340410d210b2001411f4b0dc00320032005460da5012005417f460de5022003200541016a2204490de602200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a210120042105200741187441187522044100480d000b200441c0007121052001411f4b0dd4012005450dd4012009417f2001411f7174722109412d21070cc3030b20032005470d3c200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41d60021070c360b41950121070c350b41d50021070c340b413821070c330b413421070c320b413b21070c310b413521070c300b41840121070c2f0b41980121070c2e0b41f20021070c2d0b41810121070c2c0b41f00021070c2b0b41940121070c2a0b418f0121070c290b418e0121070c280b413721070c270b41850121070c260b41910121070c250b20032005470d2b200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cae010b41f50021070c230b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbf0120046741686a41ff017141034b0dbf01410d21010c510b413c21070c210b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbe0120046741686a41ff017141034b0dbe01410d21010c510b41e30021070c1f0b41f40021070c1e0b200320056b41044f0d25200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120004281808080d000370300200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b41f70021070c1c0b41fd0021070c1b0b41e20021070c1a0b410120036b2107200441026a2101410021054100210903402005411f4b0d4c200720016a4102460d8b012001450dcc0220032001490dcd02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db80120046741686a41ff017141034b0db801410d21010c4c0b41d40021070c180b41e10021070c170b41c30021070c160b41f80021070c150b41c40021070c140b41dd0021070c130b41c60021070c120b41e70021070c110b410021014100210903402001411f4b0d4520032005460d84012005417f460dc5022003200541016a2207490dc602200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d85010b411121070c9b030b41cc0021070c0f0b41c70021070c0e0b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dad0120046741686a41ff017141034b0dad01410d21010c430b41d10021070c0c0b41d20021070c0b0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c420b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c430b41ca0021070c080b200241c8006a200110a80141042109200228024822064101470d10200041013602002000200241c8006a41047222012902003702042000410c6a200141086a290200370200200241e0006a24000f0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da90120046741686a41ff017141034b0da901410d21010c420b41c80021070c050b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da80120046741686a41ff017141034b0da801410d21010c420b410021014100210903402001411f4b0d4320032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410721070c8e030b410d21070c020b410021014100210903402001411f4b0d4220032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410821070c8c030b410621070b0c89030b2000410b3a000420004101360200200041056a20073a0000200241e0006a24000f0b200441096a2101200541784f0df00220032001490df102200620056a290000210a20082001360200413021070c87030b200441026a21092005417f460df10220032009490df202200620056a2c00002101200820093602004100210b20014100480d7f200141017441807f71200172220141ff0171220541847e6a220941034b0da101024020090e0400f301f101f201000b4103210b410421070c88030b200441026a21012005417f460df20220032001490df302200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21012005417f460df30220032001490df402200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21092005417f460df40220032009490df502200620056a2c00002101200820093602004100210b20014100480d8001200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f301f101f201000b4103210b410221070c85030b200441026a21092005417f460df50220032009490df602200620056a2c00002101200820093602004100210b20014100480d8101200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f501f301f401000b4103210b410321070c84030b200441056a21012005417c4f0df60220032001490df702200620056a280000210920082001360200412f21070c82030b200241d0006a280200210b200228024c2103200241d4006a2802002205450d81012005410274220c4102752207ad420286220a422088a70de802200aa722044100480de802200410262209450df70220054102742104200c417c6a210c410021050340200920056a200320056a2802003602002004200541046a2205470d000b200c41027641016a210d200b450dff020cfe020b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010c370b410f21010b0c370b410f21010c380b410f21010c390b410f21010c3a0b410f21010c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010c3c0b410f21010b0c3c0b410f21010b0c3d0b410f21010b0c3e0b410f21010b0c3e0b410f21010b0c3e0b410f21010c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010c400b410f21010c410b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241186a200241c8006a10a201200228022021012002290318210a410521070c410b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a2014105210b0c9a020b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b411821090b2002200229011e37010e200220022903183703080c81020b412c21074100210b0c86020b412b21074100210b0c85020b411821090b2002200229011e37010e200220022903183703080cfc010b411821090b2002200229011e37010e200220022903183703080cf9010b410021074100210d200b0dfc010cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3a2001417f460db8012003200141016a2207490db901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3b0b200bad210a412821070cfe010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3b2001417f460db9012003200141016a2207490dba01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3c0b200bad210a412721070cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3c2001417f460dba012003200141016a2207490dbb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3d0b200bad210a411621070cfc010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3d2001417f460dbb012003200141016a2207490dbc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3e0b200bad210a411821070cfb010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3e2001417f460dbc012003200141016a2207490dbd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3f0b200bad210a412121070cfa010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3f2001417f460dbd012003200141016a2207490dbe01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d400b200bad210a412221070cf9010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d402001417f460dbe012003200141016a2207490dbf01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d410b200bad210a411421070cf8010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d412001417f460dbf012003200141016a2207490dc001200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d420b200bad210a411c21070cf7010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d422001417f460dc0012003200141016a2207490dc101200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b41202107024020054120490d00410d210120046741686a41ff01714104490d430b200bad210a0cf6010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d432001417f460dc1012003200141016a2207490dc201200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d440b200bad210a411721070cf5010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d442001417f460dc2012003200141016a2207490dc301200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d450b200bad210a412421070cf4010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d452001417f460dc3012003200141016a2207490dc401200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d460b200bad210a412921070cf3010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d462001417f460dc4012003200141016a2207490dc501200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d470b200bad210a412a21070cf2010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411521070cf1010b200141c000490d0e2005450d0e200b41ff00470d0f0c110b2001417f6a2101410021054100210b03402005411f4b0d2220032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411b21070cef010b20014120490d102005450d102004417f7341ff00716741686a41ff01714105490dea010c110b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411a21070ced010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d482001417f460dc6012003200141016a2207490dc701200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d490b200bad210a412321070cec010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d492001417f460dc7012003200141016a2207490dc801200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4a0b200bad210a411d21070ceb010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4a2001417f460dc8012003200141016a2207490dc901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4b0b200bad210a412521070cea010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4b2001417f460dc9012003200141016a2207490dca01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4c0b200bad210a411e21070ce9010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4c2001417f460dca012003200141016a2207490dcb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4d0b200bad210a411921070ce8010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4d2001417f460dcb012003200141016a2207490dcc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4e0b200bad210a412621070ce7010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4e2001417f460dcc012003200141016a2207490dcd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4f0b200bad210a411f21070ce6010b41062109200541c001470de0014104210b410421070ce6010b41062109200541c001470dde014104210b410221070ce5010b41062109200541c001470ddc014104210b410321070ce4010b200441016a21012004417f460dd90120032001490dda01200620046a2d00002105200820013602002005450d54200041163a000420004101360200200041056a20053a0000200241e0006a24000f0b200141c000490d022009450d020b0b200020022f00083b0005200020073a000420004101360200200041106a2001360200200041086a200a370200200041076a2002410a6a2d00003a0000200241e0006a24000f0b412e21070cdd010b200441ff01716741686a41ff017141044b0d0020014120490d002005450dd9010b412d21070cdc010b410f21010c170b410f21010c180b410f21010c190b410f21010c1a0b410f21010c1b0b410f21010c1c0b410f21010c1d0b410f21010c1e0b410f21010c1f0b410f21010c200b410f21010c210b410f21010c220b410f21010c230b410f21010c240b410f21010c250b410f21010c260b410f21010c270b410f21010c280b410f21010c290b410f21010c2a0b410f21010c2b0b410f21010c2c0b410f21010c2d0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b4101210b0b410421070c96010b4102210b410421070c95010b4101210b0b410221070c93010b4102210b410221070c92010b4101210b0b410321070c90010b4102210b410321070c8f010b410c21074100210b0c8e010b417f20051048000b20052003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b101e000b200520011048000b20012003108c01000b417f20091048000b20092003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20091048000b20092003108c01000b417f20091048000b20092003108c01000b200520011048000b20012003108c01000b20044104102a000b417f20011048000b20012003108c01000b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b2000200b36020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200310230b024020022d004c4105470d002006450d00200241d4006a280200450d00200241d0006a28020010230b0240024002402007200d470d002007210d0c010b2007200d490d010240200d450d0020092007410274200d4102742205102722090d0120054104102a000b4100210d02402007450d00200910230b410421090b410021052001410c6a210b200141086a210c410021070240024002400240024003402005411f4b0d01200c2802002206200b2802002203460d02200341016a21042003417f460d0420062004490d05200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d210120036741686a41ff01714104490d030b2007ad422086200dad84210a410921070c070b410f21010c010b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200d41ffffffff0371450d0620091023200241e0006a24000f0b417f20041048000b20042006108c01000b418080c000104f000b0b0b20004100360200200041106a200a3703002000410c6a2009360200200041096a200b3a0000200041086a20073a00000b200241e0006a24000bbd07050c7f017e027f017e027f23004190026b2202240020024100360230200241306a20012802002203200128020422044104200441044922051b22061094041a2001200420066b22043602042001200320066a2206360200024020050d002002280230210720024200370214200241f098c400360210200241106a41086a21080240024002402007450d00200141046a2109200241c4006a210a200241c0006a210b200241306a410c6a210c4100210d034020024200370330200241306a200620044108200441084922051b22031094041a2009200420036b3602002001200620036a36020020050d022002290330210e200241086a200110452002280208450d020240024002400240200228020c2206417f4c0d00024002402006450d00200610ac01220f450d03200f200128020020092802002204200620042006491b22041094041a200928020022032004490d042009200320046b3602002001200128020020046a36020020042006470d010c050b4101210f41002006460d040b2006450d06200f10230c060b101d000b20064101102a000b200420031048000b200f450d022002200e370320024002402002280210220441f098c400460d00200228021421100c010b41e40110262204450d0441002110200441003b010620044100360200200441086a200241306a41dc011094041a20024100360214200220043602100b200d41016a210d2006ad22114220862011842111024002400340200441086a210520042f010622124103742103417f210602400240024003402003450d01200641016a2106417f4101200241206a2005410810960422134100481b410020131b2213450d05200341786a2103200541086a210520134101460d000b20100d010c020b201221062010450d010b2010417f6a2110200420064102746a41e4016a28020021040c010b0b200a200e370200200b2008360200200c2006360200200241306a41086a200241106a3602002002200436023420024100360230200220113702242002200f360220200241306a200241206a10ad01200d2007490d010c030b20042006410c6c6a220441e4006a2206280200210320062011370200200441e0006a220628020021042006200f36020002402004450d002003450d00200410230b200d20074f0d020b20092802002104200128020021060c000b0b20002002290310370200200041086a200828020036020020024190026a24000f0b2000410036020020022802102002280214200241186a28020010ae0120024190026a24000f0b41e4014104102a000b2000410036020020024190026a24000b0700200010fa030bea1105027f017e067f037e0b7f230041e0026b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241306a41086a2207200141086a28020036020020022001290200370330024020002f01062201410b4f0d00200020034103746a220841106a200841086a2208200120036b4103741095041a2008200437000020002003410c6c6a220141ec006a200141e0006a2209200041066a22082f010020036b410c6c1095041a200141e8006a200728020036020020092002290330370200200820082f010041016a3b01002002200036001720022006360013200241e0026a24000f0b02400240024041e4011026220a450d00200a41003b0106200a4100360200200a41086a200241d0006a41dc011094042107200241d0006a41086a2208200041b0016a280200360200200220002902a8013703502000413c6a330000210b2000413e6a310000210c20002d003f21092000350038210d2007200041c0006a200041066a220e2f010041796a22014103741094042107200a41e0006a200041b4016a2001410c6c109404210f200e41063b0100200a20013b0106200241c0006a41086a200828020036020020022002290350370340200d200b200c4210868442208684210b02400240200341064b0d00200041086a20034103746a220741086a2007200041066a22012f010020036b4103741095041a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c1095041a200741086a200241306a41086a280200360200200720022903303702000c010b200720034103746a41506a2007200341796a22084103746a2207200141ffff037120086b4103741095041a20072004370000200f2003410c6c6a220341b87f6a200341ac7f6a2207200a41066a22012f010020086b410c6c1095041a200341b47f6a200241306a41086a280200360200200720022903303702000b200120012f010041016a3b0100200241206a41086a2210200241c0006a41086a2211280200360200200220093a0017200220022903403703202002200b3e02102002200b4230883c00162002200b4220883d0114200241086a22122010280200360200200220022903203703002002290310210402400240024020002802002209450d0020002f0104211303402002200641016a220636021020022009360214200241306a41086a2214201228020036020020022002290300370330201341ffff0371210820092f01062200410a4d0d0241940210262207450d03200741003b010620074100360200200741086a200241d0006a418c021094042103200941386a290000210b200241d0006a41086a220f200941b0016a2802003602002002200941a8016a2902003703502003200941c0006a200941066a22152f0100220141796a22004103741094042116200741e0006a200941b4016a2000410c6c1094042117200741e4016a20094180026a2001417a6a220e4102741094042118201541063b0100200720003b01060240200e450d00410021002018210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b2011200f28020036020020022002290350370340200f20112802003602002002200229034037035002400240201341ffff0371220341064b0d00200941086a2200200841016a220e4103746a200020084103746a220020152f0100220120086b22134103741095041a20002004370000200941e0006a2008410c6c6a2200410c6a20002013410c6c1095041a200041086a2014280200360200200020022903303702002015200141016a22003b0100200941e4016a2201200841027422156a41086a2001200e4102746a2213200041ffff03712201200e6b4102741095041a2013200a360200200320014f0d01200920156a41e8016a2100034020002802002203200841016a22083b010420032009360200200041046a210020012008470d000c020b0b20162008417a6a22034103746a2016200841796a22004103746a220e200741066a22012f010020006b4103741095041a200e200437000020172008410c6c6a220e41b87f6a200e41ac7f6a221320012f0100221520006b410c6c1095041a200e41b47f6a2014280200360200201320022903303702002001201541016a220e3b01002018200841027422136a416c6a201820034102746a2201200e41ffff0371220820036b4102741095041a2001200a360200200320084b0d00200720136a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320082000470d000b0b2010200f280200360200200220022903503703202012201028020036020020022002290320370300024020092802002200450d0020092f0104211320002109200b21042007210a0c010b0b2007210a200b21040b41940210262200450d03200041003b010620004100360200200041086a200241d0006a418c0210940421012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f010622034103746a200437000020002003410c6c6a220141e8006a200241086a280200360200200141e0006a2002290300370200200041e4016a200341016a22034102746a200a360200200020033b0106200a20033b0104200a20003602000c040b200941086a2201200841016a22034103746a200120084103746a2201200020086b22074103741095041a2001200437000020092008410c6c6a220141ec006a200141e0006a220e2007410c6c1095041a200141e8006a200241306a41086a280200360200200e2002290330370200200941066a200041016a22003b0100200941e4016a220120084102746a41086a200120034102746a2201200041ffff0371220720036b4102741095041a2001200a360200201341ffff037120074f0d0320092003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b010420012009360200200341046a210320072000470d000c040b0b4194024104102a000b41e4014104102a000b4194024104102a000b200241e0026a24000be20303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200141016a2101200441e0006a2802002204450d030c010b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010232005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110232005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a2802002104024020064101460d00410120066b2101034020002802e4012100200141016a22010d000b0b410021012004450d020b2002417f6a210202402005a7450d00200410230b20020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002104200110232004450d00024020042802002201450d000340200410232001210420012802002200210120000d000b0b200410230b0bc10703097f047e017f230041e0006b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a41086a220720052003410c6c6a220a41f0026a280200360200200a41e8026a290200210b2001410c6a200341016a360200200141086a2004360200200141046a20053602002002200b370320200241306a41186a2006290300220b370300200241306a41106a2008290300220c370300200241306a41086a2009290300220d370300200241d8006a2007280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000f0b20004100360200200241e0006a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210b0c010b2004ad210b410021030b20051023200ba7210402400240200b422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210b0c010b2004ad210b410021050b20031023200ba7210420052103200b422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220a200341106a2900003703002002200341086a290000370300200241206a41086a220f20052006410c6c6a220341f0026a2802003602002002200341e8026a290200370320200520064102746a41f0036a2802002103024020074101460d00410120076b2105034020032802ec032103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241306a41186a2008290300220b370300200241306a41106a2009290300220c370300200241306a41086a200a290300220d370300200241d8006a200f280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000b970603087f017e017f23004180026b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341e0006c6a41e8026a41e0001094041a2001410c6a200341016a360200200141086a2004360200200141046a200536020020024180016a41186a200629030037030020024180016a41106a200829030037030020024180016a41086a2009290300370300200220022903003703800120024180016a41206a200241206a41e0001094041a200020024180016a4180011094041a20024180026a24000f0b2000420237032020024180026a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210a0c010b2004ad210a0b20051023200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210a0c010b2004ad210a0b20031023200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641e0006c6a41e8026a41e0001094041a200520064102746a418c0b6a2802002103024020074101460d00410120076b2105034020032802880b2103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a200336020020024180016a41186a200829030037030020024180016a41106a200929030037030020024180016a41086a200b290300370300200220022903003703800120024180016a41206a200241206a41e0001094041a200020024180016a4180011094041a20024180026a24000bc60401067f230041106b220224002002410036020820024201370300200120021041200141046a20021041200141086a20021041200228020421032002280208210402400240024002400240024002400240024002400240024002400240024020012d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22054100480d0c2004450d0320022802002004200510272203450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22054100480d0b2004450d0420022802002004200510272203450d050c060b200228020021030c080b200228020021030c050b2005102622030d050b20054101102a000b2005102622030d010b20054101102a000b20022005360204200220033602000b200241086a200441016a360200200320046a41003a00000c020b20022005360204200220033602000b200241086a200441016a360200200320046a41013a00000b200128020c21062002200141146a280200220136020c2002410c6a2002104102400240024020022802042205200241086a28020022036b20014f0d00200320016a22042003490d0320054101742207200420042007491b22074100480d032005450d0120022802002005200710272204450d020c040b200228020021040c040b2007102622040d020b20074101102a000b101e000b2002200736020420022004360200200721050b200420036a200620011094041a200041202004200320016a100402402005450d00200410230b200241106a24000b1600200120002802002200280200200028020810b3010b8408010b7f200028021021030240024002400240024002400240024002400240200028020822044101470d0020030d010c020b2003450d070b02402002450d00200120026a2105200041146a280200417f732106410021072001210320012108024002400340200341016a21090240024020032c0000220a4100480d00200a41ff0171210a20092103200641016a22060d010c030b02400240024020092005460d0020092d0000413f71210b200341026a22032109200a411f71210c200a41ff0171220a41e001490d010c020b4100210b20052103200a411f71210c200a41ff0171220a41e0014f0d010b200b200c41067472210a20092103200641016a22060d010c030b02400240024020032005460d00200341016a2209210d20032d0000413f71200b41067472210b200a41f001490d010c020b2005210d4100200b41067472210b200a41f0014f0d010b200b200c410c7472210a20092103200641016a22060d010c030b02400240200d2005460d00200d41016a2103200d2d0000413f71210a0c010b4100210a200921030b200b410674200c411274418080f0007172200a72220a418080c400460d03200641016a2206450d020b200720086b20036a21072003210820052003470d000c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b2004450d020c010b410021022004450d010b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200220096b2000410c6a28020022074f0d01410021064100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20076a2103410020002d0030220920094103461b2209410371450d0220094102460d0341002108200321060c040b2000280218200120022000411c6a28020028020c1102000f0b2000280218200120022000411c6a28020028020c1102000f0b200321080c010b20034101762106200341016a41017621080b417f2103200041046a2109200041186a210a2000411c6a210702400340200341016a220320064f0d01200a28020020092802002007280200280210110300450d000b41010f0b200041046a280200210941012103200041186a220a280200200120022000411c6a220628020028020c1102000d01200a280200210a417f2103200628020041106a210602400340200341016a220320084f0d01200a20092006280200110300450d000b41010f0b41000f0b2000280218200120022000411c6a28020028020c11020021030b20030bdb1801187f230041c00f6b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241206a41186a22062000412c6a290000370300200241206a41106a2207200041246a290000370300200241206a41086a22082000411c6a29000037030020022000290014370320200241a0026a200141e0001094041a024020032f01062201410b4f0d00200320044105746a220041286a200041086a2209200120046b4105741095041a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000200920022903203700002003200441e0006c6a220041c8036a200041e8026a2200200341066a22032f010020046b41e0006c1095041a2000200241a0026a41e0001094042100200320032f010041016a3b0100200241c00f6a240020000f0b02400240024041880b1026220a450d00200a41003b0106200a4100360200200a41086a20024190046a41800b10940421012002200341ca016a2d00003a00aa03200220032f00c8013b01a803200220032900db01370398032002200341e0016a29000037009d03200341cb016a280000210b200341cf016a280000210c200341d3016a280000210d200341d7016a280000210e20024190046a200341a8076a41e0001094041a2001200341e8016a200341066a22062f010041796a22004105741094042101200a41e8026a20034188086a200041e0006c1094042107200641063b0100200a20003b0106200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241b0036a20024190046a41e0001094041a02400240200441064b0d00200341086a20044105746a220141206a2001200341066a22002f010020046b4105741095041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200341e8026a200441e0006c6a220f41e0006a200f20002f010020046b41e0006c1095041a200f200241a0026a41e0001094041a0c010b200120044105746a41c07e6a2001200441796a22064105746a2201200041ffff037120066b4105741095041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a290300370000200120022903203700002007200441e0006c6a220041c07b6a200041e07a6a220f200a41066a22002f010020066b41e0006c1095041a200f200241a0026a41e0001094041a0b20024188026a41026a220420022d0096033a0000200020002f010041016a3b0100200220022f0194033b01880220022002290380033703800120022002290085033700850120024190016a200241b0036a41e0001094041a2002411c6a41026a221020042d00003a0000200220022f0188023b011c2002200229038001370308200220022900850137000d200241206a20024190016a41e0001094041a02400240024020032802002207450d0020032f0104211103402002419c026a41026a221620102d00003a0000200220022f011c3b019c0220022002290308370388022002200229000d37008d02200241a0026a200241206a41e0001094041a201141ffff0371210620072f01062203410a4d0d0241b80b10262201450d03200141003b010620014100360200200141086a20024190046a41b00b10940421002002200741ca016a2d00003a00aa03200220072f00c8013b01a803200220072900db01370398032002200741e0016a29000037009d03200741cb016a2800002112200741cf016a2800002115200741d3016a2800002114200741d7016a280000211320024190046a200741a8076a41e0001094041a2000200741e8016a200741066a22092f0100220441796a22034105741094042117200141e8026a20074188086a200341e0006c1094042118200141880b6a200741a40b6a2004417a6a22084102741094042119200941063b0100200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241b0036a20024190046a41e0001094041a200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241ac036a41026a220820022d0096033a0000200220022f0194033b01ac0320022002290380033703800120022002290085033700850120024190046a200241b0036a41e0001094041a02400240201141ffff0371220041064b0d00200741086a2203200641016a22044105746a200320064105746a220320092f0100221120066b22194105741095041a2003200e36000f2003200d36000b2003200c3600072003200b360003200341026a20162d00003a0000200320022f019c023b00002003200229038802370013200341186a200229008d02370000200741e8026a200641e0006c6a220341e0006a2003201941e0006c1095041a2003200241a0026a41e0001094041a2009201141016a22033b0100200741880b6a2211200641027422196a41086a201120044102746a2211200341ffff037120046b4102741095041a2011200a360200200020092f010022044f0d01200720196a418c0b6a2103034020032802002200200641016a22063b010420002007360200200341046a210320042006470d000c020b0b20172006417a6a22044105746a2017200641796a22034105746a2200200141066a22092f010020036b4105741095041a200041186a200229008d023700002000200e36000f2000200d36000b2000200c3600072000200b360003200041026a20162d00003a0000200020022f019c023b000020002002290388023700132018200641e0006c6a220041c07b6a200041e07a6a220020092f010020036b41e0006c1095041a2000200241a0026a41e0001094041a200920092f010041016a22003b01002019200641027422116a416c6a201920044102746a2209200041ffff0371220620046b4102741095041a2009200a360200200420064b0d00200120116a41f00a6a2100034020002802002204200341016a22033b010420042001360200200041046a210020062003470d000b0b20024184026a41026a220320082d00003a0000200220022f01ac033b01840220022002290380013703f00120022002290085013700f50120024190016a20024190046a41e0001094041a201020032d00003a0000200220022f0184023b011c200220022903f001370308200220022900f50137000d200241206a20024190016a41e0001094041a024020072802002203450d0020072f010421112012210b2013210e2014210d2015210c200321072001210a0c010b0b2012210b2013210e2014210d2015210c2001210a0b41b80b10262203450d03200341003b010620034100360200200341086a20024190046a41b00b10940421012003200528020022003602880b200520033602002005200528020441016a360204200041003b010420002003360200200120032f010622044105746a220020022f011c3b00002000200e36000f2000200d36000b2000200c3600072000200b36000320002002290308370013200041026a2002411c6a41026a2d00003a0000200041186a200229000d3700002003200441e0006c6a41e8026a200241206a41e0001094041a200341880b6a200441016a22004102746a200a360200200320003b0106200a20003b0104200a20033602000c040b200741086a2200200641016a22044105746a200020064105746a2200200320066b22014105741095041a2000200e36000f2000200d36000b2000200c3600072000200b360003200041026a2002419c026a41026a2d00003a0000200020022f019c023b00002000200229038802370013200041186a200229008d023700002007200641e0006c6a220041c8036a200041e8026a2200200141e0006c1095041a2000200241a0026a41e0001094041a200741066a2200200341016a22033b0100200741880b6a220120064102746a41086a200120044102746a2201200341ffff037120046b4102741095041a2001200a360200201141ffff037120002f010022034f0d03200a20043b0104200a200736020020042003460d032003417f6a210120072004417f6a22034102746a41900b6a2100034020002802002204200341026a3b010420042007360200200041046a21002001200341016a2203470d000c040b0b41b80b4108102a000b41880b4108102a000b41b80b4108102a000b200241c00f6a2400200f0bbe0101047f230041306b220124002001200010af01024020012802004101470d00200141286a2102200141246a21030340024020032802002204450d002002280200450d00200410230b2001200010af0120012802004101460d000b0b02402000280204220441f098c400460d0020042802002103200410232003450d0020032802002100200310232000450d00024020002802002204450d000340200010232004210020042802002203210420030d000b0b200010230b200141306a24000ba11f01407f23004190066b22042400200441e0006a41186a200241186a290000370300200441e0006a41106a200241106a290000370300200441e0006a41086a200241086a2900003703002004200229000037036002400240024002402001280200220541f098c400460d00200128020421060c010b41ec0310262205450d0141002106200541003b010620054100360200200541086a200441f8016a41e4031094041a20014100360204200120053602000b0c010b41ec034104102a000b41002102024003400240024002400240024002400240024020020e020001010b200541086a2107200541066a210820052f01062209410574210a417f2102024002400240024002400340200a450d01200241016a2102417f4101200441e0006a20074120109604220b4100481b4100200b1b220b450d04200a41606a210a200741206a2107200b4101460d000b20060d010c020b200921022006450d010b2006417f6a2106200520024102746a41ec036a2802002105410021020c0a0b200441086a41186a220b200441e0006a41186a220a290300370300200441086a41106a220c200441e0006a41106a2207290300370300200441086a41086a2209200441e0006a41086a220d290300370300200420042903603703082001200128020841016a360208200a200b2903003703002007200c290300370300200d200929030037030020042004290308370360200441e8016a41086a220c200341086a280200360200200420032902003703e80120082f01002209410b4f0d01200520024105746a220b41286a200b41086a220e200920026b4105741095041a200b41206a200a290300370000200b41186a2007290300370000200b41106a200d290300370000200e200429036037000020052002410c6c6a220a41f4026a200a41e8026a220d200541066a22072f010020026b410c6c1095041a200a41f0026a200c280200360200200d20042903e801370200200720072f010041016a3b01000c0a0b200441f8016a41086a220a20052002410c6c6a220241f0026a22072802003602002004200241e8026a22022902003703f8012007200341086a28020036020020022003290200370200200441e0006a41086a2202200a280200360200200420042903f801370360200041013602002000410c6a20022802003602002000200429036037020420044190066a24000f0b41ec031026220f450d04200f41003b0106200f4100360200200f41086a200441f8016a41e4031094042107200441f8016a41086a220d200541b8036a280200360200200420052902b0033703f8012004200541e0016a2900003700c501200420052900db013703c0012004200541ca016a2d00003a00d201200420052f00c8013b01d001200541cb016a2800002110200541cf016a2800002111200541d3016a2800002112200541d7016a28000021132007200541e8016a200541066a220b2f010041796a220a4105741094042107200f41e8026a200541bc036a200a410c6c109404210c200b41063b0100200f200a3b0106200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200441286a41086a200d280200360200200420042903f80137032802400240200241064b0d00200541086a20024105746a220a41206a200a20082f010020026b4105741095041a200a41186a200441e0006a41186a290300370000200a41106a200441e0006a41106a290300370000200a41086a200441e0006a41086a290300370000200a2004290360370000200541e8026a2002410c6c6a220a410c6a200a20082f010020026b410c6c1095041a200a41086a200441e8016a41086a280200360200200a20042903e8013702000c010b200720024105746a41c07e6a2007200241796a220d4105746a2207200a41ffff0371200d6b4105741095041a200741186a200441e0006a41186a290300370000200741106a200441e0006a41106a290300370000200741086a200441e0006a41086a29030037000020072004290360370000200c2002410c6c6a220241b87f6a200241ac7f6a220a200f41066a22082f0100200d6b410c6c1095041a200241b47f6a200441e8016a41086a280200360200200a20042903e8013702000b4101210d200820082f010041016a3b01004102211420044198016a41026a220220042d00be013a000041082115200441d8016a41086a2216200441286a41086a280200360200200420042f01bc013b019801200420042903a801370350200420042900ad01370055200420042903283703d801200441c0006a41086a221720162802003602002004413c6a41026a221820022d00003a0000200420042903d801370340200420042903503703282004200429005537002d200420042f0198013b013c2005280200220e450d0120052f0104211941ffff03211a410a211b419c04211c4100211d419404211e41ca01211f41db01212041e001212141cb01212241cf01212341d301212441d701212541b803212641b003212741e8012128410621294179212a4105212b41bc03212c41e802212d410c212e418804212f41ec032130417a21314118213241f00321334104210c41ac7f213441b87f213541b47f2136416c213741d40321380c060b20044194016a20146a223d20182d00003a0000200420042f013c3b019401200420042903283703602004200429002d37006520044198016a20156a223e201728020036020020042004290340370398012019201a712109200e2f01062202201b4d0d01201c1026220b450d02200b201d3b0106200b201d360200200b20156a200441f8016a201e109404210a2004200e201f6a2d00003a00d2012004200e2f00c8013b01d0012004200e20206a2900003703c0012004200e20216a2900003700c501200e20226a2800002139200e20236a280000213c200e20246a280000213b200e20256a280000213a200441f8016a20156a223f200e20266a2802003602002004200e20276a2902003703f801200a200e20286a200e20296a22402f01002207202a6a2202202b741094042141200b202d6a200e202c6a2002202e6c1094042142200b20306a200e202f6a200720316a22082014741094042143204020293b0100200b20023b010602402008450d00410021022043210a0340200a280200220720023b01042007200b360200200a200c6a210a20082002200d6a2202470d000b0b200441e8016a20156a2202203f280200360200200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200420042903f8013703e801200441d4016a20146a220820042d00be013a0000200420042f01bc013b01d401200420042903a8013703f801200420042900ad013700fd0120162002280200360200200420042903e8013703d801024002402019201a71220a20294b0d00200e20156a22022009200d6a2219202b746a20022009202b746a220220402f010020096b202b741095041a200220326a20042900653700002002201336000f2002201236000b2002201136000720022010360003200220146a203d2d00003a0000200220042f0194013b000020022004290360370013200e202d6a2009202e6c6a2202202e6a200220402f0100220720096b202e6c1095041a200220156a203e280200360200200220042903980137020020402007200d6a22023b0100200e20306a2207200920147422116a20156a200720192014746a22402002201a71220720196b2014741095041a2040200f360200200a20074f0d01200e20116a20336a210203402002280200220a2009200d6a22093b0104200a200e3602002002200c6a210220072009470d000c020b0b2041200920316a2207202b746a20412009202a6a2202202b746a220a200b20296a22192f010020026b202b741095041a200a20326a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a20146a203d2d00003a0000200a20042f0194013b0000200a200429036037001320422009202e6c6a220a20356a200a20346a224020192f0100221120026b202e6c1095041a200a20366a203e280200360200204020042903980137020020192011200d6a220a3b01002043200920147422406a20376a204320072014746a2219200a201a71220920076b2014741095041a2019200f360200200720094b0d00200b20406a20386a210a0340200a28020022072002200d6a22023b01042007200b360200200a200c6a210a20092002470d000b0b20044190016a20146a220220082d00003a000020044180016a20156a220a2016280200360200200420042f01d4013b019001200420042903f801370350200420042900fd01370055200420042903d801370380012017200a280200360200201820022d00003a00002004200429038001370340200420042903503703282004200429005537002d200420042f0190013b013c0240200e2802002202450d00200e2f0104211920392110203a2113203b2112203c21112002210e200b210f410121020c070b20392110203a2113203b2112203c2111200b210f0b419c0410262202450d03200241003b010620024100360200200241086a200441f8016a419404109404210d20022001280200220a3602ec03200120023602002001200128020441016a360204200a41003b0104200a2002360200200d20022f010622074105746a220a2004290328370013200a20042f013c3b0000200a201336000f200a201236000b200a2011360007200a2010360003200a41186a200429002d370000200a41026a2004413c6a41026a2d00003a000020022007410c6c6a220a41f0026a200441c0006a41086a280200360200200a41e8026a2004290340370200200241ec036a200741016a220a4102746a200f3602002002200a3b0106200f200a3b0104200f20023602000c060b200e41086a220a200941016a22074105746a200a20094105746a220a200220096b4105741095041a200a41186a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a41026a20044194016a41026a2d00003a0000200a20042f0194013b0000200a2004290360370013200e2009410c6c6a220241f4026a200241e8026a220a200e41066a220d2f0100220b20096b410c6c1095041a200241f0026a20044198016a41086a280200360200200a200429039801370200200d200b41016a22023b0100200e41ec036a220a20094102746a41086a200a20074102746a220a200241ffff0371220d20076b4102741095041a200a200f360200201941ffff0371200d4f0d05200e2007417f6a22024102746a41f0036a210a0340200a2802002207200241016a22023b01042007200e360200200a41046a210a200d2002470d000c060b0b419c044104102a000b41ec034104102a000b419c044104102a000b410121020c000b0b2000410036020020044190066a24000b9f3401087f23004190016b220824000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002410c6a280200200241106a28020010052209417f460d00410c1026220a450d01200a2009360208200a42818080801037020002404101450d00200a410141016a3602004101417e460d00200a410141027236020041041026220b450d03200b200a360200200a280208210c41031026220d450d04200d41026a41002d00cce2443a0000200d41002f00cae2443b000041061026220e450d05200e41046a41002f00cfbf443b0000200e41002800cbbf44360000412010262209450d062009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a41086a2802001006200a200a280204417f6a220d360204200d0d00200a10230b41031026220d450d07200d41026a41002d00cce2443a0000200d41002f00cae2443b000041031026220e450d08200e41026a41002d00cfe2443a0000200e41002f00cde2443b00002009412041c00010272209450d092009410836023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d36022041031026220d450d0a200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410f1026220e450d0b200e41076a41002900a6ce44370000200e410029009fce44370000200941c00041800110272209450d0c2009410936025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d36024041031026220d450d0d200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410f1026220e450d0e200e41076a41002900b5ce44370000200e41002900aece443700002009410a36027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d36026041031026220d450d0f200d41026a41002d00cce2443a0000200d41002f00cae2443b000041081026220e450d10200e42e5f0d1fbb5ac98b6ec00370000200941800141800210272209450d112009410b36029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d3602800141031026220d450d12200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d13200e41086a41002f00cdce443b0000200e41002900c5ce443700002009410c3602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a00141031026220d450d14200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d15200e41086a41002f00d7ce443b0000200e41002900cfce443700002009410d3602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c00141031026220d450d16200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d17200e41086a41002f00e1ce443b0000200e41002900d9ce443700002009410e3602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e00141031026220d450d18200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410b1026220e450d19200e41076a41002800eace44360000200e41002900e3ce44370000200941800241800410272209450d1a2009410f36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d3602800241031026220d450d1b200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410d1026220e450d1c200e41056a41002900f3ce44370000200e41002900eece44370000200941103602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a00241031026220d450d1d200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410c1026220e450d1e200e41086a4100280083cf44360000200e41002900fbce44370000200941113602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c00241031026220d450d1f200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410b1026220e450d20200e41076a410028008ecf44360000200e4100290087cf44370000200941123602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e00241031026220e450d21200e41026a41002d00cce2443a0000200e41002f00cae2443b000041151026220d450d22200d410d6a410029009fcf44370000200d41086a410029009acf44370000200d4100290092cf443700002009411336029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e3602800341031026220d450d23200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d24200e41086a41002f00afcf443b0000200e41002900a7cf44370000200941143602bc03200941003602b8032009428a808080a0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a00341031026220d450d25200d41026a41002d00cce2443a0000200d41002f00cae2443b000041071026220e450d26200e41036a41002800b4cf44360000200e41002800b1cf44360000200941153602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c00341031026220e450d27200e41026a41002d00cce2443a0000200e41002f00cae2443b000041111026220d450d28200d41106a41002d00c8cf443a0000200d41086a41002900c0cf44370000200d41002900b8cf44370000200941163602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e00341031026220d450d29200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410e1026220e450d2a200e41066a41002900cfcf44370000200e41002900c9cf4437000020094180044180081027220c450d2b200c411736029c04200c410036029804200c428e808080e00137029004200c200e36028c04200c42838080803037028404200c200d36028004410310262209450d2c200941026a41002d00cce2443a0000200941002f00cae2443b0000410e1026220d450d2d200d41066a41002900ddcf44370000200d41002900d7cf44370000200c41183602bc04200c41003602b804200c428e808080e0013702b004200c200d3602ac04200c4283808080303702a404200c20093602a004410310262209450d2e200941026a41002d00cce2443a0000200941002f00cae2443b000041101026220d450d2f200d41086a41002900edcf44370000200d41002900e5cf44370000200c41193602dc04200c41003602d804200c429080808080023702d004200c200d3602cc04200c4283808080303702c404200c20093602c004410310262209450d30200941026a41002d00cce2443a0000200941002f00cae2443b000041101026220d450d31200d41086a41002900fdcf44370000200d41002900f5cf44370000200c411a3602fc04200c41003602f804200c429080808080023702f004200c200d3602ec04200c4283808080303702e404200c20093602e00441031026220d450d32200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411110262209450d33200941106a41002d0095d0443a0000200941086a410029008dd04437000020094100290085d044370000200c411b36029c05200c410036029805200c4291808080900237029005200c200936028c05200c42838080803037028405200c200d3602800541031026220d450d34200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411610262209450d352009410e6a41002900a4d044370000200941086a410029009ed04437000020094100290096d044370000200c411c3602bc05200c41003602b805200c4296808080e0023702b005200c20093602ac05200c4283808080303702a405200c200d3602a00541031026220d450d36200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411210262209450d37200941106a41002f00bcd0443b0000200941086a41002900b4d044370000200941002900acd044370000200c411d3602dc05200c41003602d805200c4292808080a0023702d005200c20093602cc05200c4283808080303702c405200c200d3602c005410310262209450d38200941026a41002d00cce2443a0000200941002f00cae2443b0000410b1026220d450d39200d41076a41002800c5d044360000200d41002900bed044370000200c411e3602fc05200c41003602f805200c428b808080b0013702f005200c200d3602ec05200c4283808080303702e405200c20093602e005200841086a41086a2005360200200841086a41206a4100360200200841086a41146a200641086a2802003602002008200436020c2008200336020820084100360238200820073602342008200a36023020084201370320200820062902003702142008200128020036022c200241146a28020021072002411c6a280200210f2008410036025020084201370348200841183602880120084188016a200841c8006a10414100210402400240024002400240024002400340200c20046a220d28020021012008200d41086a28020022093602880120084188016a200841c8006a10410240024002400240200828024c2206200841c8006a41086a220e280200220a6b20094f0d00200a20096a2203200a490d0520064101742205200320032005491b22034100480d052006450d01200828024820062003102722060d020c060b200828024821060c020b200310262206450d040b2008200336024c200820063602480b200e200a20096a3602002006200a6a200120091094041a200d410c6a28020021052008200d41146a28020022013602880120084188016a200841c8006a10410240024002400240200828024c220a200e28020022036b20014f0d00200320016a22092003490d05200a4101742206200920092006491b22064100480d05200a450d012008280248200a2006102722090d020c070b200828024821090c020b200610262209450d050b2008200636024c200820093602482006210a0b200e200320016a2206360200200920036a200520011094041a0240024002400240024002400240024002400240024002400240024002400240200d41186a2802004101470d00200a2006470d01200a41016a2201200a490d11200a4101742203200120012003491b22014100480d11200a450d032009200a2001102722090d040c140b200a2006470d01200a41016a2201200a490d10200a4101742203200120012003491b22014100480d10200a450d052009200a2001102722090d060c140b200a21010c030b200a21010c050b200110262209450d100b2008200136024c200820093602480b200e200641016a220a360200200920066a41023a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0b20014101742205200320032005491b22034100480d0b2001450d03200920012003102722090d040c100b200110262209450d0e0b2008200136024c200820093602480b200e200641016a220a360200200920066a41013a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0820014101742205200320032005491b22034100480d082001450d03200920012003102722090d040c0e0b200310262209450d0c0b2008200336024c200820093602480b200e200641056a3602002009200a6a200d360000200441206a2204418006470d040c030b200310262209450d0a0b2008200336024c200820093602480b200e200641056a3602002009200a6a200d360000200441206a2204418006470d010b0b200828024c210902400240411f2007200f20082802482206200841d0006a280200200841086a1007220d417d460d00200d417f470d014100210a2009450d470c460b4102210a20090d450c460b41041026220e450d41200b280200220a28020041016a22014102490d07200a2001360200200e200a36020002402009450d00200610230b20022802042106200228020021012008410036025020084201370348200841003602880120084188016a200841c8006a104120082802502103200828024c21042008280248210a410a10ac012209450d4241012105024002400240200d20012006200a20032009410a200841086a10082206417d460d0020060d462008410936028c012008200941016a36028801024020092d00002206450d00024020064101470d00200841c8006a20084188016a10d0012008280248417e714104470d010b200910232004450d02200a10230c020b410021050b2009102302402004450d00200a10230b410321092005450d010b410221090b200841c8006a41386a200841086a41386a280200360200200841c8006a41306a200841086a41306a290300370300200841c8006a41286a200841086a41286a290300370300200841c8006a41206a200841086a41206a290300370300200841c8006a41186a200841086a41186a290300370300200841c8006a41106a200841086a41106a290300370300200841c8006a41086a200841086a41086a290300370300200820082903083703482000200841c8006a200910d101200d1009200e28020022092009280200417f6a3602000240200e28020022092802000d0020092802081006200e28020022092009280204417f6a360204200e28020022092802040d00200910230b200e102341012106410021010c460b101e000b20034101102a000b20064101102a000b20014101102a000b20014101102a000b20034101102a000b20034101102a000b00000b10d201000b410c4104102a000b41044104102a000b41034101102a000b41064101102a000b41204104102a000b41034101102a000b41034101102a000b41c0004104102a000b41034101102a000b410f4101102a000b4180014104102a000b41034101102a000b410f4101102a000b41034101102a000b41084101102a000b4180024104102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410b4101102a000b4180044104102a000b41034101102a000b410d4101102a000b41034101102a000b410c4101102a000b41034101102a000b410b4101102a000b41034101102a000b41154101102a000b41034101102a000b410a4101102a000b41034101102a000b41074101102a000b41034101102a000b41114101102a000b41034101102a000b410e4101102a000b4180084104102a000b41034101102a000b410e4101102a000b41034101102a000b41104101102a000b41034101102a000b41104101102a000b41034101102a000b41114101102a000b41034101102a000b41164101102a000b41034101102a000b41124101102a000b41034101102a000b410b4101102a000b41044104102a000b410a4101102a000b41e49cc300104f000b200610230b0240200a450d00200841c8006a41386a200841086a41386a280200360200200841c8006a41306a200841086a41306a290300370300200841c8006a41286a200841086a41286a290300370300200841c8006a41206a200841086a41206a290300370300200841c8006a41186a200841086a41186a290300370300200841c8006a41106a200841086a41106a290300370300200841c8006a41086a200841086a41086a290300370300200820082903083703482000200841c8006a200a10d10141002106410121010c010b20004187abc10036020420004102360200200041086a41103602000240200841146a2802002209450d00200841086a41106a280200450d00200910230b0240200841246a280200450d00200841206a28020010230b200841306a2209280200220a200a280200417f6a36020002402009280200220a2802000d00200a28020810062009280200220a200a280204417f6a360204200928020022092802040d00200910230b0240200841386a2802002209450d002008413c6a280200450d00200910230b4100210a03400240200c200a6a220941046a280200450d00200928020010230b0240200941106a280200450d002009410c6a28020010230b200a41206a220a418006470d000b200c1023200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081006200b28020022092009280204417f6a360204200b28020022092802040d00200910230b200b102320084190016a24000f0b4100210a03400240200c200a6a220941046a280200450d00200928020010230b0240200941106a280200450d002009410c6a28020010230b200a41206a220a418006470d000b200c1023200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081006200b28020022092009280204417f6a360204200b28020022092802040d00200910230b200b102341002109024020014100472006720d00200d100902400340200e20096a220a280200220d200d280200417f6a36020002400240200a280200220d2802000d00200d2802081006200a280200220d200d280204417f6a360204200a280200220a280204450d010b200941046a22094104470d010c020b200a1023200941046a22094104470d000b0b200e10230b20084190016a24000b5201027e02402003450d0020022802000d00200128022c220342002003290308220420023502047d220520052004562005507222021b37030820004105410420021b3602000f0b41c9b9c10041f4031021000bbb0e03047f037e047f230041900d6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042103200241146a2802002105200241246a2802002106200241346a2802002107200441106a2001280224290338420042204200109804200441386a4200370300200441306a4200370300200441286a4200370300200128022c2202420020022903082208427f200429031020042903184200521b7d220920092008562009507222021b370308200442003703200240024020020d0020012802282802082003200441206a4120100e2202417e460d0020020d06024002400240024002402005450d002004200141246a28020029033842002007ad220a42001098042001412c6a2802002202420020022903082208427f200429030020042903084200521b7d220920092008562009507222021b37030820020d052007450d0120074100480d0e20071026220b450d0f41012102200b2103024020074102490d00200b41002007417f6a220210930420026a2103200721020b200341003a00000c020b4100210b0c020b410021024101210b4200210a0b200141286a2802002802082006200b2002100e2203417e460d0120030d0a200b450d02200a2002ad4220868421090b20012802002102200441c0006a41186a2201200441206a41186a290300370300200441c0006a41106a2207200441206a41106a290300370300200441c0006a41086a2205200441206a41086a2903003703002004200429032037034020022802182103200441e0006a41186a2001290300370300200441e0006a41106a2007290300370300200441e0006a41086a200529030037030020042004290340370360200328020c0d082003410c6a417f360200200441d80c6a41186a200341e4006a290000370300200441d80c6a41106a200341dc006a290000370300200441d80c6a41086a200341d4006a2900003703002004200329004c3703d80c02400240200341106a220c280200220141f098c400460d00200341146a280200210d0c010b41880b10262201450d0d4100210d200141003b010620014100360200200141086a200441d8016a41800b1094041a200341146a4100360200200341106a20013602000b0240024002400240034020012f0106220e410574210641002102417f2107024002400240034020062002460d01200741016a2107417f4101200441d80c6a200120026a41086a412010960422054100481b410020051b2205450d05200241206a210220054101460d000b200d0d010c020b200e2107200d450d010b200d417f6a210d200120074102746a41880b6a28020021010c010b0b20044180016a41186a200441d80c6a41186a29030037030020044180016a41106a200441d80c6a41106a29030037030020044180016a41086a200441d80c6a41086a290300370300200420042903d80c37038001200341186a21024100210d41000d010c020b200341186a21024101450d010b200441f0016a4200370300200441ec016a41f098c400360200200441003602f801200441003602e801200442003703e001200441f098c4003602dc01200441003602d8012001200741e0006c6a41e8026a2102200441d8016a10b5010c010b200441f40c6a20044180016a41086a290300370200200441fc0c6a20044180016a41106a290300370200200441840d6a20044180016a41186a290300370200200420023602e80c200420073602e40c2004200c3602e00c200420013602dc0c2004200d3602d80c20042004290380013702ec0c2004418c026a4200370200200441f8016a20042903c80137030020044180026a200441c8016a41086a29030037030020044195026a20042900a0013700002004419d026a200441a0016a41086a290000370000200441a5026a200441a0016a41106a290000370000200441ad026a200441a0016a41186a290000370000200441b4026a200441bf016a280000360000200442003703f001200442003703d801200441f098c40036028802200441003a009402200441d80c6a200441d8016a10b40121020b200441d8016a41186a200441e0006a41186a290300370300200441d8016a41106a200441e0006a41106a290300370300200441d8016a41086a200441e0006a41086a290300370300200420042903603703d801200420093702a4012004200b3602a001200441d80c6a200241306a200441d8016a200441a0016a10b601024020042802d80c450d0020042802dc0c2202450d00200441e00c6a280200450d00200210230b2003410c6a2202200228020041016a360200410421020c020b200a500d00200b10230b410521020b20002002360200200441900d6a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b10e601000b41d8f6c400104f000b101e000b20074101102a000b41880b4108102a000b940302017f027e230041d0006b22042400024002402003450d0020022802000d002002280204210320042001280224290338420042204200109804200441286a4200370300200441206a4200370300200441186a4200370300200128022c2202420020022903082205427f200429030020042903084200521b7d220620062005562006507222021b3703082004420037031002400240024020020d0020012802282802082003200441106a4120100e2202417e460d0020020d04200441306a20012802002802182202410c6a200241cc006a2002410020022802001b200441106a10e5012004280230450d01200441c0006a41086a2203200441306a41086a28020036020020042004290330370340200141186a210202402001411c6a280200450d00200228020010230b20022004290340370200200241086a2003280200360200410021010c020b20004105360200200441d0006a24000f0b200141206a4100360200410121010b2000410036020020002001360204200441d0006a24000f0b41c9b9c10041f4031021000b41d8f6c400104f000bab0d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a20012802242903384200200241146a2802002202ad4200109804200128022c220342002003290308220b427f200429032020042903284200521b7d220c200c200b56200c507222031b37030820030d0e024002402002450d0020024100480d0a200210262203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e109304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e100e2205417e460d0020050d0a2003450d1120044180016a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1093041a20044180016a200320051094041a200d0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d00200310230b200441106a200141246a28020029033842002008ad42001098042001412c6a280200220242002002290308220b427f200429031020042903184200521b7d220c200c200b56200c507222021b37030820020d112008450d0120084100480d0b200810262202450d0e2002210541002103024020084102490d00200241002008417f6a220310930420036a21050b200541003a0000200341016a21030c020b2002450d10200310230c100b4100210841012102410021030b0240024002402001280228280208200720022003100e2205417e460d0020050d0d2002450d112004420037038801200442003703800120044180016a20022003411020034110491b1094041a2003410f4d0d0020044188016a290300210f200429038001211002402008450d00200210230b2004200141246a2802002903384200200aad42001098042001412c6a280200220242002002290308220b427f200429030020042903084200521b7d220c200c200b56200c507222021b37030820020d11200a450d01200a4100480d0b200a10262202450d1041012103200221050240200a4102490d0020024100200a417f6a220310930420036a2105200a21030b200541003a00000c020b2008450d10200210230c100b4100210a41012102410021030b024002400240024002402001280228280208200920022003100e2205417e460d0020050d112002450d13200141206a41003602002001411c6a280200210820012802182107200142013702182001412c6a2802002205290308220b210c2006500d012006210c200b20065a0d01410121032008450d0220071023200a0d030c040b200a450d12200210230c120b200541086a220e200b200c7d3703002005290310210b200441d0006a41186a200541186a2903003703002004200c3703582004200c3703502004200b370360200128020041186a280200210520044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a801200420083602a401200420073602a001200441f0006a200520044180016a2010200f200441d0006a20022003200441a0016a10e701200441f0006a41086a290300210c2004280274210520042802702108200e2004290358200e2903007c3703004101210320084101460d002005450d0002402001411c6a2203280200450d00200141186a28020010230b2003200c370200200141186a2005360200410021030b200a450d010b200210230b2000410036020020002003360204200441b0016a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d8f6c400104f000b20084101102a000b41d8f6c400104f000b200a4101102a000b20004105360200200441b0016a24000b8f1006027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a20012802242903384200200241146a2802002202ad4200109804200128022c220342002003290308220b427f200429032820042903304200521b7d220c200c200b56200c507222031b37030820030d13024002402002450d0020024100480d0a200210262203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e109304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e100e2205417e460d0020050d0a2003450d16200441f8006a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1093041a200441f8006a200320051094041a200d0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d00200310230b200441186a200141246a28020029033842002008ad42001098042001412c6a280200220242002002290308220b427f200429031820042903204200521b7d220c200c200b56200c507222021b37030820020d162008450d0120084100480d0b200810262202450d0e2002210541002103024020084102490d00200241002008417f6a220310930420036a21050b200541003a0000200341016a21030c020b2002450d15200310230c150b4100210841012102410021030b0240024002402001280228280208200720022003100e2205417e460d0020050d0d2002450d16200442003703c001200442003703b801200441b8016a20022003411020034110491b1094041a2003410f4d0d00200441c0016a290300210f20042903b801211002402008450d00200210230b200441086a200141246a2802002903384200200aad42001098042001412c6a280200220242002002290308220b427f200429030820042903104200521b7d220c200c200b56200c507222021b37030820020d16200a450d01200a4100480d0b200a10262202450d1041012103200221050240200a4102490d0020024100200a417f6a220310930420036a2105200a21030b200541003a00000c020b2008450d15200210230c150b4100210a41012102410021030b024002402001280228280208200920022003100e2205417e460d0020050d0e2002450d15200141206a41003602002001412c6a2802002205290308220b210c02402006500d004101210e2006210c200b2006540d130b200541086a2208200b200c7d3703002005290310210b20044198016a41186a200541186a2903003703002004200c3703a0012004200c370398012004200b3703a801200441b8016a200128020041186a2802002010200f20044198016a200441386a2002200310e2014101210e20042d00b8014101470d01200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200820044198016a41086a29030020082903007c37030020042004290378370358200a0d130c140b200a450d14200210230c140b200441f8006a41186a2203200441d1016a290000370300200441f8006a41106a2205200441c9016a290000370300200441f8006a41086a220e200441c1016a290000370300200420042900b901370378200441d8006a41086a2207200e290300370300200441d8006a41106a220e2005290300370300200441d8006a41186a22052003290300370300200820044198016a41086a29030020082903007c37030020042004290378370358200441b8016a41186a2005290300370300200441b8016a41106a200e290300370300200441b8016a41086a2007290300370300200420042903583703b8010240024002402001411c6a2802002205200141206a28020022036b41204f0d00200341206a220e2003490d0b20054101742203200e200e2003491b22034100480d0b2005450d01200141186a2802002005200310272205450d020c110b200141186a28020021050c110b2003102622050d0f0b20034101102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d8f6c400104f000b20084101102a000b41d8f6c400104f000b200a4101102a000b2001411c6a2003360200200141186a2005360200200141206a28020021030b200141206a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210e0b200a450d010b200210230b200041003602002000200e360204200441e0016a24000f0b20004105360200200441e0016a24000bd30403027f027e057f230041106b22042400024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903184200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b37030820030d09200128020c21032001410036020c2003450d02200141106a29020022074280808080105a0d03024002400240024020022007422088a722084d0d002007a7220920086b200220086b220a4f0d012008200a6a220b2008490d082009410174220c200b200b200c491b220b4100480d082009450d0220032009200b10272203450d030c090b2002200820022008491b21020c0b0b2003200822096a210b200a4102490d090c080b200b102622030d060b200b4101102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41bdbdc10041fd001021000b41ccabc400104f000b101e000b20074220882106200bad210720032006a722096a210b200a4102490d010b200b410020022008417f7322086a1093041a2003200920026a20086a22096a210b0b200b41003a0000200941016a21020b02402001280228280208200520032002100e2208417e460d0020080d022007a72108024020012802302205450d00200141346a280200450d00200510230b200141386a2002360200200141346a2008360200200141306a20033602000c010b2007a7450d00200310230b20004105360200200441106a24000f0b41d8f6c400104f000b900101027f200128020021040240412010262205450d002005200429001c370000200541186a200441346a290000370000200541106a2004412c6a290000370000200541086a200441246a29000037000002402001411c6a2204280200450d00200141186a28020010230b20004104360200200442a08080808004370200200141186a20053602000f0b41204101102a000b960101027f200128020028021821040240412010262205450d002005200429004c370000200541186a200441e4006a290000370000200541106a200441dc006a290000370000200541086a200441d4006a29000037000002402001411c6a2204280200450d00200141186a28020010230b20004104360200200442a08080808004370200200141186a20053602000f0b41204101102a000b7703017f027e017f200128022c220441186a2903002105200429031021060240411010262204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010230b20004104360200200742908080808002370200200141186a20043602000f0b41104101102a000b6202017e027f200128022c29030821040240410810262205450d002005200437000002402001411c6a2206280200450d00200141186a28020010230b20004104360200200642888080808001370200200141186a20053602000f0b41084101102a000bc103020b7f027e230041106b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120109604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d002006280200450d00200641106a290300210f200641086a29030021100c010b20042005411c6a2802002007200541206a28020028021c110400200441086a290300210f200528020c2108200429030021100b2005410c6a2008417f6a360200411010262206450d01200620103700002006200f37000802402001411c6a220d280200450d00200141186a28020010230b20004104360200200d42908080808002370200200141186a2006360200200441106a24000f0b10e401000b41104101102a000b7703017f027e017f2001280200220441086a2903002105200429030021060240411010262204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010230b20004104360200200742908080808002370200200141186a20043602000f0b41104101102a000bf80303047f027e017f230041306b220424000240024002400240024002402003450d0020022802000d0020034101460d0120022802100d01410521050240200241146a2802002203200128022422062802584b0d00200228020421072004200629033842002003ad4200109804200128022c2202420020022903082208427f200429030020042903084200521b7d220920092008562009507222021b37030820020d00024002402003450d0020034100480d06200310262202450d07410121062002210a024020034102490d00200241002003417f6a220610930420066a210a200321060b200a41003a00000c010b4100210341012102410021060b02402001280228280208200720022006100e2207417e460d0020070d042002450d01200441106a2002200610e301412010262205450d0720052004290310370000200541186a200441106a41186a290300370000200541106a200441106a41106a290300370000200541086a200441106a41086a29030037000002402001411c6a2206280200450d00200141186a28020010230b200642a08080808004370200200141186a2005360200410421050b2003450d00200210230b20002005360200200441306a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20034101102a000b41204101102a000b6202017e027f200128020029031021040240410810262205450d002005200437000002402001411c6a2206280200450d00200141186a28020010230b20004104360200200642888080808001370200200141186a20053602000f0b41084101102a000be70a04027f027e027f047e230041b0036b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429032820042903304200521b7d220720072006562007507222031b37030820030d0a024002402002450d0020024100480d05200210262203450d062003210841002109024020024102490d00200341002002417f6a220910930420096a21080b200841003a0000200941016a21090c010b4100210241012103410021090b024002402001280228280208200520032009100e2205417e460d0020050d042003450d0c200420093602ac01200420033602a801200441a0026a200441a8016a104420042802a0022205410e470d010b2002450d0b200310230c0b0b200441b0016a200441a0026a41047241ec001094041a20042005360238200441386a410472200441b0016a41ec001094041a02402002450d00200310230b200441003602a802200442013703a002200441386a200441a0026a103920042802a8022103024020042802a402450d0020042802a00210230b42002107200441a0026a41086a22024200370300200442003703a002418bcec200411b200441a0026a1000200441b0016a41086a22052002290300370300200420042903a0023703b00102400240200441b0016a411041a886c500410041001001417f460d00200442003703a802200442003703a002200441b0016a4110200441a0026a4110410010012209417f460d072009410f4d0d07200441a8026a290300210620042903a002210a0c010b4200210a420021060b20024200370300200442003703a00241a6cec200411b200441a0026a100020052002290300370300200420042903a0023703b00102400240200441b0016a411041a886c500410041001001417f460d00200442003703a802200442003703a002200441b0016a4110200441a0026a4110410010012202417f460d082002410f4d0d08200441a8026a290300210b20042903a00221070c010b4200210b0b2001412c6a2802002202290310220c200241186a290300220d844200510d07200441186a2007200b2003ad4200109804200441086a20042903182207200a7c220a200441186a41086a29030020067c200a200754ad7c200c200d10970420024200200229030822062004290308427f200441086a41086a290300501b7d220720072006562007507222031b37030802402003450d00200441386a10240c0b0b20012802002102200441b0016a200441386a41f0001094041a200441b8026a2002280218220241e4006a290000370300200441b0026a200241dc006a290000370300200441a0026a41086a200241d4006a2900003703002004200229004c3703a002200441c0026a200441b0016a41f0001094041a2002413c6a22032802002201200241386a280200470d09200141016a22052001490d0320014101742209200520052009491b2205ad4290017e2207422088a70d032007a722094100480d03024002402001450d00200241346a28020020014190016c200910272201450d010c0a0b2009102622010d090b20094108102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b41c8adc400104f000b200241386a2005360200200241346a20013602002002413c6a28020021010b200241346a28020020014190016c6a200441a0026a4190011094041a2003200328020041016a360200410421020c010b410521020b20002002360200200441b0036a24000b1600200041003602002000200141086a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141086a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128022429034042002005ad4200109804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510102202417e460d0020020d04410421030b20002003360200200441106a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41e8f7c400104f000b1600200041003602002000200141206a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141206a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021821082004200128022429034042002005ad4200109804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510102202417e460d0020020d04410421030b20002003360200200441106a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41e8f7c400104f000be50f04047f027e0d7f017e230041a0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d03200241246a2802002105200241346a2802002106024002400240200241146a2802002207450d0020022802042103200441c0006a200128022429033842002007ad4200109804200128022c2202420020022903082208427f200429034020042903484200521b7d220920092008562009507222021b3703084105210a20020d1920074100480d1220071026220b450d07200b210c41002102024020074102490d00200b41002007417f6a220210930420026a210c0b200c41003a000020012802282802082003200b200241016a220c100e2202417e460d0f20020d08200b450d192004200c3602542004200b360250200441386a200441d0006a10452004280238450d0f200428023c220dad2209421b88a70d092009420586a72202417f4c0d092002450d0120021026220e450d0a200d450d020c0b0b4101210e4100210c410021130c100b4101210e200d0d090b4100210c41002113200e450d0b0c090b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b20074101102a000b41d8f6c400104f000b101d000b20024101102a000b2004280250210f20042802542103410021104100211141002112200d21130340200441d8006a2003412020034120491b22026a41004100412020026b2002411f4b1b1093041a200441d8006a200f20021094041a2004200f20026a220f360250200320026b21142003411f4d0d02201241016a210c20044180016a41186a2203200441d8006a41186a29000037030020044180016a41106a2215200441d8006a41106a29000037030020044180016a41086a2216200441d8006a41086a2900003703002004200429005837038001024020122013470d002010200c200c2010491b2213ad4205862209422088a70d082009a722024100480d0802402012450d00200e201120021027220e0d010c070b20021026220e450d060b200e20116a2202200429038001370000200241186a2003290300370000200241106a2015290300370000200241086a2016290300370000201041026a2110201141206a211120142103200c2112200c200d490d000b20042014360254200e450d020b02402007450d00200b10230b200c200141246a28020028024c4d0d040c0a0b200420143602542013450d00200e10230b2007450d0a0b200b10230c090b20024101102a000b200e200c41004120200c676b108e010240200c4102490d00200e2102200c210303402002200241206a22074120109604450d07200721022003417f6a220341014b0d000b0b200441286a200128022429033842002006ad22174200109804200128022c2202420020022903082208427f200429032820042903304200521b7d220920092008562009507222021b37030820020d05024002402006450d0020064100480d02200610262202450d044101210720022103024020064102490d00200241002006417f6a220310930420036a2103200621070b200341003a00000c010b4100210641012102410021070b024002402001280228280208200520022007100e2203417e460d0020030d032002450d07200441086a200141246a28020022122903284200200cad4200109804200441186a20122903204200201742001098042001412c6a2802002103427f2109024020042903204200520d0020042903104200520d002004290318220820042903087c22172008540d00427f201720122903307c220920092017541b21090b200342002003290308220820097d220920092008562009507222121b3703082012450d010b2006450d06200210234105210a20130d070c080b20044180016a41186a22112001280200280218220341e4006a29000037030020044180016a41106a220a200341dc006a29000037030020044180016a41086a220f200341d4006a2900003703002004200329004c37038001200341306a221228020022012003412c6a280200470d04200141016a22102001490d002001410174220b20102010200b491b2210ad42e8007e2209422088a70d002009a7220b4100480d00024002402001450d00200341286a280200200141e8006c200b10272201450d010c050b200b102622010d040b200b4108102a000b101e000b41d8f6c400104f000b20064101102a000b2003412c6a2010360200200341286a2001360200200341306a28020021010b200341286a280200200141e8006c6a2203200429038001370001200341053a0000200341096a200f290300370000200341116a200a290300370000200341196a2011290300370000200341216a20042f00503b0000200341236a200441d2006a2d00003a00002003412c6a2007360000200341286a2006360000200341246a2002360000200341d0006a200441f8006a290300370300200341c8006a200441d8006a41186a290300370300200341c0006a200441d8006a41106a290300370300200341386a200441d8006a41086a290300370300200341306a2004290358370300200341e0006a200c360200200341dc006a20133602002003200e3602582012201228020041016a3602004104210a0c020b4105210a2013450d010b200e10230b2000200a360200200441a0016a24000bb80a03027f027e057f230041a00c6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b3703084105210820030d09024002402002450d0020024100480d05200210262203450d06410121092003210a024020024102490d00200341002002417f6a220910930420096a210a200221090b200a41003a00000c010b4100210241012103410021090b0240024002402001280228280208200520032009100e2205417e460d0020050d052003450d0c200442003703a801200442003703a001200441a0016a20032009411020094110491b1094041a2009410f4d0d00200441a8016a290300210720042903a001210602402002450d00200310230b2001280200280218220328020c0d082003410c6a417f36020020044180016a200341e4006a290000370300200441e8006a41106a200341dc006a290000370300200441f0006a200341d4006a2900003703002004200329004c370368200341106a220b280200220141f098c400460d01200341146a280200210a0c020b2002450d0b200310230c0b0b41880b10262201450d074100210a200141003b010620014100360200200141086a200441a0016a41800b1094041a200341146a4100360200200341106a20013602000b02400240034020012f0106220c410574210541002102417f2108024002400240034020052002460d01200841016a2108417f4101200441e8006a200120026a41086a412010960422094100481b410020091b2209450d05200241206a210220094101460d000b200a0d010c020b200c2108200a450d010b200a417f6a210a200120084102746a41880b6a28020021010c010b0b200441106a41186a200441e8006a41186a290300370300200441106a41106a200441e8006a41106a290300370300200441106a41086a200441e8006a41086a29030037030020042004290368370310200341186a21024100210a41000d010c090b200341186a21024101450d080b200441b8016a4200370300200441b4016a41f098c400360200200441003602c001200441003602b001200442003703a801200441f098c4003602a401200441003602a0012001200841e0006c6a41e8026a2102200441a0016a10b5010c080b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b10e601000b41880b4108102a000b20044184016a200441106a41086a2903003702002004418c016a200441106a41106a29030037020020044194016a200441106a41186a29030037020020042002360278200420083602742004200b3602702004200136026c2004200a3602682004200429031037027c200441d4016a4200370200200441c0016a2004290358370300200441c8016a200441d8006a41086a290300370300200441dd016a2004290035370000200441e5016a200441356a41086a290000370000200441ed016a200441356a41106a290000370000200441f5016a200441356a41186a290000370000200441fc016a200441d4006a280000360000200442003703b801200442003703a001200441f098c4003602d001200441003a00dc01200441e8006a200441a0016a10b40121020b200241286a2007370300200241206a2006370300200242013703182003410c6a2202200228020041016a360200410421080b20002008360200200441a00c6a24000bda03020b7f027e230041206b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120109604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d00200641186a280200220d450d00200641286a290300210f200641206a29030021100c010b200441086a2005411c6a2802002007200541206a280200280214110400200441186a290300210f200528020c2108200429031021102004280208210d0b2005410c6a2008417f6a360200411010262206450d0120062010427f200d1b3700002006200f427f200d1b37000802402001411c6a220d280200450d00200141186a28020010230b20004104360200200d42908080808002370200200141186a2006360200200441206a24000f0b10e401000b41104101102a000bff0203027f027e037f230041206b22042400024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222081b37030841052103024020080d00024002402002450d0020024100480d06200210262208450d07410121092008210a024020024102490d00200841002002417f6a220910930420096a210a200221090b200a41003a00000c010b4100210241012108410021090b02402001280228280208200520082009100e2201417e460d0020010d042008450d01200441106a2008200910a501024020042802100d002004280214200441186a280200100f0b410421030b2002450d00200810230b20002003360200200441206a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b870603027f017e087f230041c0006b220424002004200136020c2004200041a886c50020011b3602082004200441086a104502400240024002400240024002402004280200450d000240024002400240024020042802042205ad2206421c88a70d002006420486a72201417f4c0d00024002402001450d00200110262207450d032005450d010c040b4108210720050d030b410021014100210b2007450d050c030b101d000b20014108102a000b200441206a4104722108410021094100210a410021002005210b0340200441206a200441086a10d001200441306a41086a220c200841086a280200360200200420082902003703302004280220220d4104460d02200041016a2101200441106a41086a220e200c2802003602002004200429033037031002402000200b470d002009200120012009491b220bad4204862206422088a70d052006a7220c4100480d0502402000450d002007200a200c102722070d010c070b200c10262207450d060b2007200a6a2200200d3602002000410c6a200e280200360200200041046a2004290310370200200941026a2109200a41106a210a2001210020012005490d000b2007450d020b200441206a20022007200120031105002004410036023820044201370330200428022021004101102621010240024020004105470d002001450d06200141013a0000200442818080801037023420042001360230420121060c010b2001450d06200141003a000020044281808080103702342004200136023020014101410210272101024020004104470d002001450d08200141003a0001200442828080802037023420042001360230420221060c010b2001450d08200141013a0001200442828080802037023420042001360230200441206a200441306a10d302200441386a3502002106200428023021010b2001ad42208620068421060240200b450d00200710230b200441c0006a240020060f0b200b450d00200710230b41f19bc30041f0001021000b101e000b200c4108102a000b41014101102a000b41014101102a000b41024101102a000b41024101102a000bcb0401057f230041106b22022400200241003a0008200241086a200128020022032001280204220441004722051094041a024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002402004450d0020022d0008417f6a220441034b0d04024020040e0400030204000b20024100360208200241086a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d052000200228020836020420004100360200200241106a24000f0b20004104360200200241106a24000f0b20024100360208200241086a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d042000200228020836020420004102360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004101360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004103360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b200520041048000bb10201027f200128023021030240024002400240200241ff017122024103470d0020030d0320004100360200200128020c22000d010c020b200141346a2802002104024020024102470d002003450d00200141386a2802002102200041013602002000410c6a2002360200200041086a2004360200200041046a2003360200200128020c22000d010c020b20004102360200200041086a4110360200200041046a41c8b3c10036020002402003450d002004450d00200310230b200128020c2200450d010b200141106a280200450d00200010230b02402001411c6a280200450d00200128021810230b200128022822012001280200417f6a22003602000240024020000d002001280208100620012001280204417f6a22003602042000450d010b0f0b200110230f0b41d8b3c100104f000b0a004198abc100104f000bbf0303027f017e027f02402001450d000340200028026c21002001417f6a22010d000b0b4100210341002101024003402002450d010240200120002f01064f0d0020014103742104200141016a21012002417f6a2102200020046a41146a290200a74103470d010c020b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010232005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110232005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41f0006a2802002100200420074103746a41146a2902002105024020064101460d00410120066b21010340200028026c2100200141016a22010d000b0b410021012002417f6a21022005a74103470d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002104200110232004450d00024020042802002201450d000340200410232001210420012802002200210120000d000b0b200410230b0b9203010e7f230041b0016b22012400200141086a200010b001024020012903284202510d00200141e0006a2102200141dc006a2103200141d8006a2104200141a4016a2105200141a0016a21062001419c016a210720014198016a210820014190016a210903402002280200210a2004280200210b024002402003280200220c450d00200c210d200b210e0340200e2802ec03210e200d417f6a220d0d000b0340200b200b2f01064102746a41ec036a280200210b200c417f6a220c0d000c020b0b200b210e0b20014188016a41206a200a3602002005200b2f0106360200200641003602002007200b36020020084100360200200942003703002001200e36028c01200141003602880120014188016a10b501200141086a200010b001200141086a41206a2903004202520d000b0b02402000280204220b41f098c400460d00200b280200210c200b1023200c450d00200c280200210e200c1023200e450d000240200e280200220b450d000340200e1023200b210e200b280200220c210b200c0d000b0b200e10230b200141b0016a24000b9a0304027f017e027f017e230041c0006b2203240002400240411410262204450d00200441106a41002800f9b641360000200441086a41002900f1b641370000200441002900e9b64137000020044114413410272204450d01200420022900003700142004412c6a200241186a290000370000200441246a200241106a2900003700002004411c6a200241086a29000037000042002105200341206a41186a22024200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020044134200341206a1002200341186a2002290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012202417f460d022002410f4d0d02200341286a2903002108200329032021050c010b420021080b200410232000200837030820002005370300200341c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bfb0101057f230041c0006b22052400024002402003450d002003280208210620032802002103200541206a41186a22074200370300200541206a41106a22084200370300200541206a41086a220942003703002005420037032020044120200541206a1002200541186a2007290300370300200541106a2008290300370300200541086a200929030037030020052005290320370300200541003602202003200620054120200541206a100a210420052802202203417f460d012000200336020420002004360200200041086a2003360200200541c0006a24000f0b20004100360200200541c0006a24000f0b20004100360200200541c0006a24000b8b0201057f23004190016b22032400200341086a200210d801024020032d000822024102470d00200041003a000020034190016a24000f0b200341f0006a200341c8006a290300370300200341f8006a2204200341d0006a29030037030020034180016a2205200341d8006a29030037030020034188016a2206200341e0006a2903003703002003200341c0006a29030037036802402002450d00200041003a000020034190016a24000f0b2003413c6a2802002102200341386a280200210720002003290370370001200041013a0000200041196a2006290300370000200041116a2005290300370000200041096a200429030037000002402002450d00200710230b20034190016a24000bce0e06087f047e017f037e017f027e23004180016b220224000240024002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241386a41186a22014200370300200241386a41106a22044200370300200241386a41086a220542003703002002420037033820034137200241386a1002200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033837030802400240024002400240024002400240200241086a412041a886c500410041001001417f460d002002422037022c2002200241086a360228200241003a0038200241086a4120200241386a410141001001210120022002280230200141016a41014b22016a22043602302001450d0720022d003822014101460d0120010d072002200241286a104a2002280200450d0720022802042201417f4c0d0a2001450d02200110ac012206450d0b200241306a22072001410020022802282204200228022c2205200620012007280200100122082008417f461b2208200820014b1b220920072802006a220836020020092001460d030c060b200041023a00000c040b4200210a200241d0006a4200370300200241c8006a4200370300200241386a41086a42003703002002420037033841002105200241286a41086a22064100200241086a4120200241386a41202004100122012001417f461b2201412020014120491b20062802006a360200024002402001411f4d0d002002200228003b36007b20022002280238360278200241c7006a290000210b200229003f210c200229004f210d2002310057210a2002200228007b36007320022002280278360270410121050c010b0b2002200228007336003b200220022802703602382005450d052002200228003b36006b200220022802383602682002200228006b360063200220022802683602602002200228006336003b200220022802603602382002200241dc006a28000036007b20022002280059360278410121010c020b4101210620022802282204200228022c220541014100200241306a280200220810011a41002001470d030b20024100360238200241286a41086a2207410020042005200241386a41042008100122082008417f461b2208410420084104491b20072802006a2209360200200841034d0d0220022802382108200241d0006a4200370300200241c8006a4200370300200241386a41086a4200370300200242003703382007410020042005200241386a412020091001220e200e417f461b220e4120200e4120491b20096a220936020002400240200e411f4d0d002002200228003b36007b20022002280238360278200241c7006a290000210f200229003f2110200229004f211120022d005721072002200228007b360073200220022802783602704101210e0c010b4100210e0b2002200228007336003b20022002280270360238200e450d022002200228003b36006b200220022802383602682002420037034020024200370338200241286a41086a2212410020042005200241386a411020091001220e200e417f461b220e4110200e4110491b20096a2209360200200e410f4d0d02200241386a41086a290300210b2002290338210c200242003703382012410020042005200241386a410820091001220e200e417f461b220e4108200e4108491b20096a2209360200200e41074d0d022002290338210d200241003a0038200241306a200920042005200241386a41012009100141016a41014b220e6a2209360200200e450d020240024020022d0038220e450d00200e4101470d0420024200370338200241286a41086a410020042005200241386a41082009100122042004417f461b2204410820044108491b20096a360200200441074d0d04200229033821134201210a0c010b4200210a0b2001ad221442208620148421142002200228006b360063200220022802683602602002200228006336007b200220022802603602782002200241dc006a28000036003b20022002280059360238410021010b2002200228003b36007320022002280238360270200220022802783602682002200228007b36006b200041106a200b370000200041086a200c370000200041cf006a200f370000200041c7006a2010370000200020013a00002000413c6a2008360000200041346a2014370000200041306a2006360000200041286a2013370000200041206a200a370000200041186a200d370000200041df006a20073a0000200041d7006a201137000020002002280270360001200041046a2002280073360000200041c0006a2002280268360000200041c3006a200228006b3600000b2003102320024180016a24000f0b2001450d00200610230b41d4aac10041331021000b41174101102a000b41374101102a000b101d000b20014101102a000baf0201047f230041c0006b2202240002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002412041a886c500410041001001210120031023200241c0006a24002001417f470f0b41174101102a000b41374101102a000b840102017f037e230041e0006b220324002003200210d8010240024020032d000022024102470d00420021040c010b2002410173ad2104200341106a2903002105200341086a290300210620020d00200341346a280200450d00200341306a28020010230b2000200637030820002004370300200041106a2005370300200341e0006a24000bdb2710067f017e177f017e017f017e047f027e017f047e027f017e027f037e037f017e230041c0046b22022400200241106a4200370300200242003703082002420037030020012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b200241086a2107200241186a411c6a20042f0106360200200241186a41186a4100360200200241186a41146a20043602002002200336023820024100360228200242003703202002200136021c2002410036021820024180016a200241186a10b0010240024002400240024020022903a00122084202520d00200241186a10d4010c010b20024180016a41c0006a210920024180016a41386a210a20024180016a410472210b200241dd016a210c20024180016a41086a2103200241e0026a41386a210d20024180016a41306a210e20024180016a41286a210f200241c8016a2110200241d0016a211120024180016a41d8006a2112200241dc016a211320024180016a411c6a211420024180016a41146a211520024180016a41346a2116200241b8036a41206a2217410f41edccc2006b41f5ccc2006a200241b8036a6b6a2118200241e0026a412c6a2119200241a4016a211a200241bc016a211b0340200241e0006a41186a220420024180016a41186a2221290300370300200241e0006a41106a220120024180016a41106a2223290300370300200241e0006a41086a22052003290300370300200241c0006a41086a2206200c41086a290000370300200241c0006a41106a2231200c41106a290000370300200241c0006a41186a2232200c41186a29000037030020022002290380013703602002200c290000370340200e290300212c200f290300212d2010290300213320092903002134200a2903002130201129030021352012280200213620132d0000213720024180026a41186a2229200429030037030020024180026a41106a2238200129030037030020024180026a41086a220120052903003703002002200229036037038002200241a0026a41186a22042032290300370300200241a0026a41106a22322031290300370300200241a0026a41086a22312006290300370300200220022903403703a00202400240024002400240024020084201520d0020024180016a20024180026a202d202c10dc01202329030021392003290300212d20212d00002105200229038001212a200241106a22062903002108200241086a222e290300212c02400240024002400240024020022903004201520d00202a4200510d01427f200820397c202c202d7c222d202c542226ad7c222c2026202c200854202c2008511b22261b212a427f202d20261b212b0c040b202a4200510d01202c202d56200820395620082039511b450d02200820397d202c202d54ad7d212a202c202d7d212b420021080c040b203920087d202d202c54ad7d200820397d202c202d54ad7d202d202c562039200856203920085122261b22251b212a202d202c7d202c202d7d20251b212b202d202c58203920085820261bad21080c030b427f200820397c202c202d7c222d202c542226ad7c222c2026202c200854202c2008511b22261b212a427f202d20261b212b420021080c020b203920087d202d202c54ad7d212a202d202c7d212b0b420121080b2006202a370300202e202b37030020022008370300200541ff01710d010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020360d0020304201510d00203741ff01714101460d002035a721042035422088a72201450d01410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c030b0b20024180016a20024180026a10d80120022d00800122054103714102460d0220054101470d0320050d132016280200450d13200e28020010232035a721042035422088a722010d140c150b200421010b20024180016a41206a4100360200201420042f0106360200202141003602002015200436020020234100360200200342003703002002200136028401200241003602800120024180016a10b5010c150b024020050d002016280200450d00200e28020010230b42022108203741ff01710d010c100b200241c0026a41086a2205200941086a290300370300200241c0026a41106a2206200941106a290300370300200241c0026a41186a222e200941186a290300370300200220092903003703c0022023290300212820032903002127201b280200211c200a280200211d2016280200211e200e280200211f200f29030021202021290300212220024180016a41206a29030022084202520d01203741ff0171450d0f0b200241a0046a41186a22262004290300370300200241a0046a41106a22252032290300370300200241a0046a41086a22242031290300370300200220022903a0023703a004200241b8036a41086a22064200370300200242003703b80341d0c5c200411a200241b8036a100020032006290300370300200220022903b8033703800120024180016a411041a886c500410041001001417f460d01200241003602b80320024180016a4110200241b8036a41044100100141016a41044d0d0820022802b80321050c020b201d417f4c0d0b02400240201d0d00410121010c010b201d10262201450d0d2001201f201d1094041a0b200d20022903c002370300200241e0026a41346a201c360200200241e0026a41306a201d3602002019201d360200200241e0026a41286a2001360200200241e0026a41206a2020370300200241e0026a41106a2022370300200241e0026a41186a2008420151ad222d370300200d41086a2005290300370300200d41106a2006290300370300200d41186a202e290300370300200220273703e002200220283703e802201d212f201d21292022212c2027212a2028212b201c210520304201510d020c030b410021050b20064200370300200242003703b80341b9c5c2004117200241b8036a100020032006290300370300200220022903b803370380010240024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b80342017c212c0c010b4201212c0b20064200370300200242003703b80341b9c5c2004117200241b8036a100020032006290300370300200220022903b803370380012002202c3703b80320024180016a4110200241b8036a4108100441201026222e450d06202e200229038002370000202e41186a2029290300370000202e41106a2038290300370000202e41086a2001290300370000202e412041c00010272229450d072029202c37002020214200370300202342003703002003420037030020024200370380012029412820024180016a1002200241b8036a41186a2021290300370300200241b8036a41106a20232903003703002006200329030037030020022002290380013703b803413710262201450d08200142bac6a1cbc68dd9aff300370000200142f4dec98bf6ac999de400370008200141e5cc85ab07360010200141ece8013b00142001413a3a0016200120022903b803370017200120022903c00337001f200120022802c803360027200120022f01cc033b002b200120022d00ce033a002d200120022d00cf033a002e200120022d00d0033a002f200120022d00d1033a0030200120022d00d2033a0031200120022d00d3033a0032200120022d00d4033a0033200120022d00d5033a0034200120022d00d6033a0035200120022d00d7033a0036202910234200212d20064200370300200242003703b80341af98c300410d200241b8036a100020032006290300370300200220022903b803370380014200212c024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b803212c0b200241e0026a41346a2005360200200241e0026a41306a20183602004137212f20194137360200200241e0026a41286a2001360200200d20022903a004370000200241e0026a41186a4200370300200241e0026a41106a202c370300200d41086a2024290300370000200d41106a2025290300370000200d41186a2026290300370000427f212a2002427f3703e8022002427f3703e00220182129427f212b20304201520d010b200220343703e002200220333703e8022034212a2033212b0b0240203741ff0171450d00200d20022903a002370000200d41186a2004290300370000200d41106a2032290300370000200d41086a20312903003700000b02402036450d0042002139200241b8036a41086a22044200370300200242003703b80341af98c300410d200241b8036a100020032004290300370300200220022903b80337038001024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b80321390b4201212d200241e0026a41186a4201370300200241e0026a41206a20393703000b2035a72104024002402035422088a72206450d00410020066b2231213220042106034020062802ec032106203241016a22320d000b0340200420042f01064102746a41ec036a2802002104203141016a22310d000c020b0b200421060b20042f0106213120172036360200200241b8036a411c6a2031360200200241b8036a41186a22264100360200200241b8036a41146a2004360200200241b8036a41106a22254100360200200241b8036a41086a22244200370300200220063602bc03200241003602b80320024180016a200241b8036a10af0102402002280280014101470d000340200241e0036a41186a2231200b41186a290200370300200241e0036a41106a2232200b41106a290200370300200241e0036a41086a2236200b41086a2902003703002002200b2902003703e003201a2802002104200f280200213820024180016a412c6a280200210620024180046a41186a203129030037030020024180046a41106a203229030037030020024180046a41086a2036290300370300200220022903e00337038004202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a1002200241a0046a41186a22322021290300370300200241a0046a41106a22362023290300370300200241a0046a41086a2237200329030037030020022002290380013703a004200241003602800120012029200241a0046a412020024180016a100a212e02402002280280012231417f460d00200520316b21052031450d00202e10230b024002402004450d00202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a100220322021290300370300203620232903003703002037200329030037030020022002290380013703a00420012029200241a0046a412020042006100b200520066a21052038450d01200410230c010b202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a100220322021290300370300203620232903003703002037200329030037030020022002290380013703a00420012029200241a0046a4120100c0b20024180016a200241b8036a10af012002280280014101460d000b200241e0026a41346a20053602000b200241b8036a10b5012026200241c0026a41186a2903003703002025200241c0026a41106a2903003703002024200241c0026a41086a290300370300200220022903c0023703b803024020084202510d002016201c360200200e201d36020020024180016a412c6a201e360200200f201f36020020024180016a41206a20203703002021200837030020232022370300200a20022903b803370300200a41086a2024290300370300200a41106a2025290300370300200a41186a20262903003703002002202737038001200220283703880141012104024002400240201d2029470d0002400240201f2001460d00201f2001201d1096040d02201c2005470d020c010b201c2005470d010b200a200d41201096040d002027202a852028202b85844200520d002022202c520d002008a72205202da7470d0020054101462020200241e0026a41206a29030052712104201e0d010c020b201e450d010b201f10230b20044102460d0020040d00202f450d0e200110230c0e0b2003200241e0026a41d8001094041a200241003a00800120024180026a20024180016a10dd010c0d0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41204101102a000b41c0004101102a000b41374101102a000b101d000b201d4101102a000b2035a721042035422088a72201450d010b410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c020b0b200421010b20024180016a41206a2036360200201420042f0106360200202141003602002015200436020020234100360200200342003703002002200136028401200241003602800120024180016a10b5010b20024180016a200241186a10b00120024180016a41206a29030022084202520d000b20022903002135200241186a10d401203550450d010b200241086a290300200241106a2903008450450d0220022903004200510d010b200220073602800120024180016a10de01200241c0046a24000f0b200220073602800120024180016a107b200241c0046a24000f0b41b4b8c100104f000b970a03057f037e017f23004190016b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a20082903003703002004200429032037030002400240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012206417f460d022006410f4d0d02200441286a29030021092004290320210a0c010b4200210a420021090b20051023200441206a41086a22054200370300200442003703204182b6c100411b200441206a1000200441086a20052903003703002004200429032037030002402004411041a886c500410041001001417f460d00200442003703282004420037032020044110200441206a4110410010012205417f460d022005410f4d0d02200a2009844200520d002004290320200258200441286a290300220b200358200b2003511b0d0020004200370300200041013a0018200041106a4200370300200041086a420037030020044190016a24000f0b200441206a41086a22054200370300200442003703204182b6c100411b200441206a1000200441086a200529030037030020042004290320370300024002402004411041a886c500410041001001417f460d00200442003703282004420037032020044110200441206a4110410010012205417f460d062005410f4d0d062004290320200258200441286a290300220b200358200b2003511b0d0020012002200310df01410121050c010b411410262205450d06200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d07200520012900003700142005412c6a200141186a220c290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a2008290300370300200420042903203703002004412041a886c50041004100100121062005102302402006417f470d00200110e001200441d8006a2003370300200441d0006a2002370300200441206a41086a41003a0000200441296a2001290000370000200441316a200141086a290000370000200441396a200141106a290000370000200441c1006a200c290000370000200441023a002041a886c5004100200441206a102c0b20012002200310df01410021050b2000200a20027d2002200a7d200a200256200920035620092003511b22011b370308200020053a001820002001ad370300200041106a200920037d200a200254ad7d200320097d2002200a54ad7d20011b37030020044190016a24000f0b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41144101102a000b41344101102a000bd00201047f230041c0006b2202240002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320002900003700172003412f6a200041186a290000370000200341276a200041106a2900003700002003411f6a200041086a290000370000200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1002200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a10b30220031023024020012d00000d00200141346a280200450d00200141306a28020010230b200241c0006a24000f0b41174101102a000b41374101102a000bcd0202047f047e230041206b22012400200141106a41086a220242003703002001420037031041ecb5c1004116200141106a1000200141086a22032002290300370300200120012903103703000240024002402001411041a886c500410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b2000280200220041086a290300210720002903002108200242003703002001420037031041ecb5c1004116200141106a1000200320022903003703002001200129031037030020014200200520077d2006200854ad7d2207200620087d2208200656200720055620072005511b22021b37031820014200200820021b37031020014110200141106a41101004200141206a24000f0b41d4aac10041331021000ba01f05017f017e017f017e067f230041f0016b2203240042002104200341206a41086a22054200370300200342003703204182b6c100411b200341206a1000200341d0016a41086a2005290300370300200320032903203703d0010240024002400240200341d0016a411041a886c500410041001001417f460d002003420037032820034200370320200341d0016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441142107411410262205450d010c030b42002106411421074114102622050d020b20074101102a000b41d4aac10041331021000b200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b641370000024002400240024002400240024002400240024002400240024020052007413410272205450d00200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413420034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200320013703d001200320023703d801200341206a4120200341d0016a41101004200510232004200158200620025820062002511b0d0b411410262205450d02200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d03200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341086a2005413410e101200341086a41106a2903002102200329031021012003280208210a20051023410e10262205450d04200541066a41002900b0b741370000200541002900aab7413700002005410e412e10272205450d052005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a412010032005102302402001200284500d00200a450d0020032001370320200320023703282003200341206a3602d001200341d0016a10de010b410e10262205450d06200541066a4100290094c7403700002005410029008ec7403700002005410e412e10272205450d072005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a200929030037030020032003290390013703d00102400240200341d0016a412041a886c500410041001001417f460d00200341206a41186a4200370300200341206a41106a4200370300200341206a41086a420037030020034200370320200341d0016a4120200341206a4120410010012207417f460d032007411f4d0d03200341b0016a41186a2207200341206a41186a290300370300200341b0016a41106a2208200341206a41106a290300370300200341b0016a41086a2209200341206a41086a290300370300200320032903203703b001200341d0016a4120100320051023200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a2009290300370300200320032903b0013703d001410e10262205450d0a200541066a41002900c6c740370000200541002900c0c7403700002005410e412e10272205450d0b200520032903d00137000e200541266a200341d0016a41186a2903003700002005411e6a200341d0016a41106a290300370000200541166a200341d0016a41086a29030037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023410d2107410d10262205450d010c0c0b20051023410d2107410d102622050d0b0b20074101102a000b41344101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b200541056a41002900ee9c41370000200541002900e99c41370000024002400240024002400240024002400240024020052007412d10272205450d002005200029000037000d200541256a200041186a2900003700002005411d6a200041106a290000370000200541156a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412d20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411210262205450d01200541106a41002f00a6f5403b0000200541086a410029009ef54037000020054100290096f54037000020054112413210272205450d02200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a412010032005102320001085012000108601200341206a200010d801024002400240024020032d00202205410371450d0020054102470d0120050d02200341d4006a280200450d02200341d0006a2802001023411721074117102622050d030c070b200341d4006a2802002105200341d0006a2802002207200341d8006a280200100d2005450d0120071023411721074117102622050d020c060b20050d00200341d4006a280200450d00200341d0006a28020010230b41172107411710262205450d040b2005410f6a41002900abcd42370000200541086a41002900a4cd423700002005410029009ccd4237000020052007413710272205450d04200520002900003700172005412f6a200041186a290000370000200541276a200041106a2900003700002005411f6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413720034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411210262205450d05200541106a41002f00c4ad443b0000200541086a41002900bcad44370000200541002900b4ad4437000020054112413210272205450d06200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411810262205450d07200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0820052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413820034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a2009290300370300200320032903900137032002400240200341206a412041a886c500410041001001417f460d00200342003703d801200342003703d001200341206a4120200341d0016a4110410010012207417f460d012007410f4d0d01200341d8016a290300210220032903d001210141002107200510232001200284504101710d0d0c0b0b41012107200510234100410171450d0a0c0c0b41d4aac10041331021000b412d4101102a000b41124101102a000b41324101102a000b20074101102a000b41374101102a000b41124101102a000b41324101102a000b41184101102a000b41384101102a000b20070d010b200341f0016a24000f0b02400240411310262205450d002005410f6a41002800a99943360000200541086a41002900a299433700002005410029009a994337000020054113413310272205450d01200520002900003700132005412b6a200041186a2207290000370000200541236a200041106a22082900003700002005411b6a200041086a220929000037000020034190016a41186a220a420037030020034190016a41106a220b420037030020034190016a41086a220c420037030020034200370390012005413320034190016a1002200341206a41186a200a290300370300200341206a41106a200b290300370300200341206a41086a220a200c2903003703002003200329039001370320200341206a4120100320051023200a41013a0000200341296a2000290000370000200341316a2009290000370000200341396a2008290000370000200341c1006a2007290000370000200341023a002041a886c5004100200341206a102c200341f0016a24000f0b41134101102a000b41334101102a000b950803037f017e077f23004190016b22012400200141206a41086a220242003703002001420037032041f5a7c4004113200141206a1000200141106a41086a2002290300370300200120012903203703104100210202400240024002400240200141106a411041a886c500410041001001417f460d0020014100360220200141106a4110200141206a41044100100141016a41044d0d01200128022021020b412010262203450d01200320002900002204370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a29000037000020032d0001210520031023200141106a20054108742004a7220341c0017172410676220510870102400240024002402003413f71220320012802184f0d002001200128021020034105746a220310342001290300200141086a290300844200510d010b02402001280214450d00200128021010230b200141206a2002108701024020012802282203413f4d0d00200141286a21050340200241016a210202402001280224450d00200128022010230b200141206a20021087012005280200220341c0004f0d000b0b2001280220210620012802242107200141206a41186a2208200041186a290000370300200141206a41106a2209200041106a290000370300200141206a41086a220a200041086a29000037030020012000290000370320200341016a210520072003470d0620034101742207200520052007491b2207ad4205862204422088a70d052004a7220b4100480d052003450d0120062003410574200b10272206450d020c060b20032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a290000370000200141206a41086a200141106a41086a280200360200200120012903103703202005200141206a10b50320014190016a24000f0b200b102622060d040b200b4101102a000b41d4aac10041331021000b41204101102a000b101e000b200320024106746a210b200620034105746a22032001290320370000200341186a2008290300370000200341106a2009290300370000200341086a200a2903003700000240200541c000470d00200141206a41086a220342003703002001420037032041f5a7c4004113200141206a1000200141106a41086a2003290300370300200120012903203703102001200241016a360220200141106a4110200141206a410410040b2001200536022820012007360224200120063602202002200141206a10b503200141206a41086a2000290000370300200141206a41106a200041086a290000370300200141206a41186a200041106a290000370300200141c0006a200041186a2900003703002001200b360224200141013a002041a886c5004100200141206a102c20014190016a24000b980204017f017e037f027e230041c0006b2203240042002104200341206a41186a22054200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020012002200341206a1002200341186a2005290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012201417f460d022001410f4d0d02200341286a290300210820032903202109200341201003420121040c010b0b2000200437030020002009370308200041106a2008370300200341c0006a24000f0b41d4aac10041331021000b972403027f027e0a7f230041b00d6b2208240002402001280224200128024022092802b001470d00200041013a0000200041086a4124360200200041046a41ebbcc400360200200841b00d6a24000f0b200442002004290308220a200941a8016a2903007d220b200b200a56200b507222091b37030802402009450d00200041013a0000200041086a412a360200200041046a418fbdc400360200200841b00d6a24000f0b200841b0026a41186a22094200370300200841b0026a41106a220c4200370300200841b0026a41086a220d4200370300200842003703b00220062007200841b0026a1002200841c0016a41186a2009290300370300200841c0016a41106a200c290300370300200841c0016a41086a200d290300370300200820082903b0023703c0010240024002400240024002400240024002400240024002400240412010262209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c00010272209450d01200920082903c001370020200941386a200841c0016a41186a290300370000200941306a200841c0016a41106a290300370000200941286a200841c0016a41086a290300370000200941c00041800110272209450d022009200141cc006a220e290000370040200941d8006a200e41186a290000370000200941d0006a200e41106a290000370000200941c8006a200e41086a290000370000200841b0026a41186a220c4200370300200841b0026a41106a220d4200370300200841b0026a41086a220f4200370300200842003703b002200941e000200841b0026a1002200841086a41186a200c290300370300200841086a41106a200d290300370300200841086a41086a200f290300370300200820082903b00237030820091023200841cc006a41bcbbc400360200200841386a41086a420037030020082001410c6a2210360248200841f098c40036023c20084100360238200841a0016a41186a200541186a290000370300200841a0016a41106a200541106a290000370300200841a0016a41086a200541086a29000037030020084101360238200820052900003703a0012010200841086a10ea01210920082008280238417f6a220c360238024002400240024002402009450d00200841386a410c6a2802002109200841386a41086a2802002105200828023c2101200041086a412a360200200041046a419eb3c100360200200041013a00002005450d012005210420012100034020002802880b21002004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012005417f6a22050d000c030b0b200c0d082008417f360238200841c0016a41186a200841086a41186a290300370300200841c0016a41106a200841086a41106a290300370300200841c0016a41086a200841086a41086a290300370300200820082903083703c001200828023c220c41f098c400460d02200841386a41086a28020021110c030b200121000b200841cc026a20012f0106360200200841c8026a4100360200200841c4026a2001360200200820093602d002200841003602c002200842003703b802200820003602b402200841003602b002200841b0026a10d401200841b00d6a24000f0b41880b1026220c450d0641002111200c41003b0106200c4100360200200c41086a200841b0026a41800b1094041a200841386a41086a41003602002008200c36023c0b200841386a4104722112024002400340200c2f01062213410574211441002109417f210d024002400240034020142009460d01200d41016a210d417f4101200841c0016a200c20096a41086a4120109604220f4100481b4100200f1b220f450d05200941206a2109200f4101460d000b20110d010c020b2013210d2011450d010b2011417f6a2111200c200d4102746a41880b6a280200210c0c010b0b200841d0006a41186a2209200841c0016a41186a290300370300200841d0006a41106a220f200841c0016a41106a290300370300200841d0006a41086a2214200841c0016a41086a290300370300200820082903c001370350200841dc016a2014290300370200200841e4016a200f290300370200200841ec016a20092903003702002008200841c4006a3602d0012008200d3602cc01200820123602c8012008200c3602c401200841003602c001200820082903503702d401200841e4026a4200370200200841003a00ec02200842003703b002200841f098c4003602e002200842003703c802200841c0016a200841b0026a10b40121090c010b200c200d41e0006c6a41e8026a21090b200941013a003c200941286a427f370300200941206a427f3703002009413d6a20082903a001370000200941d5006a200841a0016a41186a290300370000200941cd006a200841a0016a41106a220c290300370000200941c5006a200841a0016a41086a220d290300370000200942013703182008200828023841016a360238200c200841386a41106a290300370300200d200841386a41086a290300370300200820082903383703a001200841d0006a41186a2214200841086a41186a290300370300200841d0006a41106a2211200841086a41106a290300370300200841d0006a41086a2213200841086a41086a29030037030020082008290308370350200841c0016a200841d0006a10d8014100210f0240024020082d00c00122124102470d000c010b200841f8016a280200210920120d002009417f4c0d07200841f4016a2802002115200841f0016a2802002112024002402009450d0020091026220f450d0b200f201220091094041a20150d010c020b4101210f2015450d010b201210230b200841b0026a41086a200936020020084184036a20132903003702002008418c036a201129030037020020084194036a2014290300370200200841c4026a200d290300370200200841cc026a200c290300370200200820093602b4022008200f3602b002200820082903503702fc02200820082903a0013702bc02200141246a2802002109200141c0006a290200210b2001280248210c200841e8026a4200370300200841e0026a428080808080013703002008200c3602f8022008200b3703f002200842083703d8022008200941016a3602d402200820044101200e200841086a20022003200841b0026a10bc03024020082802002209450d0020082802042101200041013a0000200041086a2001360200200041046a200936020020082802b00222010d0c0c0d0b200841c0016a2005200141c8006a28020028020010c402024020082802c0014101470d00200041046a20082902c401370200200041013a00000c0b0b200841a0016a41186a2205200841c0016a410472220941186a280200360200200841a0016a41106a220c200941106a290200370300200841a0016a41086a220d200941086a290200370300200820092902003703a001200841d0006a41106a200d290300370300200841d0006a41186a200c290300370300200841f0006a200528020036020020084106360254200841e5c4c400360250200820082903a001370358200141c4006a28020021092005200141e4006a290000370300200c200141dc006a290000370300200d200141d4006a2900003703002008200129004c3703a0014200210b20084188016a41086a220e4200370300200842003703880141a298c300410d20084188016a1000200841a0026a41086a200e29030037030020082008290388013703a0020240200841a0026a411041a886c500410041001001417f460d002008420037038801200841a0026a411020084188016a41084100100141016a41084d0d04200829038801210b0b200841e4016a200d290300370200200841ec016a200c290300370200200841f4016a2005290300370200200820023703c0012008200b3703d001200820033703c801200820082903a0013702dc012008200841b0026a3602d801200841003602a801200842013703a001200841f8006a2009200841d0006a200841c0016a20062007200841a0016a200410b70102400240200828027822054101460d0020054102470d01200041046a200829027c370200200041013a0000200841e8006a280200450d0c200841e4006a280200102320082802b00222010d0d0c0e0b20084180016a280200450d00200828027c10230b200841c0016a41186a200141cc006a220541186a290000370300200841c0016a41106a200541106a290000370300200841c0016a41086a200541086a290000370300200841a0016a41086a200841086a41086a290300370300200841a0016a41106a200841086a41106a290300370300200841a0016a41186a200841086a41186a290300370300200820052900003703c001200820082903083703a0010240024002400240200841e0026a2802002205200841dc026a280200470d00200541016a22042005490d0b20054101742209200420042009491b2209ad42e8007e220b422088a70d0b200ba7220c4100480d0b2005450d01200841d8026a280200200541e8006c200c102722040d020c0d0b200841d8026a28020021040c020b200c10262204450d0b0b200841dc026a2009360200200841d8026a2004360200200841e0026a28020021050b2004200541e8006c6a220520082903c001370001200541013a0000200541096a200841c0016a41086a2204290300370000200541116a200841c0016a41106a290300370000200541196a200841c0016a41186a290300370000200541216a20082903a001370000200541296a200841a0016a41086a290300370000200541316a200841a0016a41106a290300370000200541396a200841a0016a41186a290300370000200541c1006a200829008801370000200541c9006a20084188016a41086a290000370000200541d0006a20084197016a290000370000200541e0006a410036020020054201370358200841e0026a2205200528020041016a22093602002004200841bc026a220541086a290200370300200841286a41086a200841cc016a280200360200200820052902003703c001200820082902c401370328200841ec026a280200210c200841e8026a2802002106200841e4026a2802002105200841dc026a2802002107200841d8026a28020021040240200841d0006a41186a280200450d00200841e4006a28020010230b024020082802b002220d450d0020082802b402450d00200d10230b200841c0016a41086a220d200841286a41086a280200360200200820082903283703c001200841b0026a41086a200d280200360200200820082903c0013703b0022010200841b0026a10ec0120082004200941e8006c6a3602bc02200820043602b802200820073602b402200820043602b002200141286a200841b0026a10a20220082005200c4190016c6a3602bc02200820053602b802200820063602b402200820053602b002200141346a200841b0026a10a102200041003a0000200041196a200841206a290300370000200041116a200841186a290300370000200041096a200841086a41086a29030037000020002008290308370001200841b00d6a24000f0b41204101102a000b41c0004101102a000b4180014101102a000b41d4aac10041331021000b10e601000b41880b4108102a000b101d000b101e000b20094101102a000b200c4108102a000b20082802b0022201450d010b20082802b402450d00200110230b200841b0026a41186a2802002109200841c0026a280200210102400240200841b0026a41146a2802002200450d002000210420012105034020052802880b21052004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012000417f6a22000d000c020b0b200121050b200841dc016a20012f0106360200200841c0016a41186a4100360200200841c0016a41146a2001360200200820093602e001200841003602d001200842003703c801200820053602c401200841003602c001200841c0016a10d4010240200841e0026a2802002205450d00200841b0026a41286a2802002101200541e8006c210503400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200541987f6a22050d000b0b0240200841dc026a280200450d00200841d8026a28020010230b0240200841ec026a2802002201450d0020014190016c2105200841e4026a28020041206a210103402001102420014190016a2101200541f07e6a22050d000b0b0240200841e8026a280200450d00200841e4026a28020010230b200841b00d6a24000bc718012e7f230041b00d6b220324002003200236020420032001360200200341086a10d40202400240024002400240024002400240200328020c2204450d0020032802102105200341086a410c6a2802002202450d0120032c00082101200341086a410041e00c1093041a200441206a2106200420024105746a2107200341900d6a41086a2108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021234100212441002125410021264100212741002128200421294100212a41d100212b02400340202a212c024002400240024002402001450d0020072004460d012001417f7321022029210102400340024020012007460d002001212d200141206a22292101200241016a22020d010c020b20062129200621012004212d200241016a22020d000b0b202d0d040c060b20292007460d012029212d202941206a21290c030b20292007460d042001417f7321010340200141016a2201450d022007202941206a2229470d000c050b0b20072004460d03200621292004222d0d010c030b2029212d202941206a2129202d450d020b2003280204212e2003280200212f20084100360200200342013703900d410110262201450d072001202c3a000020034281808080103702940d200320013602900d2003202e36028c0d2003418c0d6a200341900d6a1041024002400240024020032802940d22022008280200222a6b202e4f0d00202a202e6a2201202a490d0a20024101742230200120012030491b22304100480d0a2002450d0120032802900d20022030102722010d020c0c0b20032802900d21010c020b203010262201450d0a0b200320303602940d200320013602900d203021020b2008202a202e6a22303602002001202a6a202f202e1094041a0240024002400240200220306b411f4b0d00203041206a222e2030490d0a2002410174222a202e202e202a491b222e4100480d0a2002450d0120012002202e102722010d020c0d0b2002212e0c020b202e10262201450d0b0b2003202e3602940d200320013602900d0b200120306a2202202d290000370000200241186a202d41186a290000370000200241106a202d41106a290000370000200241086a202d41086a290000370000200341900d6a41186a22024200370300200341900d6a41106a222d420037030020084200370300200342003703900d2001203041206a200341900d6a1002200341e80c6a41186a22302002290300370300200341e80c6a41106a2202202d290300370300200341e80c6a41086a222d2008290300370300200320032903900d3703e80c0240202e450d00200110230b202b417f6a212b202c41016a212a200341086a202c4103704105746a220120032903e80c370000200141186a2030290300370000200141106a2002290300370000200141086a202d290300370000410021024100212e02400340202c202c41036e222d417d6c6a4102470d01200341086a20026a220141df006a2d000022092001411f6a2d0000220a712009200a722001413f6a2d000071722126200141de006a2d000022092001411e6a2d0000220a712009200a722001413e6a2d000071722125200141dd006a2d000022092001411d6a2d0000220a712009200a722001413d6a2d000071722124200141dc006a2d000022092001411c6a2d0000220a712009200a722001413c6a2d000071722123200141db006a2d000022092001411b6a2d0000220a712009200a722001413b6a2d000071722122200141da006a2d000022092001411a6a2d0000220a712009200a722001413a6a2d000071722121200141d9006a2d00002209200141196a2d0000220a712009200a72200141396a2d000071722120200141d8006a2d00002209200141186a2d0000220a712009200a72200141386a2d00007172211f200141d7006a2d00002209200141176a2d0000220a712009200a72200141376a2d00007172211e200141d6006a2d00002209200141166a2d0000220a712009200a72200141366a2d00007172211d200141d5006a2d00002209200141156a2d0000220a712009200a72200141356a2d00007172211c200141d4006a2d00002209200141146a2d0000220a712009200a72200141346a2d00007172211b200141d3006a2d00002209200141136a2d0000220a712009200a72200141336a2d00007172211a200141d2006a2d00002209200141126a2d0000220a712009200a72200141326a2d000071722119200141d1006a2d00002209200141116a2d0000220a712009200a72200141316a2d000071722118200141d0006a2d00002209200141106a2d0000220a712009200a72200141306a2d000071722117200141cf006a2d000022092001410f6a2d0000220a712009200a722001412f6a2d000071722116200141ce006a2d000022092001410e6a2d0000220a712009200a722001412e6a2d000071722115200141cd006a2d000022092001410d6a2d0000220a712009200a722001412d6a2d000071722114200141cc006a2d000022092001410c6a2d0000220a712009200a722001412c6a2d000071722113200141cb006a2d000022092001410b6a2d0000220a712009200a722001412b6a2d000071722112200141ca006a2d000022092001410a6a2d0000220a712009200a722001412a6a2d000071722111200141c9006a2d00002209200141096a2d0000220a712009200a72200141296a2d000071722110200141c8006a2d00002209200141086a2d0000220a712009200a72200141286a2d00007172210f200141c7006a2d00002209200141076a2d0000220a712009200a72200141276a2d00007172210e200141c6006a2d00002209200141066a2d0000220a712009200a72200141266a2d00007172210d200141c5006a2d00002209200141056a2d0000220a712009200a72200141256a2d00007172210c200141c4006a2d00002209200141046a2d0000220a712009200a72200141246a2d00007172210b200141c3006a2d00002209200141036a2d0000220a712009200a72200141236a2d00007172210a200141c2006a2d00002209200141026a2d00002227712009202772200141226a2d000071722109200141c1006a2d00002227200141016a2d00002228712027202872200141216a2d000071722127200141c0006a2d0000222820012d00002230712028203072200141206a2d000071722128200241800c460d01200341086a2002202d410574202c41096e41e0006c6b6a6a220141ff006a20263a0000200141fe006a20253a0000200141fd006a20243a0000200141fc006a20233a0000200141fb006a20223a0000200141fa006a20213a0000200141f9006a20203a0000200141f8006a201f3a0000200141f7006a201e3a0000200141f6006a201d3a0000200141f5006a201c3a0000200141f4006a201b3a0000200141f3006a201a3a0000200141f2006a20193a0000200141f1006a20183a0000200141f0006a20173a0000200141ef006a20163a0000200141ee006a20153a0000200141ed006a20143a0000200141ec006a20133a0000200141eb006a20123a0000200141ea006a20113a0000200141e9006a20103a0000200141e8006a200f3a0000200141e7006a200e3a0000200141e6006a200d3a0000200141e5006a200c3a0000200141e4006a200b3a0000200141e3006a200a3a0000200141e2006a20093a0000200141e1006a20273a0000200141e0006a20283a0000200241e0006a2102202d212c202e41016a222e4111490d000b0b41002101202b0d000b0b200020263a001f200020253a001e200020243a001d200020233a001c200020223a001b200020213a001a200020203a00192000201f3a00182000201e3a00172000201d3a00162000201c3a00152000201b3a00142000201a3a0013200020193a0012200020183a0011200020173a0010200020163a000f200020153a000e200020143a000d200020133a000c200020123a000b200020113a000a200020103a00092000200f3a00082000200e3a00072000200d3a00062000200c3a00052000200b3a00042000200a3a0003200020093a0002200020273a0001200020283a000020050d020c030b41012104410021050b20004200370000200041186a4200370000200041106a4200370000200041086a42003700002005450d010b200410230b200341b00d6a24000f0b101e000b41014101102a000b20304101102a000b202e4101102a000b7601017f230041c0006b220024002000411836020c200041c8b7c100360208200041346a4120360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000bfd0401137f02400240200128020022054100480d00200541ffffffff07460d002001200541016a360200200141046a2106200141086a28020021070c010b10e401000b410021050340024002400240024002400240024002400240024020050e020001010b2006280200220841086a210920082f0106220a410574210b417f21050240024002400340200b450d01200541016a2105417f4101200220094120109604220c4100481b4100200c1b220c450d03200b41606a210b200941206a2109200c4101460d000b20070d010c040b200a21052007450d030b2007417f6a2107200820054102746a41880b6a2106410021050c0a0b200841e8026a200541e0006c6a2205450d01200541306a210d200541346a280200210e4108210f41052110417f21114102211241ec032113412021144100211541012116416021170c080b200d2802002208200f6a210920082f0106220d201074210b417f21050240024002400340200b450d01200520166a210520112016200420092014109604220c2015481b2015200c1b220c450d03200b20176a210b200920146a2109200c2016460d000b200e0d010c030b200d2105200e450d020b200e20116a210e200820052012746a20136a210d410121050c090b200841e8026a220b2005410c6c6a2216450d0020162802002209450d01200b2005410c6c6a2802082205417f4c0d052005450d02200510262216450d062016200920051094041a0c030b20002001280210200220032004200141146a28020028020c1106000c030b410021160c010b410121160b2000200536020420002016360200200041086a20053602000b20012001280200417f6a3602000f0b101d000b20054101102a000b410121050c000b0b7601017f230041c0006b220024002000411036020c200041b8b7c100360208200041346a4121360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000be41d03027f027e097f230041b0036b2209240002400240024020012802242001280240220a2802b001470d00200041eebac40036020420004101360200200041086a4129360200200841046a2802000d010c020b200542002005290308220b200a41a0016a2903007d220c200c200b56200c5072220a1b37030802400240200a450d0020004197bbc40036020420004101360200200041086a41233602000c010b20024200410110d1021a200941d8016a41186a220d200241186a290000370300200941d8016a41106a220e200241106a290000370300200941d8016a41086a220f200241086a290000370300200920022900003703d801200941c0026a200941d8016a10d8014100211002400240024020092d00c00222114102460d00200941f8026a280200210a02402011450d00410021100c010b200a417f4c0d01200941f4026a2802002112200941f0026a280200211102400240200a450d00200a10262210450d0420102011200a1094041a20120d010c020b410121102012450d010b201110230b200941d8006a4200370300200941d0006a42808080808001370300200941c0006a41bcbbc4003602002009413c6a2001410c6a2212360200200941346a4200370200200941206a41106a41f098c400360200200941206a41086a200a360200200941f4006a200f290300370200200941fc006a200e29030037020020094184016a200d290300370200200942083703482009410036022c2009200a36022420092010360220200920092903d80137026c200920012802483602682009200141c0006a2902003703602009200141246a28020041016a3602440240024002400240024002400240024002400240024002402003200484500d00200941086a20054100200141cc006a200220032004200941206a10bc032009280208220a450d00200928020c21012000200a36020420004101360200200041086a2001360200024020092802202201450d002009280224450d00200110230b200941206a41186a280200210a200941306a2802002101200941206a41146a2802002202450d012002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c030b0b201228020022134100480d0a201341ffffffff07460d0a2001410c6a201341016a360200200141106a210a200141146a28020021110240024002400340200a280200220e41086a210d200e2f010622144105742110417f210a02400240024003402010450d01200a41016a210a417f41012002200d4120109604220f4100481b4100200f1b220f450d03201041606a2110200d41206a210d200f4101460d000b20110d010c040b2014210a2011450d030b2011417f6a2111200e200a4102746a41880b6a210a0c010b0b200e200a41e0006c6a41e8026a220a450d00200941c8026a2210200a41c5006a290000370300200941d0026a220d200a41cd006a290000370300200941d8026a220e200a41d5006a2900003703002009200a413d6a2900003703c002200a2d003c4101470d0020094199016a2010290300370000200941a1016a200d290300370000200941a9016a200e290300370000200920092903c00237009101200941013a009001201220133602000c010b20094190016a2001411c6a2802002002200141206a28020028021011040020092d00900121022001200128020c417f6a36020c2002450d010b200941b8016a41186a200941a9016a290000370300200941b8016a41106a200941a1016a290000370300200941b8016a41086a20094199016a29000037030020092009290091013703b801200941c0026a200941b8016a200141c8006a28020028020010c402024020092802c0024101470d00200020092902c40237020420004101360200024020092802202201450d002009280224450d00200110230b200941206a41186a280200210a200941306a2802002101200941206a41146a2802002202450d042002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c060b0b20094190026a41186a220a200941c0026a410472220241186a28020036020020094190026a41106a2210200241106a29020037030020094190026a41086a220d200241086a2902003703002009200229020037039002200941d8016a41106a200d290300370300200941d8016a41186a2010290300370300200941f8016a200a280200360200200941043602dc01200941a7c4c4003602d80120092009290390023703e001200141c4006a2802002102200a200141e4006a2900003703002010200141dc006a290000370300200d200141d4006a2900003703002009200129004c370390024200210c200941a0036a41086a220a4200370300200942003703a00341a298c300410d200941a0036a1000200941b0026a41086a200a290300370300200920092903a0033703b002410021100240200941b0026a411041a886c500410041001001417f460d00200942003703a003200941b0026a4110200941a0036a41084100100141016a41084d0d0b20092903a003210c0b200941e4026a20094190026a41086a220a290300370200200941ec026a200941a0026a290300370200200941f4026a200941a8026a290300370200200920033703c0022009200c3703d002200920043703c80220092009290390023702dc022009200941206a3602d802200a200841086a280200360200200920082902003703900220094180026a2002200941d8016a200941c0026a2006200720094190026a200510b7014101210d20092802800222024101460d054100210620024102470d062000200929028402370204200041013602000240200941f0016a280200450d00200941ec016a28020010230b024020092802202201450d002009280224450d00200110230b200941206a41186a2802002108200941306a2802002101200941206a41146a2802002202450d082002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c0a0b0b4101210d4100211041002106410121070c060b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a20013602002009200a3602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d0b200941d4006a2802001023200841046a2802000d0c0c0d0b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a20013602002009200a3602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d09200941d4006a2802001023200841046a2802000d0a0c0b0b2009418c026a280200211020094180026a41086a2802002106200928028402210d0b0240200941f0016a280200450d00200941ec016a28020010230b410021070b200941c0026a41086a220a200941346a290200370300200941106a41086a220e200941c0026a410c6a2802003602002009200929022c3703c002200920092902c402370310200941dc006a280200210f200941d8006a2802002111200941206a41346a2802002102200941d0006a2802002113200941cc006a2802002114200941206a41286a2802002105024020092802202215450d002009280224450d00201510230b200a200e280200360200200920092903103703c002200941206a41086a200a280200360200200920092903c0023703202012200941206a10ec0120092005201341e8006c6a36022c200920053602282009201436022420092005360220200141286a200941206a10a20220092002200f4190016c6a36022c200920023602282009201136022420092002360220200141346a200941206a10a1022000410c6a2010360200200041086a20063602002000200d360204200041003602002007450d08200841046a280200450d0820082802001023200941b0036a24000f0b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a2001360200200920083602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d06200941d4006a2802001023200941b0036a24000f0b41d4aac10041331021000b10e401000b101d000b200a4101102a000b200841046a280200450d010b200828020010230b200941b0036a24000bde0202097f027e230041106b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d002004280200450d00200441106a290300210c200441086a290300210d0c010b200320012802102002200141146a28020028021c110400200341086a290300210c200128020021052003290300210d0b20012005417f6a3602002000200c3703082000200d370300200341106a24000f0b10e401000ba90301097f230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b2007200441e0006c6a41e8026a2204450d00200341086a220a200441c5006a290000370300200341106a2208200441cd006a290000370300200341186a2207200441d5006a29000037030020032004413d6a29000037030020042d003c4101470d0020002003290300370001200041013a0000200041096a200a290300370000200041116a2008290300370000200041196a20072903003700000c010b200020012802102002200141146a280200280210110400200128020021050b20012005417f6a360200200341206a24000f0b10e401000ba40201087f0240200028020022024100480d00200241ffffffff07460d002000200241016a2203360200200041046a2102200041086a2802002104024003402002280200220541086a210620052f010622074105742108417f210202400240024003402008450d01200241016a2102417f410120012006412010960422094100481b410020091b2209450d03200841606a2108200641206a210620094101460d000b20040d010c040b200721022004450d030b2004417f6a2104200520024102746a41880b6a21020c010b0b2005200241e0006c6a41e8026a2202450d002002413c6a2d0000210220002003417f6a36020020024101460f0b20002802102001200041146a280200280218110300210220002000280200417f6a36020020020f0b10e401000bf80202097f037e230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d00200441186a290300220ca7450d00200441286a290300210d200441206a290300210e0c010b200341086a20012802102002200141146a280200280214110400200341186a290300210d200128020021052003290310210e2003290308210c0b20012005417f6a360200200041106a200d3703002000200e3703082000200c370300200341206a24000f0b10e401000bff1207057f017e1a7f047e017f017e097f230041b00d6b22022400024020002802000d002000417f36020020012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b2002411c6a20042f0106360200200241186a4100360200200241146a20043602002002200336022020024100360210200242003703082002200136020420024100360200200241b0026a200210b0010240024020022903d00222074202510d002000410c6a2108200041046a210920024190016a41146a210a20024190016a41206a2105200241b0026a41047221042002418d036a210b200241b0026a413d6a210c200241ad036a210d200241f8026a210e200241f0026a210f200241b0026a41306a2110200241b0026a41286a21112002418c036a2112200241e8026a211320024180036a211420024184036a211520024188036a2116200241b0026a413c6a2117200241e4026a2118200241c8016a411c6a21190340200241c8006a41086a2203200241b0026a41086a221a290300370300200241c8006a41106a221b200241b0026a41106a221c290300370300200241c8006a41186a221d200241b0026a41186a221e290300370300200241286a41086a221f200b41086a290000370300200241286a41106a2220200b41106a290000370300200241286a41186a2221200b41186a290000370300200220022903b0023703482002200b290000370328200e2903002122200f2903002123201029030021242011290300212520122d0000212620132903002127201428020021012015280200210620162802002128200241246a41026a2229200d41026a2d00003a00002002200d2f00003b0124200241f0006a41186a222a2021290300370300200241f0006a41106a222b2020290300370300200241f0006a41086a222c201f290300370300200241ec006a41026a222d20292d00003a000020022002290328370370200220022f01243b016c20024190016a41186a2220201d29030037030020024190016a41106a221d201b29030037030020024190016a41086a221f20032903003703002002200229034837039001024002402009280200221b41f098c400460d00200041086a280200212e0c010b41880b1026221b450d034100212e201b41003b0106201b4100360200201b41086a200241b0026a41800b1094041a200041086a41003602002009201b3602000b024002400340201b2f0106222f4105742130417f212141002103024002400240034020302003460d01202141016a2121417f410120024190016a201b20036a41086a412010960422294100481b410020291b2229450d05200341206a210320294101460d000b202e0d010c020b202f2121202e450d010b202e417f6a212e201b20214102746a41880b6a280200211b0c010b0b200241c8016a41186a22032020290300370300200241c8016a41106a2220201d290300370300200241c8016a41086a2229201f29030037030020022002290390013703c801201d200836020020024190016a410c6a2021360200201f2009360200200a20022903c801370200200a41086a2029290300370200200a41106a2020290300370200200a41186a20032903003702002002201b36029401200241003602900120112022370300200241b0026a41206a2023370300201c2024370300201a2025370300201720263a0000201320283602002018200636020020102001360200201e2027370300200c2002290370370000200c41086a202c290300370000200c41106a202b290300370000200c41186a202a290300370000200b20022f016c3b0000200b41026a202d2d00003a0000200220073703b00220024190016a200241b0026a10b4011a0c010b201b41e8026a202141e0006c6a22212021290308202520075022031b37030820212021290300200720031b370300202141106a221b201b290300202420031b3703002020202a290300370300201d202b290300370300201f202c290300370300200220022903703703900120212d003c211b201e202141d5006a290000370300201c202141cd006a290000370300201a202141c5006a29000037030020022021413d6a22032900003703b00202400240202641ff01714101470d00200241c8016a41186a2020290300370300200241c8016a41106a201d290300370300200241c8016a41086a201f29030037030020022002290390013703c8014101211b0c010b200241c8016a41186a201e290300370300200241c8016a41106a201c290300370300200241c8016a41086a201a290300370300200220022903b0023703c8010b2021413c6a201b3a0000200341186a200241c8016a41186a2229290300370000200341106a200241c8016a41106a2230290300370000200341086a200241c8016a41086a222e290300370000200320022903c801370000202141286a2203202220032903002027a722031b37030020212023202129032020031b37032020212027202129031820031b370318024002402006450d002006211b20012103034020032802ec032103201b417f6a221b0d000b0340200120012f01064102746a41ec036a28020021012006417f6a22060d000c020b0b200121030b20012f01062106200241c8016a41206a20283602002019200636020020294100360200200241c8016a41146a200136020020304100360200202e4200370300200220033602cc01200241003602c801200241b0026a200241c8016a10af01024020022802b0024101470d00202141306a211b034020024190016a41286a200441286a2802003602002005200441206a2902003703002020200441186a2201290200370300201d200441106a2206290200370300201f200441086a2203290200370300200220042902003703900120024180026a41186a200129000037030020024180026a41106a200629000037030020024180026a41086a20032900003703002002200429000037038002200241a0026a41086a200541086a280200360200200220052902003703a002200241f0016a201b20024180026a200241a0026a10b601024020022802f001450d0020022802f4012201450d00200241f0016a41086a280200450d00200110230b200241b0026a200241c8016a10af0120022802b0024101460d000b0b200241c8016a10b5010b200241b0026a200210b001200241b0026a41206a29030022074202520d000b0b200210d4012000200028020041016a360200200241b00d6a24000f0b41880b4108102a000b10e601000bd30102027f027e200028022021020240024002400240410410262203450d00200320023600002000280224210220034104410810272203450d0120032002360004200041086a29030021042000290300210520034108411810272203450d0220032005370008200341106a2004370000200041186a29030021042000290310210520034118413010272200450d0320002005370018200041206a200437000020012802002001280204200041281004200010230f0b41044101102a000b41084101102a000b41184101102a000b41304101102a000b13002000410a360204200041bcbec1003602000ba70301047f230041c0006b2202240002400240411610262203450d002003410e6a41002900e1b641370000200341086a41002900dbb641370000200341002900d3b64137000020034116413610272203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034136200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d002002410036022020024120200241206a41044100100141016a4105490d02200228022021012002410036022020024120200241206a41044104100141016a4105490d02200041086a200228022036020020002001360204200041013602000c010b200041003602000b20031023200241c0006a24000f0b41d4aac10041331021000b41164101102a000b41364101102a000b130020004107360204200041e5e4c1003602000b130020004117360204200041ece4c1003602000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241003600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241183600000f0b41044101102a000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242053700000f0b41084101102a000b3301017f0240410810262202450d0020004288808080800137020420002002360200200242e8073700000f0b41084101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241013600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241023600000f0b41044101102a000b3901017f0240411010262202450d002002420037000820024201370000200042908080808002370204200020023602000f0b41104101102a000b3901017f0240411010262202450d002002420037000820024200370000200042908080808002370204200020023602000f0b41104101102a000b3901017f0240411010262202450d002002420037000820024209370000200042908080808002370204200020023602000f0b41104101102a000b130020004102360204200041b88ec2003602000bbe0904027f017e037f077e230041f0006b2202240002400240024002400240411010262203450d00200341086a41002900dd9d42370000200341002900d59d4237000020034110413010272203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220742003703002002420037035020034130200241d0006a1002200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a200729030037030020022002290350370330024002400240024002400240200241306a412041a886c500410041001001417f460d002002420037035820024200370350200241306a4120200241d0006a4110410010012205417f460d052005410f4d0d05200241d8006a2903002108200229035021092002420037035820024200370350200241306a4120200241d0006a4110411010012205417f460d052005410f4d0d05200241d0006a41086a290300210a2002290350210b20031023411410262203450d09200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d0a200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220142003703002002420037035020034134200241d0006a1002200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a2205200129030037030020022002290350370330200241306a412041a886c500410041001001417f460d012002420037035820024200370350200241306a4120200241d0006a4110410010012206417f460d082006410f4d0d08200241d8006a290300210c2002290350210d0c020b200310234200210c0c020b4200210d4200210c0b20031023200142003703002002420037035041af98c300410d200241d0006a100020052001290300370300200220022903503703300240200241306a411041a886c500410041001001417f460d0020024200370350200241306a4110200241d0006a41084100100141016a41084d0d02200229035021040b4200210e200242004200200b4200109804200241106a200a420020044200109804200241206a20044200200b42001098044200210402404200420052200a42005271200229030842005272200229031842005272200241286a290300220b200229030020022903107c7c220a200b54720d002008200a2002290320220e200954200a200854200a2008511b22011b200a7d2009200e20011b220a200e54ad7d2104200a200e7d210e0b2004200c200d200e56200c200456200c2004511b22011b210c200e200d20011b21040b200020043703002000200c370308200241f0006a24000f0b41d4aac10041331021000b41d4aac10041331021000b41104101102a000b41304101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b130020004108360204200041e59dc2003602000baf0c05017f017e017f017e067f230041b0016b2203240042002104200341206a41086a22054200370300200342003703204182b6c100411b200341206a100020034190016a41086a20052903003703002003200329032037039001024002400240024020034190016a411041a886c500410041001001417f460d00200342003703282003420037032020034190016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441182107411810262205450d010c030b42002106411821074118102622050d020b20074101102a000b41d4aac10041331021000b200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000002400240024002400240024002400240024020052007413810272205450d0020052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341206a41186a22074200370300200341206a41106a22084200370300200341206a41086a220942003703002003420037032020054138200341206a100220034190016a41186a200729030037030020034190016a41106a200829030037030020034190016a41086a20092903003703002003200329032037039001200320013703202003200237032820034190016a4120200341206a41101004200510232004200158200620025820062002511b0d07411810262205450d02200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0320052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341086a2005413810e101200341086a41106a290300210220032802082107200329031021012005102302402001200284500d002007450d0020032001370320200320023703282003200341206a3602900120034190016a10de010b411410262205450d04200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d05200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341206a41186a22074200370300200341206a41106a22084200370300200341206a41086a220942003703002003420037032020054134200341206a100220034190016a41186a200729030037030020034190016a41106a200829030037030020034190016a41086a20092903003703002003200329032037039001024020034190016a412041a886c500410041001001417f460d00200342003703282003420037032020034190016a4120200341206a4110410010012207417f460d022007410f4d0d02200341286a29030021022003290320210141002107200510232001200284504101710d090c070b41012107200510234100410171450d060c080b41384101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b41144101102a000b41344101102a000b20070d010b200341b0016a24000f0b02400240411310262205450d002005410f6a41002800a99943360000200541086a41002900a299433700002005410029009a994337000020054113413310272205450d01200520002900003700132005412b6a200041186a2208290000370000200541236a200041106a22092900003700002005411b6a200041086a220a290000370000200341206a41186a220b4200370300200341206a41106a220c4200370300200341206a41086a220742003703002003420037032020054133200341206a100220034190016a41186a200b29030037030020034190016a41106a200c29030037030020034190016a41086a2007290300370300200320032903203703900120034190016a4120100320051023200741013a0000200341296a2000290000370000200341316a200a290000370000200341396a2009290000370000200341c1006a2008290000370000200341023a002041a886c5004100200341206a102c200341b0016a24000f0b41134101102a000b41334101102a000b13002000410a360204200041f09dc2003602000bc60807057f017e087f047e017f017e017f230041f0006b220224000240024002400240024002400240024002400240410e10262203450d00200341066a41002900b0b741370000200341002900aab7413700002003410e412e10272204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241386a41186a22014200370300200241386a41106a22034200370300200241386a41086a22054200370300200242003703382004412e200241386a1002200241086a41186a2001290300370300200241086a41106a2003290300370300200241086a41086a2005290300370300200220022903383703080240024002400240200241086a412041a886c500410041001001417f460d002002422037022c2002200241086a3602282002200241286a104a2002280200450d0b20022802042206ad42287e2207422088a70d032007a72201417f4c0d032001450d01200110262208450d062006450d020c070b20004100360208200042083702000c080b4108210820060d050b4100210e420021072008450d080c050b101d000b410e4101102a000b412e4101102a000b20014108102a000b200241286a41086a22032802002109200228022c21052002280228210a200241ec006a210b420021074100210c4100210d410021012006210e03402002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382110200242003703402002420037033820034100200a2005200241386a411020091001220f200f417f461b220f4110200f4110491b20096a2209360200200f410f4d0d03200241386a41086a2903002111200229033821122002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382113200241003a003820032009200a2005200241386a41012009100141016a41014b220f6a2209360200200f450d03200141016a210f20022d003821142002200b280000360063200220022800693602602002200228006336005b2002200228026036025802402001200e470d00200c200f200f200c491b220ead42287e2215422088a70d062015a722164100480d0602402001450d002008200d2016102722080d010c080b201610262208450d070b2008200d6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141246a200228005b360000200141216a200228025836000020074280808080107c2107200c41026a210c200d41286a210d200f2101200f2006490d000b2008450d030b20002007200ead84370204200020083602000b20041023200241f0006a24000f0b200e450d00200810230b41d4aac10041331021000b101e000b20164108102a000b850701087f230041900c6b22042400024002400240024020002802000d002000417f360200200441d8006a41186a200141186a290000370300200441d8006a41106a200141106a290000370300200441d8006a41086a200141086a29000037030020042001290000370358024002402000280204220541f098c400460d00200041086a28020021060c010b41880b10262205450d0241002106200541003b010620054100360200200541086a20044190016a41800b1094041a200041086a4100360200200041046a20053602000b200041046a210702400240034020052f01062209410574210a41002101417f21080240024002400340200a2001460d01200841016a2108417f4101200441d8006a200520016a41086a4120109604220b4100481b4100200b1b220b450d05200141206a2101200b4101460d000b20060d010c020b200921082006450d010b2006417f6a2106200520084102746a41880b6a28020021050c010b0b200441186a200441d8006a41186a290300370300200441106a200441d8006a41106a290300370300200441086a200441d8006a41086a290300370300200420042903583703002000410c6a21014100210641000d010c040b2000410c6a21014101450d030b200441a8016a4200370300200441a4016a41f098c400360200200441003602b001200441003602a0012004420037039801200441f098c4003602940120044100360290012005200841e0006c6a41e8026a210120044190016a10b5010c030b10e601000b41880b4108102a000b200441f4006a200441086a290300370200200441fc006a200441106a29030037020020044184016a200441186a2903003702002004200136026820042008360264200420073602602004200536025c200420063602582004200429030037026c200441c4016a4200370200200441b0016a2004290348370300200441b8016a200441c8006a41086a290300370300200441cd016a2004290025370000200441d5016a200441256a41086a290000370000200441dd016a200441256a41106a290000370000200441e5016a200441256a41186a290000370000200441ec016a200441c4006a280000360000200442003703a8012004420037039001200441f098c4003602c001200441003a00cc01200441d8006a20044190016a10b40121010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441900c6a24000b840402057f027e230041c0006b2204240002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a2008290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012206417f460d022006410f4d0d02200441286a29030021092004290320210a0c010b4200210a420021090b20051023200441206a2001200a20027c2202200920037c2002200a54ad7c10dc01200441106a200441206a41106a290300220a370300200420042903282202370308200420042903202203370300024020034200510d002004200441086a360220200441206a10de01420021024200210a0b200020023703002000200a370308200441c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bff0304027f017e027f017e230041d0006b220524000240024002400240200241ff017122064102460d0020064104470d02200541106a200110fc012005290310200356200541186a290300220720045620072004511b0d010c020b2005200110fc012005290300200358200541086a290300220720045820072004511b0d010b41bcb4c1002101412621060c010b200541206a20011080020240024002400240024020052802282201450d0042002107200541c0006a41086a220642003703002005420037034041af98c300410d200541c0006a1000200541306a41086a2006290300370300200520052903403703300240200541306a411041a886c500410041001001417f460d0020054200370340200541306a4110200541c0006a41084100100141016a41084d0d03200529034021070b200141286c210620052802242108200528022022092101034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d030b200141286a2101200641586a22060d000b410021012008450d040c030b02402005280224450d00200528022010230b410021010c040b41e2b4c100210120080d010c020b41d4aac10041331021000b200910230b413121060b2000200636020420002001360200200541d0006a24000bd30704027f017e037f057e230041c0006b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054134200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a2004290320210b0c010b4200210b4200210a0b200510232001200b2002200b200b200256200a200356200a2003511b22051b220c7d200a2003200a20051b220d7d200b200c54ad7d10df0102400240024002402002200c7d220b2003200d7d2002200c54ad7d220e84500d00411810262205450d08200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0920052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002102200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703002004412041a886c500410041001001417f460d01200442003703282004420037032020044120200441206a4110410010012207417f460d072007410f4d0d07200441286a2903002103200429032021020c020b4200210e0c020b420021030b2005102320012002200b20022002200b562003200e562003200e511b22051b220a7d2003200e200320051b22067d2002200a54ad7d10fe01200e20067d200b200a54ad7d210e2006200d7c200a200c7c2202200a54ad7c2103200b200a7d21060b2000200637031020002002370300200041186a200e37030020002003370308200441c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b8b0604027f017e037f027e230041d0006b220524000240024002400240411410262206450d00200641106a41002800f9b641360000200641086a41002900f1b641370000200641002900e9b64137000020064114413410272206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002107200541306a41186a22084200370300200541306a41106a22094200370300200541306a41086a220a42003703002005420037033020064134200541306a1002200541106a41186a2008290300370300200541106a41106a2009290300370300200541106a41086a200a29030037030020052005290330370310024002400240200541106a412041a886c500410041001001417f460d002005420037033820054200370330200541106a4120200541306a4110410010012208417f460d022008410f4d0d02200541386a290300210b200529033021070c010b4200210b0b20061023024002400240200720027d220c200756200b20037d2007200254ad7d2207200b562007200b511b450d00200041b5b5c100360204200041086a411d3602000c010b200541306a41086a22064200370300200542003703304182b6c100411b200541306a1000200541106a41086a2006290300370300200520052903303703100240200541106a411041a886c500410041001001417f460d002005420037033820054200370330200541106a4110200541306a4110410010012206417f460d062006410f4d0d06200c20052903305a2007200541306a41086a290300220b5a2007200b511b0d00200041d2b5c100360204200041086a411a3602000c010b200541086a20012004200c200710830220052802082206450d01200528020c210120002006360204200041086a20013602000b410121060c050b2001200c200710df01200041106a2003370300200041086a2002370300410021060c040b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b20002006360200200541d0006a24000bfc0304017f017e037f037e230041c0006b2202240042002103200241186a41086a2204420037030020024200370318419db6c100411b200241186a1000200241306a41086a22052004290300370300200220022903183703300240024002400240200241306a411041a886c500410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012206417f460d022006410f4d0d02200241206a2903002107200229031821080c010b42002108420021070b200442003703002002420037031841b8b6c100411b200241186a1000200520042903003703002002200229031837033002400240200241306a411041a886c500410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012204417f460d032004410f4d0d03200241206a2903002109200229031821030c010b420021090b200241086a200320092001ad4200109804200241186a20002002290308220320087c2208200241106a29030020077c2008200354ad7c4101108502024020022802184101470d00200228021c2104200241c0006a240020040f0b200229032021032002200241286a290300370320200220033703182002200241186a360230200241306a10de01200241c0006a240041000f0b41d4aac10041331021000b41d4aac10041331021000ba10802097f027e230041d0006b2202240002400240410e10262203450d00200341066a41002900b0b741370000200341002900aab7413700002003410e412e10272204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241286a41186a22004200370300200241286a41106a22034200370300200241286a41086a22054200370300200242003703282004412e200241286a1002200241086a41186a2000290300370300200241086a41106a2003290300370300200241086a41086a20052903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a104102400240024002400240024002402000450d00200041286c210720052802002108200228022c210003400240024002400240200020086b41084f0d00200841086a22092008490d0720004101742203200920092003491b220a4100480d072000450d0120022802282000200a102722030d020c080b200841086a2109200228022821030c020b200a10262203450d060b2002200a36022c20022003360228200a21000b20052009360200200320086a200641186a290000370000200641086a290300210b2006290300210c0240024002400240200020096b41104f0d00200941106a22082009490d072000410174220a20082008200a491b220a4100480d072000450d0120032000200a102722030d020c090b200941106a21080c020b200a10262203450d070b2002200a36022c20022003360228200a21000b200320096a2209200b3700082009200c37000020052008360200200641106a290300210b0240200020086b41074b0d00200841086a22092008490d042000410174220a20092009200a491b22094100480d04024002402000450d00200320002009102722030d010c090b200910262203450d080b2002200936022c200220033602280b2005200841086a360200200320086a200b3700000240024002400240200228022c220020052802002203470d00200341016a22002003490d0720034101742208200020002008491b22004100480d072003450d01200228022820032000102722090d020c0b0b200228022821090c020b200010262209450d090b2002200036022c200220093602280b2005200341016a2208360200200920036a200641206a2d00003a0000200641286a2106200741586a22070d000c020b0b20052802002108200228022c2100200228022821090b200241086a412020092008100402402000450d00200910230b200410230240200141046a280200450d00200128020010230b200241d0006a24000f0b101e000b200a4101102a000b200a4101102a000b20094101102a000b20004101102a000b410e4101102a000b412e4101102a000b898b010d027f027e067f017e0c7f017e017f037e0f7f027e347f027e347f230041a0026b2201240020014180026a41086a2202420037030020014200370380024184b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037022034200510d044200210420002003824200520d130c010b42002104200042e807824200520d120b20014180026a41086a22022004370300200120043703800241b0b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d1120014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0120012802702202450d114108210520014180026a41086a2206420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200629030037030020012001290380023703e0014100210602400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a10890220012802702205450d07200141f8006a2802002106200128027421070c010b410021070b4200210320014180026a41086a22084200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a2209200829030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d002001200141e0016a3602800220014110360284022001420037037020014100200141e0016a4110200141f0006a41084100100122082008417f461b2208410820084108491b220936028802200841074d0d05200129037021032001410036027020014188026a4100200141e0016a4110200141f0006a41042009100122082008417f461b22084104200841044922081b20096a36020020080d0520012802702108200141f0006a20014180026a10282001280270220a450d0520082001290274220b422088a76b20066a21090240200ba7450d00200a10230b20092002490d080c070b20084200370300200142003703800241af98c300410d20014180026a10002009200829030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d04200129037021030b41002108200620024f0d060c070b41d4aac10041331021000b41d4aac10041331021000b4198b3c200104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b0240200820024f0d00200820026b220220066a220820024f0d052005200841286c6a29032021030c010b20014180026a41086a22024200370300200142003703800241d8b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037020037c21030c010b420520037c21030b20014180026a41086a2202420037030020014200370380024184b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240024002400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d022001290370220b4200520d0141fcb3c200104f000b42e807210b0b2003200b7c427f7c22032003200b827d210302402007450d00200510230b20032000520d0c4108210c20014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100210d02400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a1089022001280270220c450d07200141f8006a280200210d2001280274210e0c010b4100210e0b20014180026a41086a22024200370300200142003703800241b0b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100210f0240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d032001280270210f0b4200210320014180026a41086a22024200370300200142003703800241af98c300410d20014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037021030b02400240200d41286c2202450d00200c41206a2903002003580d010b4101211041002111410021120c090b200141e0016a41186a2206200c41186a290300370300200141e0016a41106a2208200c41106a290300370300200141e0016a41086a2205200c41086a2903003703002001200c2903003703e001412010262210450d07201020012903e001370000201041186a2006290300370000201041106a2008290300370000201041086a200529030037000002400240200c20026a200c41286a2202460d00200d41286c41586a21054120210841012106410121110340200241206a2903002003560d02200141e0016a41186a2207200241186a290300370300200141e0016a41106a2209200241106a290300370300200141e0016a41086a220a200241086a290300370300200120022903003703e00102400240024020112006470d00200641016a22132006490d2020064101742212201320132012491b2212ad420586220b422088a70d20200ba722134100480d202006450d01201020064105742013102722100d020c0a0b200621120c010b201310262210450d080b200241286a2102201020086a220620012903e001370000200641186a2007290300370000200641106a2009290300370000200641086a200a290300370000200841206a2108201141016a211120122106200541586a22050d000c0b0b0b4101211141012112200f200d41016b22064b0d0a0c0b0b20062112200f200d20116b22064b0d090c0a0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20134101102a000b41d4aac10041331021000b41ecb3c200200820061029000b41204101102a000b200f200d20116b22064d0d010b20014180026a41086a2202420037030020014200370380024194b4c200411c20014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d072001290370210b0c010b42e807210b0b20014180026a41086a22024200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0012001410036027820014201370370410810262202450d09200142888080808001370274200120023602702002200b20037c37000020024108411010272202450d0a20014290808080c0013702742002200f20066b221436000820012002360270200120113602800220014180026a200141f0006a1041024002402011450d00201141057421094100200141f0006a41086a28020022066b21052001280270210a200128027421072010210203400240200720056a411f4b0d00200641206a22082006490d1420074101742213200820082013491b22084100480d14024002402007450d00200a200720081027220a0d010c090b20081026220a450d080b200821070b200a20066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102200941606a22090d000b200141f8006a2006360200200120073602742001200a3602700c010b200141f8006a2802002106200128027421072001280270210a0b200141e0016a4110200a2006100402402007450d00200a10230b02402012450d00201010230b20014180026a41086a22024200370300200142003703800241b0b4c200411220014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0a200128027021060c010b410221060b20014198026a420037030020014190026a420037030020014188026a42003703002001420037038002200620146a2213ad42307e2203422088a70d0f2003a72202417f4c0d0f024002402002450d00200210262210450d0d201021020c010b41082110410821020b200141f0006a41186a220920014180026a41186a290300370300200141f0006a41106a220a20014180026a41106a290300370300200141f0006a41086a20014180026a41086a290300370300200120012903800237037002400240024020134102490d002011200f6a20066a417f6a200d6b21060340200141e0016a41186a22082009290300370300200141e0016a41106a2205200a290300370300200141e0016a41086a2207200141f0006a41086a290300370300200120012903703703e0012002420037030820024200370300200241286a2008290300370300200241206a2005290300370300200241186a2007290300370300200241106a20012903e001370300200241306a21022006417f6a22060d000b2013417f6a21060c010b410021062013450d010b200242003703082002420037030020022001290370370310200241186a200141f8006a290300370300200241206a20014180016a290300370300200241286a200141f0006a41186a290300370300200641016a21060b20012006360278200120133602742001201036027020014180026a41086a22024200370300200142003703800241c2b4c200411320014180026a1000200141e0016a41086a200229030037030020012001290380023703e00120014110360284022001200141e0016a36028002200141f0006a20014180026a108a0202402013450d00201010230b200141f0006a41086a2014360200200141023a0074200141063a007041a886c5004100200141f0006a102c200e0d010c020b02402012450d00201010230b200e450d010b200c10230b20014180026a41086a22022004370300200120043703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d0f2001200141e0016a3602800220014110360284022001420037037020014100200141e0016a4110200141f0006a41084100100122022002417f461b2202410820024108491b22063602880202400240024002400240200241074d0d00200129037021042001410036027020014188026a4100200141e0016a4110200141f0006a41042006100122022002417f461b22024104200241044922021b20066a36020020020d00200141f0006a20014180026a102820012802702215450d002001280274211620042000520d1320014180026a41086a22024200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001024002400240200141e0016a411041a886c500410041001001417f460d002001200141e0016a360240200141103602442001420037037020014100200141e0016a4110200141f0006a41084100100122022002417f461b2202410820024108491b2206360248200241074d0d062001290370210420014100360270200141c8006a4100200141e0016a4110200141f0006a41042006100122022002417f461b22024104200241044922021b20066a36020020020d0620012802702102200141f0006a200141c0006a102820012802702217450d0620012002360288022001200437038002200129027421182001280288022119200141e0016a41101003410821144200211a20014180026a41086a22024200370300200142003703800241c2b4c200411320014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a108b0220012802702214450d0c2001290274211a200141e0016a411010030b20014180026a41086a22024200370300200142003703800241af98c300410d20014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e0014200211b0240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d052001290370211b0b20024200370300200142003703800241d8b3c200411420014180026a10002006200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d0120014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d052001290370211c0c020b02402016450d00201510230b41c9b5c200410f100f41d8b5c2004135100f200141a0026a24000f0b4205211c0b4200210420014180026a41086a22024200370300200142003703800241a1b5c200411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d002001420037037820014200370370200141e0016a4110200141f0006a4110410010012202417f460d082002410f4d0d08200141f8006a2903002104200129037021000c010b420921000b2014201a422088a7221d41306c6a21020240024002402019450d002019417f6a211341002108024020142002460d002014201d41306c6a220641506a2202290300200641586a29030084500d0220014198026a200641786a29000037030020014190026a200641706a29000037030020014188026a200641686a2900003703002001200641606a29000037038002410121080b410021110c020b4100211141002113410021080c010b410121110b200141f9006a20014180026a41086a29030037000020014181016a20014180026a41106a29030037000020014189016a20014180026a41186a290300370000200120083a007020012001290380023700714101210d200141f0006a410172210602402008450d00200620002004102b200141e0016a41186a200641186a290000370300200141e0016a41106a200641106a290000370300200141e0016a41086a200641086a290000370300200120062900003703e00141201026220e450d0a200e20012903e001370000200e41186a200141e0016a41186a2208290300370000200e41106a200141e0016a41106a2205290300370000200e41086a200141e0016a41086a2207290300370000200141f0006a41017221064102210a412021094101211e4101211f0240410020136b220c41016a4101460d000340201141ff01710d0120142002460d01200241506a2213290300200241586a29030084500d012008200241786a2900003703002005200241706a2900003703002007200241686a2900003703002001200241606a2900003703e001200620012903e001370000200641086a22022007290300370000200641106a22112005290300370000200641186a22102008290300370000200141013a0070200620002004102b20014180026a41186a2212201029000037030020014180026a41106a2210201129000037030020014180026a41086a22112002290000370300200120062900003703800220082012290300370300200520102903003703002007201129030037030020012001290380023703e0010240201e201f470d00201e41016a2202201e490d16200a20022002200a491b221fad4205862203422088a70d162003a722024100480d160240201e450d00200e200920021027220e0d010c090b20021026220e450d080b200e20096a220220012903e001370000200241186a2008290300370000200241106a2005290300370000200241086a2007290300370000200a41026a210a200941206a21094100211120132102200c201e41016a221e6a4101470d000b0b200e20096a210d201e450d0f41082120200141f0006a41086a2121412021224101212341212124411f21254105212641072127417f2128411821294110212a4102212b4201212c4200212d4111212e4190b5c200212f4100213041a886c50021312001419c016a213241132133410f213441332135412b213641232137411b213841042139415f213a200e213b4100213c0c100b200141e0016a41186a200641186a290000370300200141e0016a41106a200641106a290000370300200141e0016a41086a200641086a290000370300200120062900003703e0014100211f4101210e4100211e410021020c100b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20024101102a000b20084101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41204101102a000b41d4aac10041331021000b41084101102a000b41104101102a000b20024108102a000b410021020c010b410121020b034002400240024002400240024002400240024002400240024002400240024002400240024020020e020001010b4108210f20014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100213d024002400240024002400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a1089022001280270220f450d02200141f8006a280200213e2001280274213d0c010b4100213e0b200141013602700240024002400240024002402018422088a72207450d004100213f4100214002402007200f203e41286c6a2205200f6b41286e2202200220074b1b2202450d00200241057422064100480d1e200610262208450d0920012008360270200221400b200f2102200721082001280270224121060340200520026b419f014d0d0220062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020084101460d0320062002290028370020200641386a200241c0006a290000370000200641306a200241386a290000370000200641286a200241306a29000037000020084102460d0420062002290050370040200641d8006a200241e8006a290000370000200641d0006a200241e0006a290000370000200641c8006a200241d8006a29000037000020084103460d0520062002290078370060200641f8006a20024190016a290000370000200641f0006a20024188016a290000370000200641e8006a20024180016a290000370000203f41046a213f20064180016a2106200241a0016a21022008417c6a22080d000c060b0b41002140200128027021414100213f0c040b20052002460d03200f203e41286c6a2109410121050240034020062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020082005223c460d01203c41016a2105200641206a21062009200241286a2202470d000b0b203f203c6a213f0c030b203f410172213f0c020b203f410272213f0c010b203f410372213f0b201c201b7c210b200f203e41286c6a210c02400240024002400240024002402007450d00200c200f460d012007417f732106203e41286c2108200f21020340200141e0016a41186a200241186a290300370300200141e0016a41106a200241106a290300370300200141e0016a41086a200241086a290300370300200120022903003703e001200641016a2206450d05200241286a2102200841586a22080d000b200c2106200e200d470d030c020b200c200f460d00200141f0006a41186a200f41186a290300370300200141f0006a41106a200f41106a290300370300200141f0006a41086a200f41086a2903003703002001200f290300370370200f41286a2106200f29032021040c040b200f2106200e200d470d010b41002142410821430240203d450d00200f10230b4100213e0c180b200141e0016a41186a200e41186a2202290000370300200141e0016a41106a200e41106a2208290000370300200141e0016a41086a200e41086a22052900003703002001200e2900003703e0012005290000210420082900002100200e290000210320014180026a41186a200229000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200e41206a210841022105200b21040c020b200241206a2903002104200141f0006a41186a200141e0016a41186a290300370300200141f0006a41106a200141e0016a41106a290300370300200141f0006a41086a200141e0016a41086a290300370300200120012903e001370370200241286a21060b20014180026a41186a200141f0006a41186a29030037030020014180026a41106a200141f0006a41106a29030037030020014180026a41086a200141f0006a41086a290300370300200120012903703703800241002105200e21080b417f417f200c20066b41286d2202200d20086b4105766a220720072002491b220241016a220720072002491b2242ad42287e2200422088a70d162000a72202417f4c0d16024002402002450d00200210262243450d03204321440c010b41082143410821440b2043200129038002370300204341186a20014180026a41186a290300370300204341106a20014180026a41106a290300370300204341086a20014180026a41086a2903003703002044200437032002400240024002400240024002402005450d002008200d460d03200841086a2900002104200841106a29000021002008290000210320014180026a41186a200841186a29000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200841206a21080c010b02402006200c460d00200141f0006a41186a200641186a2202290300370300200141f0006a41106a200641106a2205290300370300200141f0006a41086a200641086a22072903003703002001200629030037037020014180026a41086a200729030037030020014180026a41106a200529030037030020014180026a41186a20022903003703002001200629030037038002200641286a210220062903202104410021110c020b2008200d460d02200141e0016a41186a200841186a2202290000370300200141e0016a41106a200841106a2205290000370300200141e0016a41086a200841086a2207290000370300200120082900003703e00120072900002104200529000021002008290000210320014180026a41186a200229000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200841206a21080b41022111200b2104200621020b4102210741022106412821050340200141f0006a41186a223c20014180026a41186a2213290300370300200141f0006a41106a220920014180026a41106a2210290300370300200141f0006a41086a220a20014180026a41086a2212290300370300200120012903800237037002402006223e417f6a22062042470d002006417f417f200c20026b41286d2244200d20086b4105766a224220422044491b224441016a224220422044491b6a22442006490d1d2007204420442007491b2242ad42287e2200422088a70d1d2000a722064100480d1d02400240203e4101470d002006102622430d010c070b20432005200610272243450d060b204321440b204420056a22062001290370370300200641186a203c290300370300200641106a2009290300370300200641086a200a290300370300200641206a2004370300024002400240024002400240201141ff017122064101460d0020064102470d012008200d460d05200841086a2900002104200841106a2900002100200829000021032013200841186a29000037030020102000370300201220043703002001200337038002200841206a210842012100410221110c020b200c2002460d042013200241186a2903003703002010200241106a2903003703002012200241086a2903003703002001200229030037038002200229032021044201210041012111200241286a21020c030b200c2002470d014102211102402008200d460d00200141e0016a41186a200841186a2206290000370300200141e0016a41106a200841106a223c290000370300200141e0016a41086a200841086a2209290000370300200120082900003703e00120092900002104203c2900002100200829000021032013200629000037030020102000370300201220043703002001200337038002200841206a2108420121000c010b420021000c020b200b21040c010b203c200241186a22062903003703002009200241106a223c290300370300200a200241086a22092903003703002001200229030037037020092903002104203c2903002100200229030021032013200629030037030020102000370300201220043703002001200337038002200229032021044201210041002111200241286a21020b200741026a2107203e41016a2106200541286a210520004200520d010b0b203d450d020c010b4101213e203d450d010b200f10230b0240203e41144b0d0041022145203e4102490d16417f2146203e417f6a2147412821482044203e41286c6a21494120214a4118214b4110214c4108214d4103214e41f000214f41582150417821514170215241682153416021544101215541c80021564101213c0c070b203e4101762257ad42287e2204422088a70d172004a72202417f4c0d1741082158024002402002450d00200210262259450d062059215a0c010b410821594108215a0b4158215b204441586a215c204441a87f6a215d4100215e4104215f417f21604101216142032162422021634103216441022165417d21664128216741782168412021694118216a4110216b417e216c4174216d4164216e4150216f410521704109217141f000217241c800217341c00021744138217541302176410a217741042178410021794100217a203e217b4102213c0c080b20064108102a000b41d4aac10041331021000b20024108102a000b20064101102a000b20024108102a000b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240203c0e050001020304040b2001203b10ef01024020012802002023470d00200120206a2802002108200141206a108c022001280220213d0240200141206a20206a2802002202450d00200220246c2106203d20236a2102200820207621112023200820257174210c20082026762027712213202873210f03400240024002400240200220286a2d00002023470d00200141f0006a20296a200220296a2205290000370300200141f0006a202a6a2002202a6a22072900003703002021200220206a220929000037030020022900002104200141f0006a20226a20113602002001200437037020014180026a200141f0006a108d020240201320014180026a20206a220a28020022084f0d002008200f6a221020084f0d0d20012802800222122010202b746a280200200c7121080240200128028402450d00201210230b2008450d01200141f0006a2002108e022001290370202c520d02200a202d3703002001202d37038002202f202e20014180026a1000200141e0016a20206a2210200a29030037030020012001290380023703e001200141e0016a202a20312030203010012028460d032001203036028002200141e0016a202a20014180026a20392030100120236a20394d0d0e203220012802800220236a3602002033102622080d040c120b200128028402450d0020012802800210230b200220246a21022006203a6a22060d030c040b203310262208450d0d200820346a20302800c5b542360000200820206a20302900beb542370000200820302900b6b54237000020082033203510272208450d0e20082002290000370013200820366a2005290000370000200820376a2007290000370000200820386a2009290000370000200141e0016a20296a2205202d370300200141e0016a202a6a2207202d370300200141e0016a20206a2209202d3703002001202d3703e00120082035200141e0016a1002200141c0006a20296a2005290300370300200141c0006a202a6a2007290300370300200141c0006a20206a2009290300370300200120012903e001370340200141c0006a2022100320081023200220246a21022006203a6a22060d020c030b20324101360200203310262208450d0e0b200820346a20302800c5b542360000200820206a20302900beb542370000200820302900b6b54237000020082033203510272208450d0e20082002290000370013200820366a2005290000370000200820376a2007290000370000200820386a2009290000370000200141e0016a20296a2205202d370300200141e0016a202a6a2207202d3703002010202d3703002001202d3703e00120082035200141e0016a1002200141c0006a20296a2005290300370300200141c0006a202a6a2007290300370300200141c0006a20206a2010290300370300200120012903e00137034020012022360284022001200141c0006a36028002202120014180026a10ed0120081023200220246a21022006203a6a22060d000b0b2001280224450d00203d10230b200d203b20226a223b470d130c180b203e2047220220466a2247490d0d0240203e20476b22062045490d002044200220486c6a2202204a6a22052903002044204720486c6a2208204a6a220729030022045a0d00200141e0016a204b6a223c2008204b6a2209290300370300200141e0016a204c6a220a2008204c6a2211290300370300200141e0016a204d6a22132008204d6a2210290300370300200120082903003703e0012008200229030037030020102002204d6a29030037030020112002204c6a29030037030020092002204b6a2903003703002007200529030037030002402006204e490d002008204f6a29030020045a0d00410221082049210503402005220220506a2002290300370300200220516a2002204a6a290300370300200220526a2002204b6a290300370300200220536a2002204c6a290300370300200220546a2002204d6a290300370300200820556a220820064f0d01200220486a2105200220566a2903002004540d000b0b200220012903e001370300200220043703202002204b6a203c2903003703002002204c6a200a2903003703002002204d6a20132903003703000b204920506a214920470d130c280b207b217c4100217b4101217d207c20606a2209450d1f0240024002400240024002402044200920676c6a20696a2903002044207c20676c22026a206f6a29030022045a0d00205d207c20706c20647422056a2102034020092061460d02200920606a21092004200229030022005421062002205b6a21022000210420060d000c030b0b207c206c6a2105205d20026a21064100217b41002102034020052002460d05200220616a21022004200629030022005a21082006205b6a21062000210420080d000b200220616a217d207c20026b20606a2209450d030c020b410021090b207c2009490d11207c203e4b0d130240207c20096b227d2061762208450d00205c20056a21022044200920676c6a21060340200141f0006a20696a2205200620696a2207290300370300200141f0006a206a6a223c2006206a6a220a290300370300200141f0006a206b6a22112006206b6a2213290300370300200141f0006a20586a2210200620586a221229030037030020012006290300370370200220586a220c29030021042002206b6a220f29030021002002206a6a223d29030021032002290300210b2007200220696a228101290300370300200a200337030020132000370300201220043703002006200b3703002081012005290300370300203d203c290300370300200f2011290300370300200c2010290300370300200220012903703703002002205b6a2102200620676a2106200820606a22080d000b0b2009450d010b207d20714b0d00207c203e4b0d112044200920676c6a217e4100217f0c260b2009217b2079207a460d230c240b207c217d2079207a460d200c210b2087012014460d01208701208a016a2102208701208b016a228701290300200229030084500d012019209601460d1420960120196b210203402014208701460d02208701208a016a2106208701208b016a228701290300200629030084500d0220022096016a22020d000c140b0b2087012014460d0002400340208701208a016a2903002104208701208b016a22022903002100208e01208701208c016a290300370300209101208701208f016a2903003703002094012087012092016a29030037030020012087012095016a290300370380022000200484500d01200141f0006a208d016a2206208e01290300370300200141f0006a2090016a2208209101290300370300200141f0006a2093016a22052094012903003703002001200129038002370370200141e0006a200141f0006a10ef01200141c0006a208d016a2207208e01290300370300200141c0006a2090016a223c209101290300370300200141c0006a2093016a2209209401290300370300200120012903800237034002402001280260209601460d00200221870120142002470d010c030b0b200141e0016a2093016a220a2009290300370300200141e0016a2090016a2209203c290300370300200141e0016a208d016a223c2007290300370300200120012903403703e001200141e0006a2093016a2802002102200141206a208d016a2207203c290300370300200141206a2090016a223c2009290300370300200141206a2093016a2209200a290300370300200120012903e0013703202001208d016a220a200729030037030020012090016a2207203c29030037030020012093016a223c2009290300370300200120012903203703002006200a290300370300200820072903003703002005203c29030037030020012001290300370370024020860120024d0d00208701208b016a2187012085012002209701746a220220012903703700002002208d016a200629030037000020022090016a200829030037000020022093016a20052903003700002089012096016a2189014100211941000d134104213c0c1b0b41d8b4c20020022086011029000b200141206a41186a200141e0016a41186a290300370300200141206a41106a200141e0016a41106a290300370300200141206a41086a200141e0016a41086a290300370300200120012903e0013703200b0240208801450d00201410230b024020860120840141ffffff3f71220220022086014b1b2207450d0020830121022085012106410021050340024020022006460d00200220064120109604450d00411610262208450d0a2008410e6a41002900e1b641370000200841086a41002900dbb641370000200841002900d3b64137000020084116413610272208450d0b200820022900003700162008412e6a200241186a290000370000200841266a200241106a2900003700002008411e6a200241086a290000370000200141e0016a41186a223e4200370300200141e0016a41106a223c4200370300200141e0016a41086a22094200370300200142003703e00120084136200141e0016a1002200141c0006a41186a203e290300370300200141c0006a41106a203c290300370300200141c0006a41086a2009290300370300200120012903e001370340200141c0006a41201003200810230b200241206a2102200641206a2106200541016a22052007490d000b0b2085012086014105746a2102208601213e02400240024002400240024002402086014104490d00200141f0006a41206a213c200141b0016a2109200141d0016a210a200141f0016a21870120014188016a210820014180016a2105200141f8006a210720022106208601213e0340200842003703002005420037030020074200370300200142003703700240203c2006460d00200641606a200141f0006a41201096040d030b20084200370300200542003703002007420037030020014200370370024020092006460d00200641406a200141f0006a41201096040d040b200842003703002005420037030020074200370300200142003703700240200a2006460d00200641a07f6a200141f0006a41201096040d050b20084200370300200542003703002007420037030020014200370370200641807f6a210202402087012006460d002002200141f0006a41201096040d060b203e417c6a213e2002210620022085016b41ff004b0d000b0b2002208501460d05203e417f6a2106200141f0006a41206a210820014188016a210520014180016a2107200141f8006a213e03402005420037030020074200370300203e420037030020014200370370024020082002460d00200241606a200141f0006a41201096040d060b2006417f6a2106208501200241606a2202470d000c060b0b203e417f6a21060c030b203e417e6a21060c020b203e417d6a21060c010b203e417c6a21060b200641016a220220860120860120024b1b2186010b2001418c016a203f360200200141f0006a41186a204036020020014184016a2041360200200141f0006a41106a201e360200200141fc006a201f360200200141f0006a41086a2202200e360200200141033a0074200141063a007041a886c5004100200141f0006a102c20014180026a41086a22064200370300200142003703800241e8b4c200411220014180026a1000200141e0016a41086a200629030037030020012001290380023703e001200141003602782001420137037020012086013602800220014180026a200141f0006a104102400240208601450d00208601410574213e4100200228020022066b21052001280270213c20012802742107208501210203400240200720056a411f4b0d00200641206a22082006490d2b20074101742209200820082009491b22084100480d2b024002402007450d00203c200720081027223c0d010c080b20081026223c450d070b200821070b203c20066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102203e41606a223e0d000b200141f8006a2006360200200120073602742001203c3602700c010b20022802002106200128027421072001280270213c0b200141e0016a4110203c2006100402402007450d00203c10230b0240208401450d0020850110230b20014180026a41086a22024200370300200142003703800241fab4c200411620014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e0012001208901360270200141e0016a4110200141f0006a410410042002420037030020014200370380024190b5c200411120014180026a10002006200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0c200128027041016a21020c010b410121020b20014180026a41086a2206420037030020014200370380024190b5c200411120014180026a1000200141e0016a41086a200629030037030020012001290380023703e00120012002360270200141e0016a4110200141f0006a410410040240208201450d0020830110230b2018a7450d28201710230c280b41ecb3c200201020081029000b41d4aac10041331021000b20084101102a000b41134101102a000b41334101102a000b41134101102a000b41334101102a000b41164101102a000b41364101102a000b2047203e1048000b41d4aac10041331021000b2009207c1048000b207c2009417f6a227b490d160b207c203e108c01000b4100213c0c050b4101213c0c060b4103213c0c080b4104213c0c080b4104213c0c080b410021020c110b410121020c100b410121020c0f0b410121020c0e0b410121020c0d0b410121020c0c0b410121020c0b0b410121020c0a0b410121020c090b410021020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b2079207a470d12410121020c160b207920616a22022079490d1a20792061742206200220022006491b2202ad2062862204206388a70d1a2004a72206205e480d1a024002402079450d00207820792064742006102722780d010c030b200610262278450d020b20022179410221020c150b2078207a2064746a2202207d3602042002207b360200207a20616a228001217a2080012065490d024101217f0c130b20064104102a000b02400240207f0e020001010b207c200920606a227b490d140240207c207b6b227d2065490d002044200920676c6a220220696a22082903002044207b20676c6a220620696a220529030022045a0d00200141e0016a206a6a22072006206a6a223c290300370300200141e0016a206b6a220a2006206b6a2211290300370300200141e0016a20586a2213200620586a2210290300370300200120062903003703e001200620022903003703002010200220586a29030037030020112002206b6a290300370300203c2002206a6a290300370300200520082903003703000240207d2064490d00200620726a29030020045a0d0041022106207e2108024003402008220220696a200220736a2903003703002002206a6a200220746a2903003703002002206b6a200220756a290300370300200220586a200220766a2903003703002002200220676a2208290300370300200620616a2206207d4f0d01200220726a2903002004540d000b0b200220676a21020b200220012903e001370300200220043703202002206a6a20072903003703002002206b6a200a290300370300200220586a20132903003703000b207b450d0e207e205b6a217e207b2109207d2077490d0c410021020c130b02400240024002402078208001221320606a2280012064746a2202280200450d00207820132064746a2207206d6a2802002205200228020422064d0d004102217a201341024d0d042078201320666a22022064746a2802042208200620056a4d0d014103217a201341034d0d042007206e6a280200200820056a4d0d010c050b20132064490d01200228020421062078201320666a22022064746a28020421080b20082006490d010b2013206c6a21020b2013200220616a227a4d0d03201320024d0d04207820022064746a2212280204223d20122802006a22022078207a2064746a220c280200220f490d052002203e4b0d062012205f6a2181012044200f20676c6a2211200c280204221020676c22066a2107200220676c2108024002400240024002402002200f6b223c20106b220220104f0d0020592007200220676c22061094041a205a20066a210520102061480d0120022061480d01205c20086a210820072102034020082002205b6a223c2005205b6a220a200520686a290300200220686a2903005422071b2206290300370300200820696a200620696a2903003703002008206a6a2006206a6a2903003703002008206b6a2006206b6a290300370300200820586a200620586a2903003703002005200a20071b21052011203c200220071b22024f0d042008205b6a2108205a2106205a2005490d000c050b0b2059201120061094041a205a20066a210520102061480d01203c20104c0d01204420086a210a205a2106201121020340200220072006200720696a290300200620696a29030054223c1b2208290300370300200220696a200820696a2903003703002002206a6a2008206a6a2903003703002002206b6a2008206b6a290300370300200220586a200820586a2903003703002006200620676a203c1b2106200220676a2102200720676a2007203c1b2207200a4f0d04200520064b0d000c040b0b200721020c010b201121020b205a21060b20022006200520066b220820082067706b1094041a208101203d20106a3602002012200f360200200c200c20586a207a20607320136a2064741095041a208001217a20800120614b0d0c0b207b0d060c010b2013217a207b0d060b02402079450d00207810230b2057450d11205910230c110b41b0a8c100207a20131029000b41b0a8c100200220131029000b200f20021048000b2002203e108c01000b4102213c0c010b4102213c0c010b410121020c0b0b410121020c0a0b4100217f0c030b4101217f0c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b207b207c1048000b2001203e360278200120423602742001204336027020014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e00120014110360284022001200141e0016a36028002200141f0006a20014180026a108f0202402042450d00204310230b2041203f10900220024200370300200142003703800241e8b4c200411220014180026a10002006200229030037030020012001290380023703e001410021820102400240024002400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a10282001280270228301450d02200141f8006a28020021840120012802742182010c010b410121830141002184010b200141d8006a4200370300200141d0006a4200370300200141c8006a420037030020014200370340208401ad2204421b88a70d042004420586a72202417f4c0d04024002402002450d00200210262285010d0120024101102a000b41012185010b200141f0006a41186a2208200141c0006a41186a290300370300200141f0006a41106a2205200141c0006a41106a290300370300200141f0006a41086a2207200141c0006a41086a290300370300200120012903403703700240024002402084014102490d00208401417f6a21062085012102034020022001290370370000200241186a2008290300370000200241106a2005290300370000200241086a2007290300370000200241206a21022006417f6a22060d000b208401417f6a2186010c010b41002186012085012102208401450d010b20022001290370370000200241186a200141f0006a41186a290300370000200241106a200141f0006a41106a290300370000200241086a200141f0006a41086a29030037000020860141016a2186010b2014201d41306c6a218701201aa721880141002189014158218a014150218b014178218c014118218d0120014180026a41186a218e014170218f01411021900120014180026a41106a2191014168219201410821930120014180026a41086a2194014160219501410121960141052197012019450d014103213c0c020b41d4aac10041331021000b4104213c410121020c010b410121020c000b0b101d000b101e000b2016450d00201510230b200141a0026a24000bf90504027f017e0f7f017e230041f0006b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241f0006a24000f0b4108210620030d030b4100210f4100210d0c030b101d000b20054108102a000b200241d0006a41186a2107200241d0006a41106a2108200141046a21094100210a4100210b4100210c2003210d024003402007420037030020084200370300200241d0006a41086a220e420037030020024200370350200141086a2205410020012802002009280200200241d0006a412020052802001001220f200f417f461b220f4120200f412049220f1b20052802006a2210360200200f0d01200241306a41186a22112007290300370300200241306a41106a22122008290300370300200241306a41086a2213200e29030037030020022002290350370330200242003703502005410020012802002009280200200241d0006a410820101001220f200f417f461b220f4108200f4108491b20052802006a360200200f41074d0d01200c41016a210f20022903502104200241106a41186a220e2011290300370300200241106a41106a22102012290300370300200241106a41086a22112013290300370300200220022903303703100240200c200d470d00200a200f200f200a491b220dad42287e2214422088a70d042014a722054100480d040240200c450d002006200b2005102722060d010c060b200510262206450d050b2006200b6a22052002290310370300200541186a200e290300370300200541106a2010290300370300200541086a2011290300370300200541206a2004370300200a41026a210a200b41286a210b200f210c200f2003490d000c020b0b200041003602000240200d450d00200610230b200241f0006a24000f0b2000200d36020420002006360200200041086a200f360200200241f0006a24000f0b101e000b20054108102a000b9e0403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d002003200041306c6a2104200241086a280200210520022802002106200228020421000340200341086a2903002107200329030021080240024002400240200020056b41104f0d00200541106a22092005490d062000410174220a20092009200a491b220a4100480d062000450d0120062000200a102722060d020c070b200541106a21090c020b200a10262206450d050b200a21000b200620056a22052007370008200520083700000240024002400240200020096b41204f0d00200941206a22052009490d062000410174220a20052005200a491b220a4100480d062000450d0120062000200a102722060d020c080b200941206a21050c020b200a10262206450d060b200a21000b200620096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032004470d000b200241086a20053602002002200036020420022006360200200128020020012802042006200510042000450d050c040b200228020421032001280200200128020420022802002206200241086a280200100420030d030c040b101e000b200a4101102a000b200a4101102a000b200610230b200241106a24000bce0506027f017e0b7f017e027f017e230041d0006b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad42307e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210d4100210c0c030b101d000b20054108102a000b200141046a2107200141086a2108200241306a41186a21094100210a4100210b410021052003210c0240034020024200370338200242003703302008410020012802002007280200200241306a411020082802001001220d200d417f461b220d4110200d4110491b20082802006a220e360200200d410f4d0d01200241306a41086a220f29030021042002290330211020094200370300200241306a41106a22114200370300200f4200370300200242003703302008410020012802002007280200200241306a4120200e1001220d200d417f461b220d4120200d4120491b20082802006a360200200d411f4d0d01200541016a210d200241106a41186a220e2009290300370300200241106a41106a22122011290300370300200241106a41086a2211200f2903003703002002200229033037031002402005200c470d00200a200d200d200a491b220cad42307e2213422088a70d042013a7220f4100480d0402402005450d002006200b200f102722060d010c060b200f10262206450d050b2006200b6a2205200437030820052010370300200541286a200e290300370300200541206a2012290300370300200541186a2011290300370300200541106a2002290310370300200a41026a210a200b41306a210b200d2105200d2003490d000c020b0b200041003602000240200c450d00200610230b200241d0006a24000f0b2000200c36020420002006360200200041086a200d360200200241d0006a24000f0b101e000b200f4108102a000b8603020c7f017e230041206b2201240020014100109102200141106a410110910202400240024020012802182202450d00410221032001280204210420012802082105200141186a210603402001280214210b2001280210210a024002400240200420056b200241216c220241216d220c4f0d002005200c6a220c2005490d0520044101742208200c200c2008491b2209ad42217e220d422088a70d05200da722074100480d050240024020040d00200710262208450d080c010b2001280200200441216c200710272208450d070b20012008360200200921042008200541216c6a200a20021094041a200b0d010c020b2005200c6a210c2001280200200541216c6a200a20021094041a200b450d010b200a10230b200141106a2003109102200341016a2103200c2105200628020022020d000b200141086a200c360200200120043602040b02402001280214450d00200128021010230b20002001290300370200200041086a200141086a280200360200200141206a24000f0b101e000b20074101102a000bad0301047f230041d0006b220224000240024002400240411310262203450d002003410f6a410028009cb642360000200341086a4100290095b6423700002003410029008db64237000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200128022021042003413341e60010272201450d0220012004360033200241306a41186a22034200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020014137200241306a1002200241186a2003290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a10920220022802302203450d0520002002290234370204200020033602000c010b20004100360208200042043702000b20011023200241d0006a24000f0b41134101102a000b41334101102a000b41e6004101102a000b41d4aac10041331021000bf50402057f037e230041c0006b2202240002400240411310262203450d002003410f6a41002800c5b542360000200341086a41002900beb542370000200341002900b6b54237000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034133200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d0020024100360220410020024120200241206a41044100100122012001417f461b220141034d0d022002280220210420024100360220410020024120200241206a41042001410420014104491b2205100122012001417f461b220141034d0d0220022802202106200242003703282002420037032020024120200241206a41102001410420014104491b20056a220110012205417f460d022005410f4d0d02200241286a290300210720022903202108200242003703282002420037032020024120200241206a4110200141107210012201417f460d022001410f4d0d0220022903202109200041206a200241286a290300370300200041186a2009370300200041106a2007370300200020083703082000412c6a2006360200200041286a2004360200200042013703000c010b200042003703000b20031023200241c0006a24000f0b41d4aac10041331021000b41134101102a000b41334101102a000ba00402087f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d002003200041286c6a2104200241086a220528020021002002280204210603400240024002400240200620006b41204f0d00200041206a22072000490d0620064101742208200720072008491b22094100480d062006450d01200228020020062009102722080d020c070b200041206a2107200228020021080c020b200910262208450d050b2002200936020420022008360200200921060b20052007360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a290300210a0240024002400240200620076b41084f0d00200741086a22002007490d0620064101742209200020002009491b22094100480d062006450d01200820062009102722080d020c080b200741086a21000c020b200910262208450d060b2002200936020420022008360200200921060b20052000360200200820076a200a3700002004200341286a2203470d000b200128020020012802042008200010042006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100420030d030c040b101e000b20094101102a000b20094101102a000b200810230b200241106a24000b840e05027f017e0d7f067e047f230022022103200241e0016b416071220224000240024002402001ad2204421b88a70d002004420586a72205417f4c0d000240024002402005450d00200510262206450d0441002107410021084100210520010d010c020b410121064100210741002108410021052001450d010b20014105742109416020006b210a2006210520002108034020052008290000370000200541186a200841186a290000370000200541106a200841106a290000370000200541086a200841086a290000370000200541206a2105200841206a2108200941606a22090d000b200020014105746a200a6a41057641016a2105200121080b20022005360218200220083602142002200636021020062005200241d8016a200741202005676b108901200241a0016a41086a22054200370300200242003703a0014188a8c4004118200241a0016a100020024180016a41086a2005290300370300200220022903a00137038001024002400240024002400240024020024180016a411041a886c500200720071001417f460d0020024210370244200220024180016a360240200241a0016a200241c0006a102820022802a001220b450d0920022802a401210c4105210d200241a8016a28020041057422000d010c020b4101210b4100210c4105210d41004105742200450d010b200241a0016a411472210e200241a0016a410872210f200b21050340200241206a41186a220a200541186a290000370300200241206a41106a2210200541106a290000370300200241206a41086a2211200541086a29000037030020022005290000370320200241c0006a200241206a10b603200241003602a80120022903582112200220022903b801221337035820022903502114200220022903b001221537035020022903402116200220022903a00137034020022903482104200220022903a80122173703482015422088a721062017422088a721012013a721072017a7210902402004a72208450d00200220163703a001200220043703a801200220143703b001200220123703b8012002418c016a221820082014a7200d746a36020020024180016a41086a2219200836020020024180016a41106a221a200241106a36020020022004422088a7360284012002200836028001200241f0006a20024180016a10ab02200f41086a200241f0006a41086a221b280200360200200f200229037037020020182014422088a722082012422088a7200d746a36020020192008360200201a200241106a36020020022012a7360284012002200836028001200241f0006a20024180016a10ab02200e41086a201b280200360200200e200229037037020020022903b801211720022903b001211220022903a801210420022903a001211402402009450d0002402001450d00200910230b2007450d00200610230b20022014370340200220043703482004422088a72101200220123703502012422088a72106200220173703582004a721092017a721070b41151026210802402009450d002008450d032008410d6a41002900ada844370000200841086a41002900a8a844370000200841002900a0a84437000020084115413510272208450d04200820022903203700152008412d6a200a290300370000200841256a20102903003700002008411d6a2011290300370000200241a0016a41186a220a4200370300200241a0016a41106a22104200370300200241a0016a41086a22114200370300200242003703a00120084135200241a0016a100220024180016a41186a200a29030037030020024180016a41106a201029030037030020024180016a41086a2011290300370300200220022903a00137038001200241203602a401200220024180016a3602a001200241c0006a200241a0016a10ad032008102302402001450d00200910230b02402007450d00200610230b200541206a2105200041606a22000d010c020b2008450d042008410d6a41002900ada844370000200841086a41002900a8a844370000200841002900a0a84437000020084115413510272208450d05200820022903203700152008412d6a200a290300370000200841256a20102903003700002008411d6a2011290300370000200241a0016a41186a22094200370300200241a0016a41106a22014200370300200241a0016a41086a22074200370300200242003703a00120084135200241a0016a100220024180016a41186a200929030037030020024180016a41106a200129030037030020024180016a41086a2007290300370300200220022903a0013703800120024180016a4120100320081023200541206a2105200041606a22000d000b0b0240200c450d00200b10230b02402002280214450d00200228021010230b200324000f0b41154101102a000b41354101102a000b41154101102a000b41354101102a000b101d000b20054101102a000b41d4aac10041331021000b9a0805057f017e0b7f017e017f230041a0016b220224000240024002400240024002400240024002400240410e10262203450d00200341066a41002900a6b642370000200341002900a0b6423700002003410e411c10272204450d012004200136000e200241c0006a41186a22034200370300200241c0006a41106a22014200370300200241c0006a41086a220542003703002002420037034020044112200241c0006a1002200241106a41186a2003290300370300200241106a41106a2001290300370300200241106a41086a2005290300370300200220022903403703100240024002400240200241106a412041a886c500410041001001417f460d00200242203702342002200241106a360230200241086a200241306a104a2002280208450d0b200228020c2206ad42217e2207422088a70d032007a72203417f4c0d032003450d01200310262208450d062006450d020c070b20004100360208200042013702000c080b4101210820060d050b4100210e420021072008450d080c050b101d000b410e4101102a000b411c4101102a000b20034101102a000b200241306a41086a220928020021012002280234210a2002280230210b420021074100210c4100210d410021032006210e0340200241003a004020092001200b200a200241c0006a41012001100141016a41014b22056a22013602002005450d034100210f024020022d00402205450d0020054101470d04200241c0006a41186a220f4200370300200241c0006a41106a22104200370300200241c0006a41086a221142003703002002420037034020094100200b200a200241c0006a41202001100122052005417f461b2205412020054120491b20016a22013602002005411f4d0d0420024180016a41186a200f29030037030020024180016a41106a201029030037030020024180016a41086a201129030037030020022002290340370380014101210f0b200341016a2105200241e0006a41186a221020024180016a41186a290300370300200241e0006a41106a221120024180016a41106a290300370300200241e0006a41086a221220024180016a41086a290300370300200220022903800137036002402003200e470d00200c20052005200c491b220ead42217e2213422088a70d062013a722144100480d0602402003450d002008200d2014102722080d010c080b201410262208450d070b2008200d6a2203200f3a0000200341196a2010290300370000200341116a2011290300370000200341096a2012290300370000200341016a200229036037000020074280808080107c2107200c41026a210c200d41216a210d2005210320052006490d000b2008450d030b20002007200ead84370204200020083602000b20041023200241a0016a24000f0b200e450d00200810230b41d4aac10041331021000b101e000b20144101102a000bc50303027f017e097f230041106b2202240020022001104a02400240024002400240024002400240024002402002280200450d0020022802042203ad2204421e88a70d032004420286a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241106a24000f0b4104210620030d030b410021054100210b0c030b101d000b20054104102a000b200141086a210741002108410021094100210a2003210b0340200141046a28020021052007280200210c2002410036020c20074100200128020020052002410c6a4104200c100122052005417f461b2205410420054104491b20072802006a360200200541034d0d02200a41016a2105200228020c210c0240200a200b470d002008200520052008491b220bad4202862204422088a70d042004a7220d4100480d040240200a450d0020062009200d102722060d010c060b200d10262206450d050b200620096a200c360200200841026a2108200941046a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610230b200241106a24000f0b101e000b200d4104102a000bce0304027f017e037f017e230041c0006b2204240002400240411810262205450d00200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0120052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a200429032021060c010b4200210a0b2005102320012006200220062006200256200a200356200a2003511b22051b22027d200a2003200a20051b22037d2006200254ad7d10fe012000200337030820002002370300200441c0006a24000f0b41d4aac10041331021000b41184101102a000b41384101102a000bf01004047f017e087f037e230041d0046b22022400200241186a200110450240024002400240024002400240024002402002280218450d00200241003a00a002200241a0026a200128020022032001280204220441004722051094041a20042005490d04200141046a200420056b3602002001200320056a3602002004450d0120022d00a002220441ff00714101470d022004411874411875417f4c0d03420221060c080b20004203370370200241d0046a24000f0b20004203370370200241d0046a24000f0b20004203370370200241d0046a24000f0b200241a8046a200110950202400240024020022d00a8044102460d0020024180046a41206a200241a8046a41206a28020036020020024180046a41186a200241a8046a41186a29030037030020024180046a41106a200241a8046a41106a29030037030020024180046a41086a200241a8046a41086a290300370300200220022903a80437038004200241a0026a41386a22074200370300200241a0026a41306a22084200370300200241a0026a41286a22094200370300200241a0026a41206a220a4200370300200241a0026a41186a220b4200370300200241a0026a41106a220c4200370300200241a0026a41086a220d4200370300200242003703a002200241a0026a20012802002203200141046a220e280200220441c000200441c000491b22051094041a200e200420056b3602002001200320056a3602002004413f4d0d0020024190036a41386a200729030037030020024190036a41306a200829030037030020024190036a41286a200929030037030020024190036a41206a200a29030037030020024190036a41186a200b29030037030020024190036a41106a200c29030037030020024190036a41086a200d290300370300200220022903a00237039003200241086a200110462002280208450d002002290310210f200141046a220e2802002104200241003a00a002200241a0026a20012802002207200441004722051094041a20042005490d04200e200420056b22033602002001200720056a22053602002004450d0020023100a0022210500d01200241003a00a002200241a0026a2005200341004722041094041a20032004490d05200141046a200320046b3602002001200520046a3602002003450d0042022010420f838622114204540d004201210620023100a0024208862010844204882011420c882210420120104201561b7e22102011540d020b420221060c050b420021060b20024188016a41206a20024180046a41206a28020036020020024188016a41186a20024180046a41186a29030037030020024188016a41106a20024180046a41106a29030037030020024188016a41086a20024180046a41086a290300370300200241b0016a41086a20024190036a41086a290300370300200241b0016a41106a20024190036a41106a290300370300200241b0016a41186a20024190036a41186a290300370300200241b0016a41206a20024190036a41206a290300370300200241b0016a41286a20024190036a41286a290300370300200241b0016a41306a20024190036a41306a290300370300200241b0016a41386a20024190036a41386a29030037030020022002290380043703880120022002290390033703b0010c030b200520041048000b200520041048000b200420031048000b20024190036a41206a220420024188016a41206a28020036020020024190036a41186a220520024188016a41186a29030037030020024190036a41106a220320024188016a41106a29030037030020024190036a41086a220e20024188016a41086a290300370300200241a0026a41086a2207200241b0016a41086a290300370300200241a0026a41106a2208200241b0016a41106a290300370300200241a0026a41186a2209200241b0016a41186a290300370300200241a0026a41206a220a200241b0016a41206a290300370300200241a0026a41286a220b200241b0016a41286a290300370300200241a0026a41306a220c200241b0016a41306a290300370300200241a0026a41386a220d200241b0016a41386a290300370300200220022903880137039003200220022903b0013703a002024020064202520d0020004203370370200241d0046a24000f0b200241e0006a41206a2004280200360200200241e0006a41186a2005290300370300200241e0006a41106a2003290300370300200241e0006a41086a200e290300370300200241206a41086a2007290300370300200241206a41106a2008290300370300200241206a41186a2009290300370300200241206a41206a200a290300370300200241206a41286a200b290300370300200241206a41306a200c290300370300200241206a41386a200d2903003703002002200229039003370360200220022903a0023703200b200241a0026a2001104420022802a002210120024190036a200241a0026a41047241ec001094041a02402001410e470d0020004203370370200241d0046a24000f0b200241b0016a20024190036a41ec001094041a2000200f37030020002002290360370308200041106a200241e0006a41086a290300370300200041186a200241e0006a41106a290300370300200041206a200241e0006a41186a290300370300200041286a200241e0006a41206a2802003602002000200229032037022c200041346a200241206a41086a2903003702002000413c6a200241206a41106a290300370200200041c4006a200241206a41186a290300370200200041cc006a200241206a41206a290300370200200041d4006a200241206a41286a290300370200200041dc006a200241d0006a290300370200200041e4006a200241d8006a29030037020020004188016a200136020020004180016a201037030020002011370378200020063703702000418c016a200241b0016a41ec001094041a200241d0046a24000b8c0701067f230041f0006b22022400200241003a0050200241d0006a200128020022032001280204220441004722051094041a02400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002402004450d0020022d0050220441ef014d0d02200441847e6a220441034b0d00024002400240024020040e0400010203000b200241003b0150200241d0006a20052006410220064102491b22041094041a200141046a200620046b3602002001200520046a360200200641014d0d0320022f0150220441f0014f0d050c030b20024100360250200241d0006a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d024101210120022802502204418080044f0d050c020b200141046a20062006410420064104491b22046b3602002001200520046a3602000c010b41002103200241d0006a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a200241d0006a200520041094041a200141046a200620046b3602002001200520046a360200024002402006411f4d0d00200241c8006a41026a200241d0006a41026a2d00003a0000200241306a200241df006a290000370300200241386a200241e7006a290000370300200241c0006a200241d0006a411f6a2d00003a0000200220022f00503b01482002200229005737032820022800532104410121030c010b0b200241cc006a41026a2201200241c8006a41026a2d00003a0000200241d0006a41086a2205200241286a41086a290300370300200241d0006a41106a2206200241286a41106a290300370300200241d0006a41186a2207200241286a41186a2d00003a0000200220022f01483b014c200220022903283703502003450d00200241246a41026a20012d00003a0000200241086a41086a2005290300370300200241086a41106a2006290300370300200241086a41186a20072d00003a0000200220022f014c3b012420022002290350370308410021010c030b200041023a0000200241f0006a24000f0b200520041048000b410121010b200020022f01243b0001200020013a0000200041046a2004360200200041086a2002290308370200200041036a200241266a2d00003a0000200041106a200241086a41086a290300370200200041186a200241086a41106a290300370200200041206a200241086a41186a280200360200200241f0006a24000b9d1707017f027e037f017e017f017e047f230041e0046b2202240002400240200129037022034202520d00200241086a20014188016a41f0001094041a420021030c010b200241b6016a2001410b6a2d00003a000020024198016a41086a2001411c6a29020037030020024198016a410d6a200141216a290000370000200220012f00093b01b40120022001290214370398012001410c6a280200210520012d0008210620012802102107200241f0016a200141e4006a290000370300200241e8016a200141dc006a290000370300200241e0016a200141d4006a290000370300200241d8016a200141cc006a290000370300200241d0016a200141c4006a290000370300200241b8016a41106a2001413c6a290000370300200241b8016a41086a200141346a2900003703002002200129002c3703b80120012903002108200241f8016a41106a200141f0006a220941106a290300370300200241f8016a41086a200941086a290300370300200220092903003703f8014200210a200241d8026a41086a220b4200370300200242003703d80241af98c300410d200241d8026a1000200241c0046a41086a200b290300370300200220022903d8023703c00442002104024002400240024002400240024002400240024002400240200241c0046a411041a886c500410041001001417f460d00200242003703d802200241c0046a4110200241d8026a41084100100141016a41084d0d0120022903d8022104200929030021030b024020034201520d002001290378220a500d02200420014180016a290300220320032004541b2204200420037d200a827d210a0b200241d8026a200a109702200241ac026a41026a20022d00da023a0000200241c0046a41086a2209200241eb026a290000370300200241c0046a410d6a220b200241f0026a290000370000200220022f01d8023b01ac02200220022900e3023703c00420022800db02210c20022800df02210d20024190026a410d6a200b29000037000020024190026a41086a2009290300370300200220022903c004370390022002418c046a41026a2209200241b4016a41026a2d00003a0000200241d8026a41086a220b20024198016a41086a290300370300200241d8026a410d6a220e20024198016a410d6a290000370000200220022f01b4013b018c0420022002290398013703d8020240024002400240024002400240200641ff01714101470d0020024190046a200541067610870120022802900421092002280298042005413f7122054d0d0120024188046a41026a200920054105746a220541026a2d00003a0000200241a8046a200541136a290000370300200241ad046a200541186a290000370000200220052f00003b0188042002200529000b3703a0042005280007210720052800032105410121062002280294040d020c030b20024188046a41026a20092d00003a0000200241a0046a41086a200b290300370300200241a0046a410d6a200e290000370000200220022f018c043b018804200220022903d8023703a0040c030b41002106200228029404450d010b200910230b2006450d010b20024190046a41026a20024188046a41026a2d00003a0000200241d8026a41086a200241a0046a41086a290300370300200241d8026a410d6a200241a0046a410d6a290000370000200220022f0188043b019004200220022903a0043703d802410021090c010b410121094115210741d9cac40021050b200241d4026a41026a220620024190046a41026a2d00003a0000200241c0046a41086a220b200241d8026a41086a220e290300370300200241c0046a41106a200241d8026a41106a290300370300200220022f0190043b01d402200220022903d8023703c00402402009450d002000200536020420004101360200200041086a200736020020014188016a1024200241e0046a24000f0b200241c3026a200b290300370000200241c8026a200241c0046a410d6a290000370000200220022f01d4023b01b002200220073600b702200220053600b302200220022903c0043700bb02200220062d00003a00b202200220083703d802200e20014188016a41f000109404210b200241ef036a200d360000200241eb036a200c360000200241d8026a4188016a200241f8016a41106a290300370300200241d8036a2201200241f8016a41086a290300370300200241ea036a200241ac026a41026a2d00003a0000200241f3036a200229039002370000200241fb036a20024190026a41086a29030037000020024180046a20024190026a410d6a290000370000200220022903f8013703d003200220022f01ac023b01e803200241003602c804200242013703c004200241d8026a200241c0046a109802200b200241c0046a103902400240024002400240024020022903d0034201520d0020012903002203420c882204420120044201561b22044200510d08200241e0036a290300200480210420022802c4042205200241c8046a28020022016b41024f0d01200141026a22092001490d0e20054101742201200920092001491b22014100480d0e2005450d0420022802c0042005200110272205450d050c0b0b024020022802c404200241c8046a2802002201470d00200141016a22052001490d0e20014101742209200520052009491b22094100480d0e2001450d0220022802c0042001200910272205450d030c090b20022802c00421050c090b20022802c00421050c0a0b2009102622050d060b20094101102a000b2001102622050d060b20014101102a000b41d4aac10041331021000b41e0fec400104f000b41b099c300104f000b200220093602c404200220053602c004200241c8046a28020021010b200241c8046a200141016a360200200520016a41003a00000c020b200220013602c404200220053602c004200241c8046a28020021010b200241c8046a200141026a360200200520016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b02400240024020022802c4042206200241c8046a28020022016b41204f0d00200141206a22052001490d0320064101742201200520052001491b22094100480d032006450d0120022802c0042006200910272205450d020c040b20022802c00421050c040b2009102622050d020b20094101102a000b101e000b200220093602c404200220053602c004200241c8046a2802002101200921060b200520016a2209200241e8036a2207290000370000200941186a200741186a290000370000200941106a200741106a290000370000200941086a200741086a2900003700000240024002400240200141206a2201418102490d00200241c0046a41186a22094200370300200241c0046a41106a22074200370300200241c0046a41086a220c4200370300200242003703c00420052001200241c0046a1002200241a0046a41186a2009290300370300200241a0046a41106a2007290300370300200241a0046a41086a200c290300370300200220022903c0043703a004200241a0046a4120200241b8016a200241b0026a1011450d01200241a0046a4120200241b8016a200241b0026a101245210120060d020c030b20052001200241b8016a200241b0026a1011450d0020052001200241b8016a200241b0026a101245210120060d010c020b410121012006450d010b200510230b02402001450d00200241f8006a41186a200241b0026a41186a290300370300200241f8006a41106a200241b0026a41106a290300370300200241f8006a41086a200241b0026a41086a290300370300200220022903b00237037820022903d8022104200241086a200b41f0001094041a420121030c010b200041eecac40036020420004101360200200041086a411a360200200b1024200241e0046a24000f0b200041106a2002290378370300200041086a2003370300200041306a2004370300200041186a200241f8006a41086a290300370300200041206a200241f8006a41106a290300370300200041286a200241f8006a41186a290300370300200041386a200241086a41f0001094041a20004100360200200241e0046a24000ba40301057f230041c0006b2202240002400240411010262203450d00200341086a410029009299433700002003410029008a994337000020034110412010272203450d0120032001370010200241206a41186a22044200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034118200241206a1002200241186a2004290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d002004420037030020054200370300200241286a42003703002002420037032020024120200241206a4120410010012204417f460d022004411f4d0d0220002002290320370000200041186a200241206a41186a290300370000200041106a200241206a41106a290300370000200041086a200241206a41086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b20031023200241c0006a24000f0b41d4aac10041331021000b41104101102a000b41204101102a000bc00903017f017e057f230041e0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002903002203423f560d00200141046a280200200141086a2802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d0520012802002000200510272204450d060c190b2003428080015a0d01200141046a2802002204200141086a28020022006b41024f0d02200041026a22052000490d1020044101742200200520052000491b22004100480d102004450d0820012802002004200010272204450d090c160b200128020021040c180b20034280808080045a0d01200141046a2802002204200141086a28020022006b41044f0d04200041046a22052000490d0e20044101742200200520052000491b22004100480d0e2004450d08200128020020042000102722040d090c120b200128020021040c140b4108200379a74103766b22064104490d0e200141046a280200200141086a2802002205470d03200541016a22042005490d0c20054101742207200420042007491b22044100480d0c2005450d09200128020020052004102722070d0a0c110b2005102622040d130b20054101102a000b200128020021040c050b200128020021070c070b2000102622040d0d0b20004101102a000b200010262204450d090b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a7410274410272360000200241e0006a24000f0b200410262207450d070b20012007360200200141046a2004360200200141086a28020021050b200141086a2204200541016a360200200720056a200641027441736a3a0000200220002903002203370308200141046a210703400240024002400240200728020020042802002200470d00200041016a22052000490d0520004101742208200520052008491b22084100480d052000450d01200128020020002008102722050d020c060b200128020021050c020b200810262205450d040b2001200536020020072008360200200428020021000b2004200041016a360200200520006a2003a73a0000200342088821032006417f6a22060d000b20022003370308200350450d03200241e0006a24000f0b101e000b20084101102a000b41d498c400104f000b2002200241086a360240200241f098c400360244200241c8006a41146a4100360200200241286a41146a4103360200200241346a4122360200200241106a41146a4103360200200241a886c5003602582002420137024c200241f898c4003602482002412236022c20024203370214200241d480c5003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a418099c4001061000b20004101102a000b20044101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b0000200241e0006a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a0000200241e0006a24000bc92c06057f027e027f017e0d7f097e230041b0026b2203240041012104024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022054101460d0020054102470d1520034190016a41026a200141076a2d00003a0000200341286a41086a2204200141186a290200370300200341286a410d6a22062001411d6a290000370000200320012f00053b0190012003200141106a2902003703284128210720022d000120022d000072450d0141b394c30021050c200b200141306a2903002108200141286a2903002109200341246a41026a200141076a2d00003a0000200341086a41086a200141186a290200370300200341086a410d6a2001411d6a290000370000200320012f00053b01242003200141106a290200370308200141086a28020021062001410c6a280200210a20012d0004210b2002411a6a290100210c200241196a2d0000210d200241186a2d0000210e200241166a2f0100210f200241156a2d00002110200241146a2d00002111200241126a2f01002112200241116a2d00002113200241106a2d000021142002410e6a2f010021152002410d6a2d00002116200241046a2d00002117200241026a2f01002118412a21074100210141db94c300210520022d0000450d01410021190c020b200141c0006a2903002108200141386a290300210c200141306a2903002109200141286a290300211a2001410c6a2802002107200141086a280200210520012d000421012003418c016a41026a220220034190016a41026a2d00003a0000200341c0016a41086a2004290300370300200341c0016a410d6a2006290000370000200320032f0190013b018c01200320032903283703c001200141ff01714101470d02200341086a20054106761087012003280208210220032802102005413f7122014d0d0920034188016a41026a200220014105746a220141026a2d00003a0000200341f8006a200141136a290000370300200341fd006a200141186a290000370000200320012f00003b0188012003200129000b370370200128000721072001280003210541012101200328020c0d0a0c0b0b41012104410021014100211920022d00014101470d002002410c6a2d000021012002410a6a2f01002119200241096a2d00002107200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021040b201941ffff0371410874200141187472200741ff017172210720040d1c2003200c3703402003200d3a003f2003200e3a003e2003200f3b013c200320103a003b200320113a003a200320123b0138200320133a0037200320143a0036200320153b0134200320163a00332003200736002f2003200536002b200320173a002a200320183b01282003418c016a41026a2201200341246a41026a2d00003a0000200341c0016a41086a2202200341086a41086a290300370300200341c0016a410d6a2205200341086a410d6a290000370000200320032f01243b018c01200320032903083703c0010240200b41ff01714101470d0020034190016a200641067610870120032802900121022003280298012006413f7122014d0d0220034188016a41026a200220014105746a220141026a2d00003a0000200341f8006a200141136a290000370300200341fd006a200141186a290000370000200320012f00003b0188012003200129000b3703702001280007210a20012800032106410121012003280294010d030c040b20034188016a41026a20012d00003a0000200341f0006a41086a2002290300370300200341f0006a410d6a2005290000370000200320032f018c013b018801200320032903c0013703700c040b20034188016a41026a20022d00003a0000200341f0006a41086a200341c0016a41086a290300370300200341f0006a410d6a200341c0016a410d6a290000370000200320032f018c013b018801200320032903c0013703700c090b41002101200328029401450d010b200210230b2001450d010b20034190016a41026a20034188016a41026a2d00003a0000200341c0016a41086a200341f0006a41086a290300370300200341c0016a410d6a200341f0006a410d6a290000370000200320032f0188013b019001200320032903703703c001410021010c010b410121014115210a41d9cac40021060b200341cc006a41026a220220034190016a41026a2d00003a0000200341a0016a41086a2205200341c0016a41086a290300370300200341a0016a41106a200341c0016a41106a290300370300200320032f0190013b014c200320032903c0013703a00102402001450d00200a2107200621050c160b200341e3006a2005290300370000200341e8006a200341ad016a290000370000200320032f014c3b01502003200a36005720032006360053200320032903a00137005b200320022d00003a0052411410262201450d0c200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d0d200120032903283700142001412c6a200341286a41186a290300370000200141246a200341286a41106a2903003700002001411c6a200341286a41086a2903003700004200210c200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22074200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2007290300370300200320032903c0013703a001200341a0016a412041a886c500410041001001417f460d06200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d0b2002410f4d0d0b200341c8016a290300211a20032903c001210c2001102341142102411410262201450d070c140b41002101200328020c450d010b200210230b2001450d010b200341086a41026a20034188016a41026a2d00003a0000200341c0016a41086a200341f0006a41086a290300370300200341c0016a410d6a200341f0006a410d6a290000370000200320032f0188013b0108200320032903703703c001410021010c010b410121014115210741d9cac40021050b200341cc006a41026a2202200341086a41026a2d00003a0000200341a0016a41086a2204200341c0016a41086a290300370300200341a0016a41106a200341c0016a41106a290300370300200320032f01083b014c200320032903c0013703a00120010d0f200341e3006a2004290300370000200341e8006a200341ad016a290000370000200320032f014c3b01502003200736005720032005360053200320032903a00137005b200320022d00003a0052411410262201450d0a200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d0b200120032903503700142001412c6a200341d0006a41186a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a2903003700004200211d200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22044200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2004290300370300200320032903c0013703a001200341a0016a412041a886c500410041001001417f460d02200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d082002410f4d0d08200341c8016a290300211b20032903c001211d0c030b4200211a20011023411421024114102622010d0d0b20024101102a000b4200211b0b2001102302400240201d201a5a201b20095a201b20095122011b0d002003201a201d7d3703c00120032009201b7d201a201d54ad7d3703c8012003200341c0016a3602a001200341a0016a107b0c010b201d201a58201b20095820011b0d002003201d201a7d3703c0012003201b20097d201d201a54ad7d3703c8012003200341c0016a3602a001200341a0016a10de010b200341d0006a201a200910df01411810262201450d08200141106a410029008db741370000200141086a4100290085b741370000200141002900fdb64137000020014118413810272201450d0920012003290350370018200141306a200341d0006a41186a290300370000200141286a200341d0006a41106a290300370000200141206a200341d0006a41086a29030037000042002109200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22044200370300200342003703c00120014138200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2004290300370300200320032903c0013703a00102400240200341a0016a412041a886c500410041001001417f460d00200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d072002410f4d0d07200341c8016a290300211a20032903c00121090c010b4200211a0b20011023024002402009200c5a201a20085a201a20085122011b0d002003200c20097d3703c00120032008201a7d200c200954ad7d3703c8012003200341c0016a3602a001200341a0016a107b0c010b2009200c58201a20085820011b0d0020032009200c7d3703c0012003201a20087d2009200c54ad7d3703c8012003200341c0016a3602a001200341a0016a10de010b200341d0006a200c200810fe01410021050c0b0b200341d4016a4101360200200341013602a4012003418898c4003602a001200342013702c401200341d497c4003602c0012003200341a0016a3602d001200341c0016a41e0b7c1001061000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41184101102a000b41384101102a000b200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b6413700000240024002400240024020012002413410272201450d00200120032903503700142001412c6a200341d0006a41186a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22074200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2007290300370300200320032903c0013703a001024002400240200341a0016a412041a886c500410041001001417f460d00200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d022002410f4d0d02200341c8016a290300211b20032903c001211c0c010b4200211c4200211b0b20011023200341c0016a41086a22014200370300200342003703c0010240024002400240201c201b84221e4200510d0041d8b9c2004114200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d02200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d062001410f4d0d06200341c8016a290300211f0c010b41c4b9c2004114200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d01200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d062001410f4d0d06200341c8016a290300211f0b20032903c00121200c010b420021204200211f0b0240200920207c222120095422012008201f7c2001ad7c221d200854201d2008511b450d004128210741ecb9c20021050c070b0240200c20217d2222200c56201a201d7d200c202154ad7d220c201a56200c201a511b450d00411d21074182bcc40021050c070b201e4200520d05200341c0016a41086a22014200370300200342003703c0014182b6c100411b200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d05200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d042001410f4d0d0420032903c001200956200341c8016a290300221a200856201a2008511b450d05411f2107419fbcc40021050c060b41d4aac10041331021000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b2003200341286a41022022200c108302024020032802002205450d00200328020421070c010b0240201c20097c221d201c542201201b20087c2001ad7c221a201b54201a201b511b450d00412d210741bebcc40021050c010b024002400240200341286a200341d0006a4120109604450d00200341286a2022200c10df01411410262201450d01200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d02200120032903503700142001412c6a200341d0006a41186a2202290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341c0016a41186a22054200370300200341c0016a41106a22074200370300200341c0016a41086a22044200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2005290300370300200341a0016a41106a2007290300370300200341a0016a41086a2004290300370300200320032903c0013703a001200341a0016a412041a886c50041004100100121052001102302402005417f470d00200341d0006a10e001200341f8016a201a370300200341f0016a201d370300200341c0016a41086a41003a0000200341c9016a2003290350370000200341d1016a200341d0006a41086a290300370000200341d9016a200341e0006a290300370000200341e1016a2002290300370000200341023a00c00141a886c5004100200341c0016a102c0b200341d0006a201d201a10df012003201f3703c801200320203703c0012003200341c0016a3602a001200341a0016a10de01200341c0016a41086a41023a0000200341c9016a2003290328370000200341d1016a200341286a41086a290300370000200341d9016a200341286a41106a290300370000200341e1016a200341286a41186a290300370000200341e9016a2003290350370000200341f1016a200341d0006a41086a290300370000200341f9016a200341d0006a41106a29030037000020034181026a2002290300370000200341023a00c001200341a8026a201f370300200341a0026a202037030020034198026a200837030020034190026a200937030041a886c5004100200341c0016a102c0b410021050c020b41144101102a000b41344101102a000b2000200736020420002005360200200341b0026a24000bb2be0117197f027e107f017e107f017e037f027e107f017e0f7f027e017f027e0a7f027e117f0a7e2e7f017e087f017e197f230041d0036b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441094b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0a00060304010708050902000b200141086a28020021052001280204210620022d00000d0a4101210720022d00014101470d0a200241196a2d00002104200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241086a2d00002114200241066a2f01002115200241056a2d00002116200241046a2d00002117200241026a2f010021182001410c6a2802002119200141146a280200211a200141106a280200211b20032002411a6a29010037038002200320043a00ff01200320083a00fe01200320093b01fc012003200a3a00fb012003200b3a00fa012003200c3b01f8012003200d3a00f7012003200e3a00f6012003200f3b01f401200320103a00f301200320173a00ea01200320183b01e801200320132012410874201141187472723600ef01200320162015410874722014411874723600eb01200320193602b003200320053602ac03200320063602a803200341086a200341e8016a200341a8036a201b201a109b02200328020c21022003280208210441002108200128020022054101470d510c500b200128020421092002411a6a290100211c200241196a2d0000210a200241186a2d0000210b200241166a2f0100210c200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d00002113200241046a2d00002114200241026a2f0100211541db94c3002104412a210520022d0000450d0b4101210741002108410021060c0c0b20022d000120022d0000720d07200141086a290300211c200341a8036a41086a22024200370300200342003703a80341d8b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8012003201c3703e801200341d8016a4110200341e8016a410810040c4c0b200141216a290000211d200141206a2d0000211e2001411d6a2f0000211f2001411c6a2d00002120200141196a2f00002121200141186a2d00002122200141156a2f00002123200141146a2d00002124200141106a28020021252001410c6a2802002126200141086a2d00002127200141306a28020021282001412c6a280200210620012d001f212920012d001b212a20012d0017212b20012d000b212c20012f0009212d200128020421082002411a6a290100212e200241196a2d0000212f200241186a2d00002130200241166a2f01002131200241156a2d00002132200241146a2d00002133200241126a2f01002134200241116a2d00002135200241106a2d000021362002410e6a2f010021372002410d6a2d00002138200241046a2d00002139200241026a2f0100213a412a211141db94c300210420022d0000450d0b4101213b4100213c4100213d0c0c0b200128020421152002411a6a290100211c200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211441db94c3002104412a210520022d0000450d0c4101210741002108410021060c0d0b20022d000120022d0000720d04200141086a280200210420012d00044101470d11200341e8016a200441067610870120032802e801213e20032802f0012004413f7122024d0d14203e20024105746a2202290018213f20022d0017210720022d0016210a20022f0014210b20022d0013210c20022d0012211220022f0010211420022d000f211520022d000e211620022f000c211a20022d000b2140200228000721412002280003210420022d0002213c20022f000021424101210520032802ec01450d3d0c3c0b200141086a28020021052001280204210620022d00000d0520022d00014101470d052001410c6a2802002118200141146a2802002119200141106a280200211a200241196a2d00002104200241186a2d00002107200241166a2f01002108200241156a2d00002109200241146a2d0000210a200241126a2f0100210b200241116a2d0000210c200241106a2d0000210d2002410e6a2f0100210e2002410d6a2d0000210f2002410c6a2d000021102002410a6a2f01002111200241096a2d00002112200241086a2d00002113200241066a2f01002114200241056a2d00002115200241046a2d00002116200241026a2f0100211720032002411a6a2901003703c003200320043a00bf03200320073a00be03200320083b01bc03200320093a00bb032003200a3a00ba032003200b3b01b8032003200c3a00b7032003200d3a00b6032003200e3b01b4032003200f3a00b303200320163a00aa03200320173b01a803200320122011410874201041187472723600af03200320152014410874722013411874723600ab03200341e8016a200341a8036a104220032d00e8014101470d14200341f4016a2d00002102200341f5016a290000211c200341fd016a280000210420032f00e901210720032d00eb01210820032902ec012143200320034181026a29000037038002200320043602fc012003201c3702f401200320023a00f301200320433700eb01200320083a00ea01200320073b01e801200320183602b003200320053602ac03200320063602a803200341106a200341e8016a200341a8036a201a2019109b0220032802142102200328021021044101210841002107200128020022054101470d4b0c4a0b200141386a290300211c200141306a29030021432001411d6a29000021442001411c6a2d00002145200141196a2f00002146200141186a2d00002147200141156a2f00002148200141146a2d00002149200141116a2f0000214a200141106a2d0000214b2001410c6a280200214c200141086a280200214d200141286a280200214e20012d001b214f20012d0017215020012d0013215120012d0007215220012f0005215320012d000421542002411a6a2901002155200241196a2d00002156200241186a2d00002157200241166a2f01002158200241156a2d00002159200241146a2d0000215a200241126a2f0100215b200241116a2d0000215c200241106a2d0000215d2002410e6a2f0100215e2002410d6a2d0000215f200241046a2d00002160200241026a2f0100216141db94c3002104412a211820022d0000450d0b4101216241002163410021640c0c0b20022d000120022d0000720d0120012802042102200341a8036a41086a22044200370300200342003703a80341b0b3c2004114200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200320023602e801200341d8016a4110200341e8016a410410040c460b20022d000120022d000072450d0b0b41b394c3002104412821020c480b41db94c3002104412a210241002108410121072005450d4020061023200128020022054101470d460c450b41db94c3002104412a210241012108410021072005450d3f0c340b41012107410021084100210620022d00014101470d002002410c6a2d000021062002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021070b200841ffff0371410874200541ff017172200641187472210220070d3c2003201c370398032003200a3a0097032003200b3a0096032003200c3b0194032003200d3a0093032003200e3a0092032003200f3b019003200320103a008f03200320113a008e03200320123b018c03200320133a008b0320032002360087032003200436008303200320143a008203200320153b018003411610262202450d192002410e6a41002900e1b641370000200241086a41002900dbb641370000200241002900d3b64137000020024116413610272204450d1a20042003290380033700162004412e6a20034180036a41186a290300370000200441266a20034180036a41106a290300370000411e21022004411e6a20034180036a41086a290300370000200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120044136200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803200341a8036a412041a886c500410041001001210520041023419ebdc20021042005417f470d3c200341a8036a41086a22024200370300200342003703a80341fab4c2004116200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210b0240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d1920032802e801210b0b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210c200341d8016a411041a886c500410041001001417f460d12200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a102820032802e801220d450d1e200341f0016a280200210520032802ec01210c200b2009460d130c140b4101213b4100213c4100213d20022d00014101470d002002410c6a2d0000213c2002410a6a2f0100213d200241096a2d00002111200241066a2f0100410874200241056a2d000072200241086a2d00004118747221044100213b0b203d41ffff0371410874203c41187472201141ff0171722102203b0d3a2003202e3703a8012003202f3a00a701200320303a00a601200320313b01a401200320323a00a301200320333a00a201200320343b01a001200320353a009f01200320363a009e01200320373b019c01200320383a009b0120032002360097012003200436009301200320393a0092012003203a3b019001202741ff01714101470d2f200341e8016a202641067610870120032802e801210420032802f0012026413f7122024d0d08200420024105746a2202290018211d20022d0017211e20022d0016212920022f0014211f20022d0013212020022d0012212a20022f0010212120022d000f212220022d000e212b20022f000c212320022d000b21242002280007213b2002280003213c20022d0002212c20022f0000212d4101211120032802ec01450d2e0c2d0b41012107410021084100210620022d00014101470d002002410c6a2d000021062002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021070b200841ffff0371410874200541ff017172200641187472210220070d382003201c37039803200320093a0097032003200a3a0096032003200b3b0194032003200c3a0093032003200d3a0092032003200e3b0190032003200f3a008f03200320103a008e03200320113b018c03200320123a008b0320032002360087032003200436008303200320133a008203200320143b018003200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d0341e8bcc2002104411e21020c380b41012162410021634100216420022d00014101470d002002410c6a2d000021642002410a6a2f01002163200241096a2d00002118200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021620b206341ffff0371410874201841ff017172206441187472210220620d36200320553703f002200320563a00ef02200320573a00ee02200320583b01ec02200320593a00eb022003205a3a00ea022003205b3b01e8022003205c3a00e7022003205d3a00e6022003205e3b01e4022003205f3a00e302200320023600df02200320043600db02200320603a00da02200320613b01d8022043201c844200510d03205441ff01714101470d28200341e8016a204d41067610870120032802e801210420032802f001204d413f7122024d0d0a200420024105746a2202290018214420022d0017214520022d0016214f20022f0014214620022d0013214720022d0012215020022f0010214820022d000f214920022d000e215120022f000c214a20022d000b214b200228000721622002280003216320022d0002215220022f000021534101211820032802ec01450d270c260b200141086a290300211c200341a8036a41086a22024200370300200342003703a8034194b4c200411c200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8012003201c3703e801200341d8016a4110200341e8016a410810040c390b411310262202450d132002410f6a41002800c5b542360000200241086a41002900beb542370000200241002900b6b54237000020024113413310272204450d142004200329038003370013411821022004412b6a20034180036a41186a290300370000200441236a20034180036a41106a2903003700002004411b6a20034180036a41086a290300370000200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120044133200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803200341a8036a412041a886c5004100410010012105200410232005417f460d09200341a8036a2015410676109102410021052015413f71220420032802b0034f0d0520032802a803200441216c6a22042d00004101470d0520042f00012107200441196a290000211c200441186a2d00002108200441176a2d00002106200441156a2f00002109200441146a2d0000210a200441136a2d0000210b200441116a2f0000210c200441106a2d0000210d2004410f6a2d0000210e2004410d6a2f0000210f2004410c6a2d00002110200441086a2800002111200441046a2800002112200441036a2d000021044101210520032802ac030d060c070b2001410c6a2802002102200141106a2d00002140200141116a2f0000211a200141146a2d00002115200141156a2f00002114200141186a2d0000210c200141196a2f0000210b2001411c6a2d000021072001411d6a290000213f20012f0005214220012d0007213c20012d0013211620012d0017211220012d001b210a0c2c0b41f0bdc200210441d00021020c320b4100211120032802ec010d240c250b4100210520032802ec010d270c280b4194bac2002104410b2102410121084100210720050d250c300b20032802ac03450d010b20032802a80310230b2005450d052003201c37038002200320083a00ff01200320063a00fe01200320093b01fc012003200a3a00fb012003200b3a00fa012003200c3b01f8012003200d3a00f7012003200e3a00f6012003200f3b01f401200320103a00f301200320113600ef01200320123600eb01200320043a00ea01200320073b01e801200341e8016a20034180036a4120109604450d0641b7bcc2002104411921020c2c0b4100211820032802ec010d1b0c1c0b4186bdc20021040c2a0b4101210d41002105200b2009470d010b20052009460d0c0b41bcbdc200210441162102200520094d0d0c20034180026a4200370300200341f8016a4200370300200341f0016a4200370300200342003703e801200d20094105746a2207200341e8016a460d0b2007200341e8016a41201096040d0c0c0b0b41d0bcc20021040c260b20034180036a2015109c024200211c200341a8036a41086a22024200370300200342003703a80341a5bcc2004112200341a8036a1000200341d8016a41086a22042002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703b003200342003703a803200341d8016a4110200341a8036a4110410010012205417f460d0a2005410f4d0d0a200341b0036a290300214320032903a80321550c010b42002155420021430b20034180036a20552043102b200342e3ded5f3b6ac9ab6f3003703900120024200370300200342003703a80341af98c300410d200341a8036a100020042002290300370300200320032903a8033703d8010240200341d8016a411041a886c500410041001001417f460d00200342003703a803200341d8016a4110200341a8036a41084100100141016a41084d0d0720032903a803211c0b2003201c3703b801200341a8036a20034180036a10800220032802ac03210420032802a803210220032802b0032105200341bc036a20034190016a36020020032002200541286c6a3602b403200320023602b003200320043602ac03200320023602a8032003200341b8016a3602b803200341d8026a200341a8036a109d02200341a8036a41086a200341d8026a41086a280200360200200320032903d8023703a80320034180036a200341a8036a1087020c290b200341fc016a4101360200200341013602ac032003418898c4003602a803200342013702ec01200341d497c4003602e8012003200341a8036a3602f801200341e8016a41b4b9c2001061000b41d4aac10041331021000b41164101102a000b41364101102a000b41134101102a000b41334101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b4200211c200341a8036a41086a22024200370300200342003703a80341a1b5c2004115200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d042002410f4d0d04200341f0016a290300211c20032903e80121430c010b420921430b200341386a20034180036a2043201c105b2003280238450d0141d2bdc2002104411e21020b200c450d1a200d10230c1a0b200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021070240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0220032802e80121070b411610262202450d022002410e6a41002900e1b641370000200241086a41002900dbb641370000200241002900d3b64137000020024116413610272202450d0320022003290380033700162002412e6a20034180036a41186a290300370000200241266a20034180036a41106a2903003700002002411e6a20034180036a41086a290300370000200341e8016a41186a22044200370300200341e8016a41106a22084200370300200341e8016a41086a22064200370300200342003703e80120024136200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2008290300370300200341a8036a41086a2006290300370300200320032903e8013703a803410410262204450d042004200736000020044104410810272204450d0520042009360004200341a8036a4120200441081004200410232002102302400240024020052009470d00200341e8016a41186a220420034180036a41186a290300370300200341e8016a41106a220520034180036a41106a290300370300200341e8016a41086a220720034180036a41086a29030037030020032003290380033703e801200c2009470d0a200941016a22022009490d1720094101742208200220022008491b220cad420586221c422088a70d17201ca722024100480d172009450d01200d200941057420021027220d450d020c0a0b200341e8016a41186a220420034180036a41186a290300370300200341e8016a41106a220720034180036a41106a290300370300200341e8016a41086a220820034180036a41086a29030037030020032003290380033703e801200520094d0d08200d20094105746a220220032903e801370000200241186a2004290300370000200241106a2007290300370000200241086a20082903003700000c0a0b20021026220d0d080b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b41164101102a000b41364101102a000b41044101102a000b41084101102a000b41d8b4c200200920051029000b200d20094105746a220220032903e801370000200241186a2004290300370000200241106a2005290300370000200241086a2007290300370000200941016a21050b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341003602f001200342013703e801200320053602a803200341a8036a200341e8016a10410240024002402005450d00200541057421064100200341e8016a41086a28020022046b210720032802e801210920032802ec012108200d210203400240200820076a411f4b0d00200441206a22052004490d102008410174220a20052005200a491b22054100480d10024002402008450d00200920082005102722090d010c060b200510262209450d050b200521080b200920046a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a290000370000200741606a2107200441206a2104200241206a2102200641606a22060d000b200341f0016a2004360200200320083602ec01200320093602e8010c010b200341e8016a41086a280200210420032802ec01210820032802e80121090b200341d8016a411020092004100402402008450d00200910230b0240200c450d00200d10230b200341a8036a41086a22024200370300200342003703a80341fab4c2004116200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410121072003200b41016a3602e801200341d8016a4110200341e8016a41041004410021040c160b20054101102a000b200410230b206341d9cac40020181b21042062411520181b21022018450d0e2004214d2002214c0b2003204437039803200320453a0097032003204f3a009603200320463b019403200320473a009303200320503a009203200320483b019003200320493a008f03200320513a008e032003204a3b018c032003204b3a008b032003204c360087032003204d36008303200320523a008203200320533b018003200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d80141002102024002400240024002400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0120032802e80121020b02400240024002402002204e470d00200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d012003200341d8016a3602a803200341103602ac03200342003703e80120034100200341d8016a4110200341e8016a41084100100122022002417f461b22024108200241084922041b22023602b00320040d06200341003602e801200341b0036a4100200341d8016a4110200341e8016a41042002100122042004417f461b22044104200441044922041b20026a36020020040d06200341e8016a200341a8036a102820032802e8012262450d0620032902ec01214442002155200341a8036a41086a22024200370300200342003703a8034190c1c200411c200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d02200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d072002410f4d0d07200341f0016a290300215520032903e80121650c030b41edbec2002104411121020c1b0b41c0bec2002104412d21020c1a0b420121650b200341a8036a41086a22024200370300200342003703a80341acc1c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021020240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0220032802e80121020b20034180016a206520552002ad4200109804411410262202450d0520034180016a41086a29030021552003290380012165200241106a41002800f9b641360000200241086a41002900f1b641370000200241002900e9b64137000020024114413410272202450d06200220032903d8023700142002412c6a200341d8026a41186a290300370000200241246a200341d8026a41106a2903003700002002411c6a200341d8026a41086a29030037000042002168200341e8016a41186a22044200370300200341e8016a41106a22184200370300200341e8016a41086a22634200370300200342003703e80120024134200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2018290300370300200341a8036a41086a2063290300370300200320032903e8013703a80302400240200341a8036a412041a886c500410041001001417f460d00200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012204417f460d062004410f4d0d06200341f0016a290300216920032903e80121680c010b420021690b2002102302402068206554206920555420692055511b450d0041afbfc2002104412e21022044a70d180c190b200341a8036a41086a22024200370300200342003703a80341c2b4c2004113200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8010240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a108b0220032802e8012218450d0e200341e8016a41086a2802002263450d0f20032802ec0121644180c0c2002104412321022018290300204354201841086a2903002269201c542069201c511b450d0341082158200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d80141002159200341d8016a411041a886c500410041001001417f460d01200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a10890220032802e8012258450d10200341f0016a280200215a20032802ec0121590c020b41febec2002104413121022044a70d1d0c1e0b4100215a0b2058205a41286c6a2157205821044100214d024002400240024002400340205720046b419f014d0d01200420034180036a460d02204d200420034180036a412010960422564100476a214d2056450d02200441286a225620034180036a460d02204d205620034180036a412010960422564100476a214d2056450d02200441d0006a225620034180036a460d02204d205620034180036a412010960422564100476a214d2056450d02200441f8006a225620034180036a460d02200441a0016a2104204d205620034180036a412010960422564100476a214d20560d000c020b0b20572004460d012058205a41286c6a2157034020034180036a2004460d01204d200420034180036a412010960422564100476a214d2056450d012057200441286a2204470d000c020b0b204d2044422088a74f0d010b02402059450d00205810230b20034190016a108c02200341e8016a20034180036a10ef0120032802e8014101470d01200328029001214d2003280298012204450d0520032802ec01216a4121216b204d200441216c6a216c4108216d200341f0016a2802002204410876216e4101216f41012004411f71742170417f217120044105764107712272417f732173420021744201217520034190026a217641202177200341e8016a41206a217841182179200341e8016a41186a217a4110217b20034194026a217c4111217d4190b5c200217e4100217f41a886c500218001411221810141d9c0c200218201419701218301410221840141042185014200216842002169204d2186014101213c0c100b41a3c0c2002104413621022059450d012058102320640d020c030b0240200328029401450d0020032802900110230b41ddbfc20021040b2064450d010b201810230b2044a7450d190c180b4200216842002169410021040c120b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41ecb3c200410041001029000b41d4aac10041331021000b410121040c070b200410230b203c41d9cac40020111b2104203b411520111b21022011450d0b20042126200221250b2003201d3703d0012003201e3a00cf01200320293a00ce012003201f3b01cc01200320203a00cb012003202a3a00ca01200320213b01c801200320223a00c7012003202b3a00c601200320233b01c401200320243a00c301200320253600bf01200320263600bb012003202c3a00ba012003202d3b01b801200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8010240200341d8016a411041a886c500410041001001417f460d00419fbac2002104412621020c0b0b200341e8016a20034190016a108e02024002400240024002400240024020032903e8014201520d00200341e8016a200341b8016a108e0220032903e8014201520d0120034190026a2802002124200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021110240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0520032802e80121110b41f3bac20021044116210220112028470d11200341a8036a41086a22044200370300200342003703a80341d4bbc200411b200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d02200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0520032802e80120246a20284f0d030c060b41c5bac2002104411821020c100b41a8bbc2002104412c21020c0f0b410120246a2028490d030b4189bbc2002104411f21020c0d0b41d4aac10041331021000b41d4aac10041331021000b200341e8016a2008410676109102410021110240024002402008413f71220420032802f0014f0d0020032802e801200441216c6a22042d00004101470d0020042f0001213b200441196a290000211d200441186a2d0000213c200441176a2d0000213d200441156a2f00002126200441146a2d0000211e200441136a2d0000211f200441116a2f00002120200441106a2d000021212004410f6a2d000021222004410d6a2f000021232004410c6a2d00002129200441086a280000212a200441046a280000212b200441036a2d000021044101211120032802ec010d010c020b20032802ec01450d010b20032802e80110230b02400240024002402011450d002003201d3703f0022003203c3a00ef022003203d3a00ee02200320263b01ec022003201e3a00eb022003201f3a00ea02200320203b01e802200320213a00e702200320223a00e602200320233b01e402200320293a00e3022003202a3600df022003202b3600db02200320043a00da022003203b3b01d802200341e8016a2006410676109102410021112006413f71220420032802f0014f0d0120032802e801200441216c6a22042d00004101470d0120042f0001213b200441196a290000211d200441186a2d0000213c200441176a2d0000213d200441156a2f00002126200441146a2d0000211e200441136a2d0000211f200441116a2f00002120200441106a2d000021212004410f6a2d000021222004410d6a2f000021232004410c6a2d00002129200441086a280000212a200441046a280000212b200441036a2d000021044101211120032802ec010d020c030b41ddbac20021040c0d0b20032802ec01450d010b20032802e80110230b024002402011450d002003201d370398032003203c3a0097032003203d3a009603200320263b0194032003201e3a0093032003201f3a009203200320203b019003200320213a008f03200320223a008e03200320233b018c03200320293a008b032003202a360087032003202b36008303200320043a0082032003203b3b018003200341d8026a20034190016a4120109604450d014183bcc2002104411221020c0c0b41efbbc2002104411421020c0b0b024020034180036a200341b8016a4120109604450d004195bcc2002104411021020c0b0b4118212f200341e8016a41186a22a501200341b8016a41186a22a60129030037030041102127200341e8016a41106a22a701200341b8016a41106a22a8012903003703004108212c200341e8016a41086a22a901200341b8016a41086a22aa01290300370300410021042003410036028802200320032903b8013703e801200341a8036a200341e8016a108d020240024020032802b0032223450d0041012111410021ab01417f211e4102212a4120213b200341e8016a41206a21ac0141042129411f2126411e211f411d2120411c2121411b21ad01411a21ae01411921af01411721b001411621b101411521b201411421b301411321b401411221b50141112128410f213a410e2139410d2138410c2137410b2136410a21354109213441ff0121334107213241062131410521304103213d417c21224100212b4100212d41012125410021b6010c010b410121254100212d0c070b4103213c410121040c040b20061023200128020022054101470d100c0f0b203e10230b200441d9cac40020051b21042041411520051b21022005450d070b2003203f3703d001200320073a00cf012003200a3a00ce012003200b3b01cc012003200c3a00cb01200320123a00ca01200320143b01c801200320153a00c701200320163a00c6012003201a3b01c401200320403a00c301200320023600bf01200320043600bb012003203c3a00ba01200320423b01b80141082105200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d8014100210b024002400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a10890220032802e8012205450d0620032802ec01210b41282107200341f0016a280200221241286c220c0d010c020b4100211241282107410041286c220c450d010b4100210a0340200341e8016a41206a2005200a6a220441206a290300370300200341e8016a41186a200441186a290300370300200341e8016a41106a200441106a290300370300200341e8016a41086a200441086a290300370300200320042903003703e801200341e8016a200341b8016a41201096040d02200c200a20076a220a470d000b0b4108210741002112200b450d01200510234100210a0c0f0b200341a8036a41206a2207200341e8016a41206a290300370300200341a8036a41186a220c200341e8016a41186a290300370300200341a8036a41106a2214200341e8016a41106a290300370300200341a8036a41086a2215200341e8016a41086a290300370300200320032903e8013703a80320034180036a41206a2216200729030037030020034180036a41186a2207200c29030037030020034180036a41106a220c201429030037030020034180036a41086a22142015290300370300200320032903a80337038003200341d8026a41206a22152016290300370300200341d8026a41186a22162007290300370300200341d8026a41106a221a200c290300370300200341d8026a41086a220c201429030037030020032003290380033703d802412810262207450d03200720032903d802370300200741206a2015290300370300200741186a2016290300370300200741106a201a290300370300200741086a200c290300370300201241286c41586a200a460d01200441286a21424128211a2005201241286c6a224041586a21414101213e4120210c411821164110211541082114422821664220213f41002167410121124101210a4100213c0c040b4100210a0c0d0b410121124101210a0c0b0b41d4aac10041331021000b41284108102a000b410121040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e020001010b2018206341306c6a2157201821040240024002400340205720046b41bf014d0d0141012156200441106a223c20034180036a460d02203c20034180036a4120109604450d02200441c0006a223c20034180036a460d02203c20034180036a4120109604450d02200441f0006a223c20034180036a460d02203c20034180036a4120109604450d02200441a0016a223c20034180036a460d02200441c0016a2104203c20034180036a41201096040d000c020b0b024020042057460d00034041012156200441106a220420034180036a460d02200420034180036a4120109604450d02200441206a22042057470d000b0b4100215620682043852069201c85844200520d0020034180036a41086a290300211d20034180036a41106a290300212e20034180036a41186a290300219001200329038003218b012018201c37030820182043370300200341e8016a41186a209001370300200341e8016a41106a202e370300200341e8016a41086a201d3703002018208b01370310201841186a201d370300201841206a202e370300201841286a2090013703002003208b013703e801206341144b0d01410221910120634102490d1d417f2192012063417f6a21930141302194012018206341306c6a21950141082196014128219701411821980141202199014110219a014103219b0141e800219c014150219d014178219e014170219f01416821a001416021a101415821a201413821a301410121a4014102213c0c0f0b200341c0006a200341d8026a206520551084022003290340211c2003200341c8006a2903003703f0012003201c3703e80141ebc0c2004181c1c20020561b21044116410f20561b21022003200341e8016a3602a803200341a8036a10de0141012105200328029401450d220c210b206341017622be01ad42307e22bf01422088a70d0120bf01a72204417f4c0d01410821090240024002402004450d002004102622c001450d0220c00121c1010c010b410821c001410821c1010b41502113201841506a21c20141302117201841306a21c301201841f07e6a21c401410021c501410421c601417f21c70141012119420321c801422021bf01410321c901410221ca01417d21cb01415821cc01412821104120210f4118210d4110210e417e21cd01417421ce01416421cf0141a87f21d00141a07f21d101410921d20141e80021d301417821d401417021d501416821d601416021d701413821d801410a21d901410421da01410021db01410021dc01206321dd014104213c0c100b20044108102a000b024002400240024002400240024002400240203c0e050001020304040b2042210402400340200341e8016a200c6a223c2004200c6a290300370300200341e8016a20166a2256200420166a290300370300200341e8016a20156a2257200420156a290300370300200341e8016a20146a2258200420146a290300370300200320042903003703e801200341e8016a200341b8016a200c1096040d0120402004201a6a2204470d000c2e0b0b200341a8036a200c6a2242203c290300370300200341a8036a20166a22592056290300370300200341a8036a20156a225a2057290300370300200341a8036a20146a225b2058290300370300200320032903e8013703a80320034180036a200c6a225c204229030037030020034180036a20166a2242205929030037030020034180036a20156a2259205a29030037030020034180036a20146a225a205b290300370300200320032903a80337038003203c205c29030037030020562042290300370300205720592903003703002058205a29030037030020032003290380033703e8010240200a2012470d002012203e6a220a2012490d262012203e742242200a200a2042491b220aad20667e221d203f88a70d26201da722422067480d2602402012450d0020072012201a6c2042102722070d010c060b204210262207450d050b2004201a6a214220072012201a6c6a225920032903e8013703002059200c6a203c290300370300205920166a2056290300370300205920156a2057290300370300205920146a20582903003703002012203e6a211220412004470d0e0c2c0b02402086012d0000206f470d00200341e8016a208601206f6a2257108e0220032903e8012075520d002076280200206a490d002078290300218701207a290300218801200341e8016a207b6a290300218901200341e8016a206d6a290300218a01207c2802002104200341a8036a206d6a22582074370300200320743703a803207e207d200341a8036a1000200341d8016a206d6a22592058290300370300200320032903a8033703d80102400240200341d8016a207b208001207f207f10012071460d002003207f3602a803200341d8016a207b200341a8036a208501207f1001206f6a2085014d0d0720032802a80321560c010b410021560b20582074370300200320743703a803208201208101200341a8036a100020592058290300370300200320032903a8033703d8010240024002400240200341d8016a207b208001207f207f10012071460d002003207f3602a803200341d8016a207b200341a8036a208501207f1001206f6a2085014d0d0a20032802a8032159205620046b2204208301490d020c010b41182159205620046b2204208301490d010b200341e0006a2088012087012059ad2074109804200341e0006a206d6a290300218b012003290360218c010c010b02402004450d002059ad221d20757c228d01201d54ad218e014200218c01208801211d208701212e4200218b010340200341f0006a201d202e208d01208e011097042074202e200341f0006a206d6a2903007d201d2003290370228f0154ad7d229001201d208f017d228f01201d56209001202e56209001202e511b22561b222e208b017c2074208f0120561b221d208c017c228c01201d54ad7c218b01200420716a22040d000c020b0b4200218c014200218b010b200341a8036a20796a205720796a290000370300200341a8036a207b6a2057207b6a29000037030020582057206d6a2900003703002057290000211d200341a8036a20776a206e3602002003201d3703a803200341b8016a200341a8036a108d024200211d4200212e02402072200341b8016a206d6a28020022044f0d00200420736a225620044f0d082087012089017c208801208a017c221d20880154ad7c208b017c201d208c017c229001201d54ad7c207420032802b8012056208401746a28020020707122041b212e209001207420041b211d0b024020032802bc01450d0020032802b80110230b202e20697c201d20687c2268201d54ad7c21690b208601206b6a228601206c470d0e0c100b206320930122042092016a229301490d08024020632093016b2256209101490d00201820042094016c6a220429030020182093012094016c6a223c2903002290015a20042096016a2257290300222e203c2096016a2258290300221d5a202e201d511b0d00200341e8016a2098016a225a203c2097016a2259290300370300200341e8016a209a016a225b203c2099016a225c290300370300200341e8016a2096016a225d203c2098016a225e2903003703002003203c2903103703e801203c200429030037030020582057290300370300203c209a016a2004209a016a290300370300205e20042098016a290300370300205c20042099016a290300370300205920042097016a2903003703004101215702402056209b01490d00203c2903602090015a203c209c016a290300222e201d5a202e201d511b0d004103215720950121580240034020582204209d016a20042903003703002004209e016a20042097016a2903003703002004209f016a20042099016a290300370300200420a0016a20042098016a290300370300200420a1016a2004209a016a290300370300200420a2016a20042096016a2903003703002057225920564f0d01205920a4016a215720042094016a22582903002090015a200420a3016a290300222e201d5a202e201d511b450d000b0b20592092016a21570b20042090013703002004201d370308203c20572094016c6a22042097016a205a29030037030020042099016a205b29030037030020042098016a205d290300370300200420032903e8013703100b209501209d016a2195012093010d0e0c200b2023201e4c0d0520032802ac0321b90120032802a80321ba012023102622b801450d0602402023202a742204450d0020ba0120046a21bb01410021b70120ba0121bc01410021bd010c1c0b410021b7010c200b20dd0121de01410021dd01410121df0120de0120c7016a221b450d1302400240024002400240024002402018201b20176c6a2204290300201820de0120176c22576a223c20d1016a290300222e54200420096a290300229001203c20d0016a290300221d54209001201d511b450d0020c40120576a21040340201b2019460d02202e2004290300228b0154213c201d200420096a2903002290015121df01201d209001542156200420136a2104201b20c7016a211b208b01212e209001211d203c205620df011b0d000c030b0b20de0120cd016a215820c40120576a2104410021dd014100213c03402058203c460d05202e2004290300228b015a21df01201d200420096a290300229001512156201d2090015a2157200420136a2104203c20196a213c208b01212e209001211d20df01205720561b0d000b203c20196a21df0120de01203c6b20c7016a221b0d030c020b4100211b0b20de01201b490d0b20de0120634b0d0d024020de01201b6b22df012019762256450d0020c20120576a21042018201b20176c6a213c0340200341e8016a20106a2257203c20106a2258290300370300200341e8016a200f6a2259203c200f6a225a290300370300200341e8016a200d6a225b203c200d6a225c290300370300200341e8016a200e6a225d203c200e6a225e290300370300200341e8016a20096a225f203c20096a22602903003703002003203c2903003703e801200420096a2261290300211d2004200e6a2245290300212e2004200d6a22462903002190012004200f6a2247290300218b012004290300218c012058200420106a2248290300370300205a208b01370300205c209001370300205e202e3703002060201d370300203c208c0137030020482057290300370300204720592903003703002046205b2903003703002045205d2903003703002061205f290300370300200420032903e801370300203c20176a213c200420136a2104205620c7016a22560d000b0b201b0d010b201b21dd0120db0120dc01460d1b0c1c0b20df0120d2014b0d0120de0120634b0d0a20c301201b20176c6a21e001410121bd010c1d0b20de0121df0120db0120dc01460d150c160b201b21dd0120db0120dc01470d170c160b20424108102a000b41d4aac10041331021000b41d4aac10041331021000b41ecb3c200205620041029000b101d000b20234101102a000b20930120631048000b201b20de011048000b20de01201b417f6a22dd01490d140b20de012063108c01000b4100213c0c030b4101213c0c030b4102213c0c040b410021040c120b410121040c110b410121040c100b410121040c0f0b410121040c0e0b410121040c0d0b410021040c080b410121040c070b410221040c060b410121040c050b410221040c040b410121040c030b410221040c020b410321040c010b410321040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0400010204040b20db0120dc01470d15410121040c1a0b20db0120196a220420db01490d1e20db01201974223c20042004203c491b2204ad20c80186221d20bf0188a70d1e201da7223c20c501480d1e0240024020db01450d0020da0120db0120c90174203c102722da010d010c030b203c102622da01450d020b200421db01410221040c190b20da0120dc0120c901746a220420df01360204200420dd0136020020dc0120196a22e10121dc0120e10120ca01490d02410221bd010c170b203c4104102a000b02400240024020bd010e03000102020b20bc01280200213c203b10262204450d0520bc0120296a21bc012004203c2026763a001f2004203c2011713a00002004203c201f762011713a001e2004203c2020762011713a001d2004203c2021762011713a001c2004203c20ad01762011713a001b2004203c20ae01762011713a001a2004203c20af01762011713a00192004203c202f762011713a00182004203c20b001762011713a00172004203c20b101762011713a00162004203c20b201762011713a00152004203c20b301762011713a00142004203c20b401762011713a00132004203c20b501762011713a00122004203c2028762011713a00112004203c2027762011713a00102004203c203a762011713a000f2004203c2039762011713a000e2004203c2038762011713a000d2004203c2037762011713a000c2004203c2036762011713a000b2004203c2035762011713a000a2004203c2034762011713a00092004203c202c762011713a00082004203c203371223c2032763a00072004203c2031762011713a00062004203c2030762011713a00052004203c2029762011713a00042004203c203d762011713a00032004203c202a762011713a00022004203c2011762011713a00014100215602400240024002400240024002400340200420566a223c203b6a20046b203d4d0d01203c20266a2d00000d02203c201f6a2d00000d03203c20206a2d00000d04205620226a2156203c20216a2d0000450d000b2056203b6a20116a22560d050c060b2056203b6a213c0340203c450d062004203c6a2156203c201e6a2257213c2056201e6a2d0000450d000c040b0b205620266a20116a22560d030c040b2056201f6a20116a22560d020c030b205620206a21570b205720116a2256450d010b0240202320b7016b2056203b2056203b491b223c4f0d0020b701203c6a223c20b701490d1f20232011742257203c203c2057491b223c20ab01480d1f024002402023450d0020b8012023203c102722b8010d010c0a0b203c102622b801450d090b203c21230b20b80120b7016a21574100213c02400340203c203b460d012057203c6a2004203c6a2d00002011713a00002056203c20116a223c470d000b0b20b701203c6a21b7010b2004102320bc0120bb01470d0f0c1b0b20de01201b20c7016a22dd01490d18024020de0120dd016b22df0120ca01490d002018201b20176c6a2204290300201820dd0120176c6a223c2903002290015a200420096a2256290300222e203c20096a2257290300221d5a202e201d511b0d00200341e8016a200d6a2259203c20106a2258290300370300200341e8016a200e6a225a203c200f6a225b290300370300200341e8016a20096a225c203c200d6a225d2903003703002003203c2903103703e801203c200429030037030020572056290300370300203c200e6a2004200e6a290300370300205d2004200d6a290300370300205b2004200f6a2903003703002058200420106a29030037030041012156024020df0120c901490d00203c2903602090015a203c20d3016a290300222e201d5a202e201d511b0d004103215620e0012157024003402057220420136a2004290300370300200420d4016a200420106a290300370300200420d5016a2004200f6a290300370300200420d6016a2004200d6a290300370300200420d7016a2004200e6a290300370300200420cc016a200420096a2903003703002056225820df014f0d01205820196a2156200420176a22572903002090015a200420d8016a290300222e201d5a202e201d511b450d000b0b205820c7016a21560b20042090013703002004201d370308203c205620176c6a220420106a20592903003703002004200f6a205a2903003703002004200d6a205c290300370300200420032903e8013703100b20dd01450d1120e00120136a21e00120dd01211b20df0120d901490d0f410021040c170b024002400240024020da0120e101225b20c7016a22e10120c901746a2204280200450d0020da01205b20c901746a225820ce016a28020022572004280204223c4d0d00410221dc01205b41024d0d0420da01205b20cb016a220420c901746a2802042256203c20576a4d0d01410321dc01205b41034d0d04205820cf016a280200205620576a4d0d010c050b205b20c901490d012004280204213c20da01205b20cb016a220420c901746a28020421560b2056203c490d010b205b20cd016a21040b205b200420196a22604d0d05205b20044d0d0620da01200420c901746a225d2802042261205d2802006a220420da01206020c901746a225e280200225f490d07200420634b0d08205d20c6016a21452018205f20176c6a225a205e280204225c20176c223c6a2156200420176c21dc01024002400240024002402004205f6b2258205c6b2204205c4f0d0020c0012056200420176c223c1094041a20c101203c6a2157205c2019480d0120042019480d0120c20120dc016a21dc0120562104034020dc01200420136a2256205720136a22582058290300205629030054205720cc016a290300221d200420cc016a290300222e54201d202e511b22591b223c29030037030020dc0120106a203c20106a29030037030020dc01200f6a203c200f6a29030037030020dc01200d6a203c200d6a29030037030020dc01200e6a203c200e6a29030037030020dc0120096a203c20096a2903003703002057205820591b2157205a2056200420591b22044f0d0420dc0120136a21dc0120c101213c20c1012057490d000c050b0b20c001205a203c1094041a20c101203c6a2157205c2019480d012058205c4c0d01201820dc016a215920c101213c205a2104034020042056203c2056290300203c29030054205620096a290300221d203c20096a290300222e54201d202e511b22581b22dc01290300370300200420106a20dc0120106a2903003703002004200f6a20dc01200f6a2903003703002004200d6a20dc01200d6a2903003703002004200e6a20dc01200e6a290300370300200420096a20dc0120096a290300370300203c203c20176a20581b213c200420176a2104205620176a205620581b225620594f0d042057203c4b0d000c040b0b205621040c010b205a21040b20c101213c0b2004203c2057203c6b22dc0120dc012017706b1094041a20452061205c6a360200205d205f360200205e205e20096a206020c70173205b6a20c901741095041a20e10121dc0120e10120194b0d0f0b20dd010d080c010b205b21dc0120dd010d080b024020db01450d0020da0110230b20be01450d1520c00110230c150b41204101102a000b203c4101102a000b41b0a8c1002060205b1029000b41b0a8c1002004205b1029000b205f20041048000b20042063108c01000b4104213c0c010b4104213c0c010b410121040c0e0b410121040c0d0b410021bd010c040b410121bd010c040b410221bd010c040b410021040c050b410221040c040b410321040c030b410321040c020b410321040c010b410321040c000b0b20dd0120de011048000b200320633602f001200320643602ec01200320183602e801200341a8036a41086a22024200370300200342003703a80341c2b4c2004113200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341103602ac032003200341d8016a3602a803200341e8016a200341a8036a108a0202402064450d00201810230b41002105410021042003280294010d040c050b024020b901450d0020ba0110230b02400240024002400240202d202b6b20b7014f0d00202b20b7016a2204202b490d06202d201174223c20042004203c491b223c20ab01480d0602400240202d0d00203c10262225450d050c010b2025202d203c10272225450d040b203c212d2025202b6a20b80120b7011094041a20230d010c020b202b20b7016a21042025202b6a20b80120b7011094041a2023450d010b20b80110230b20ac0120b60120116a22b60136020020a50120a60129030037030020a70120a80129030037030020a90120aa01290300370300200320032903b8013703e801200341a8036a200341e8016a108d022004212b200341a8036a202c6a28020022230d010c040b203c4101102a000b4103213c410121040c000b0b101e000b024020032802ac03450d0020032802a80310230b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210202400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a102820032802e801220c450d02200341f0016a280200210220032802ec01210d0c010b4101210c4100210d0b02400240200241ffffff3f7122022004200420024b1b2205450d004100210420034180026a2107200341f8016a2109200341f0016a210a200c210203400240202520046a2d0000450d002007420037030020094200370300200a4200370300200342003703e801200341e8016a2002460d002002200341e8016a4120109604450d00200341e8016a200210ef014101210b20032802e8014101470d0020032802ec0120244d0d030b200241206a2102200441016a22042005490d000b0b4100210b0b0240200d450d00200c10230b0240202d450d00202510230b20034190016a200341b8016a200b1b220520082006200b1b109c02200342e3ded5f3b6ac9ab6f3003703b0014200211c200341a8036a41086a22024200370300200342003703a80341af98c300410d200341a8036a1000200341d8016a41086a22072002290300370300200320032903a8033703d80142002143024002400240200341d8016a411041a886c500410041001001417f460d00200342003703e801200341d8016a4110200341e8016a41084100100141016a41084d0d0120032903e80121430b200320433703d801200341e8016a200510800220032802ec01210820032802e801210420032802f0012106200341fc016a200341b0016a36020020032004200641286c6a3602f401200320043602f001200320083602ec01200320043602e8012003200341d8016a3602f801200341a8036a200341e8016a109d02200341e8016a41086a2002280200360200200320032903a8033703e8012005200341e8016a10870220024200370300200342003703a80341a5bcc2004112200341a8036a100020072002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d032002410f4d0d03200341f0016a290300214320032903e801211c200b450d010c090b42002143200b0d080b200341286a20034190016a10340240024002402003290328200341306a290300844200510d00411810262202450d07200241106a410029008db741370000200241086a4100290085b741370000200241002900fdb64137000020024118413810272202450d08200220032903b801370018200241306a200341b8016a41186a290300370000200241286a200341b8016a41106a290300370000200241206a200341b8016a41086a29030037000042002155200341e8016a41186a22044200370300200341e8016a41106a22054200370300200341e8016a41086a22074200370300200342003703e80120024138200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2005290300370300200341a8036a41086a2007290300370300200320032903e8013703a803200341a8036a412041a886c500410041001001417f460d01200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012204417f460d062004410f4d0d06200341f0016a290300214420032903e80121552002102341142104411410262202450d020c090b4193b5c1002104412221020c0d0b4200214420021023411421044114102622020d070b20044101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41184101102a000b41384101102a000b200241106a41002800f9b641360000200241086a41002900f1b641370000200241002900e9b641370000024020022004413410272202450d0020022003290390013700142002412c6a20034190016a41186a2204290300370000200241246a20034190016a41106a2903003700002002411c6a20034190016a41086a29030037000042002165200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120024134200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803024002400240200341a8036a412041a886c500410041001001417f460d00200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012205417f460d022005410f4d0d02200341f0016a290300217420032903e80121650c010b420021740b2002102320034190016a2065201c20552055201c56204420435620442043511b22021b221c7c223f20742043204420021b22437c203f206554ad7c10df01200341b8016a2055201c7d204420437d2055201c54ad7d10fe01200341f5016a200341b8016a41086a290300370000200341fd016a200341b8016a41106a29030037000020034185026a200341b8016a41186a2903003700002003418d026a20032903900137000020034195026a20034190016a41086a2903003700002003419d026a20034190016a41106a290300370000200341a5026a2004290300370000200341003a00ec01200341063a00e801200320032903b8013700ed0141a886c5004100200341e8016a102c0c0a0b41d4aac10041331021000b41344101102a000b200341186a20034190016a201c20431093022003290318211c2003200341186a41086a2903003703f0012003201c3703e8012003200341e8016a3602a803200341a8036a10de01200341f5016a20034190016a41086a290300370000200341fd016a200341a0016a29030037000020034185026a200341a8016a290300370000200341013a00ec01200341063a00e80120032003290390013700ed0141a886c5004100200341e8016a102c0c070b204d10230b02402005450d0002402064450d00201810230b2044a70d010c020b2044a7450d010b206210230b41012107410121080b200128020022054101460d040c050b200b450d00200510230b200320123602f0012003200a3602ec01200320073602e801200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200341103602ac032003200341d8016a3602a803200341e8016a200341a8036a108f020240200a450d00200710230b200341e8016a41186a200341b8016a41186a290300370300200341e8016a41106a200341b8016a41106a290300370300200341e8016a41086a200341b8016a41086a290300370300200320032903b8013703e80141012107200341e8016a41011090024100210441012108200128020022054101470d030c020b41002104410121070b41012108200128020022054101470d010b2008450d01200141086a280200450d01200128020410230c010b20054102470d002007450d00200141086a280200450d00200128020410230b2000200236020420002004360200200341d0036a24000bcc310b067f057e017f017e017f017e017f017e017f047e087f23004180026b22052400200541e8006a41086a220642003703002005420037036841e8b4c2004112200541e8006a100020054190016a41086a2006290300370300200520052903683703900141002107024002400240024002400240024020054190016a411041a886c500410041001001417f460d00200542103702e401200520054190016a3602e001200541386a200541e0016a102820052802382208450d02200541c0006a2802002107200528023c21090c010b41012108410021090b200541e8006a41086a220642003703002005420037036841c4b3c2004114200541e8006a100020054190016a41086a220a20062903003703002005200529036837039001024020054190016a411041a886c500410041001001417f460d0041bec1c2002106412e210720090d030c040b20064200370300200542003703684190b5c2004111200541e8006a1000200a2006290300370300200520052903683703900102400240024020054190016a411041a886c500410041001001417f460d002005410036023820054190016a4110200541386a41044100100141016a41044d0d0220052802382003470d010c040b41002003460d030b41ecc1c20021064114210720090d030c040b41d4aac10041331021000b41d4aac10041331021000b0240024002402007450d002007200241086a280200220a4f0d0141c1c2c2002106413c210720090d030c040b4180c2c200210641c10021070c010b200541286a20011034200541286a41086a290300210b2005290328210c200541386a2001108e02024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052903384201520d00200541d8006a290300210d200541d0006a290300210e200541c8006a290300210f200541e4006a280200211020052903402111200541c0016a2004410676109102410021122004413f71220620052802c8014f0d0120052802c001200641216c6a22062d00004101470d01200541aa016a200641036a2d00003a000020054190016a41086a200641146a2900003703002005419d016a200641196a290000370000200520062f00013b01a80120052006410c6a29000037039001200641086a2800002107200641046a28000021064101211220052802c4010d020c030b411410262206450d1d200641106a41002800f9b641360000200641086a41002900f1b641370000200641002900e9b64137000020064114413410272206450d1e200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002113200541e0016a41186a22074200370300200541e0016a41106a22124200370300200541e0016a41086a22144200370300200542003703e00120064134200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2012290300370300200541c0016a41086a2014290300370300200520052903e0013703c001200541c0016a412041a886c500410041001001417f460d03200542003703e801200542003703e001200541c0016a4120200541e0016a4110410010012207417f460d1b2007410f4d0d1b200541e8016a290300210e20052903e00121150c040b20052802c401450d010b20052802c00110230b024002402012450d0020054188016a41026a200541a8016a41026a2d00003a0000200541c0016a41086a20054190016a41086a290300370300200541c0016a410d6a20054190016a410d6a290000370000200520052f01a8013b01880120052005290390013703c001410021040c010b410121044113210741fdc2c20021060b20054184016a41026a221220054188016a41026a2d00003a0000200541e8006a41086a2214200541c0016a41086a290300370300200541e8006a41106a200541c0016a41106a290300370300200520052f0188013b018401200520052903c00137036820040d2a200541f3016a2014290300370000200541f8016a200541f5006a290000370000200520052f0184013b01e001200520073600e701200520063600e301200520052903683700eb01200520122d00003a00e201200541e0016a2001460d02200541e0016a20014120109604450d024190c3c20021064111210720090d2b0c2c0b420021154200210e0b20061023200541e8006a41086a220642003703002005420037036841a5bcc2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012206417f460d192006410f4d0d19200541e8016a290300210d20052903e00121130c010b4200210d0b02402015201358200e200d58200e200d511b0d00200541e0016a2004410676221210910241002106024020052802e8012004413f7122074d0d004101410220052802e001200741216c6a2d00001b21060b024020052802e401450d0020052802e00110230b200641024f0d02200541e8006a41086a220642003703002005420037036841d5c3c2004114200541e8006a100020054190016a41086a2006290300370300200520052903683703900141002107024020054190016a411041a886c500410041001001417f460d00200541003602e00120054190016a4110200541e0016a41044100100141016a41044d0d1d20052802e00121070b200541a8016a200710910220052802b0012206450d06200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200541c0016a2104200641c000470d0b0c0c0b41a1c3c20021064134210720090d290c2a0b200541e8006a41086a220642003703002005420037036841d9c0c2004112200541e8006a100020054190016a41086a2006290300370300200520052903683703900120054190016a411041a886c500410041001001417f460d01200541003602c00120054190016a4110200541c0016a41044100100141016a41044d0d1920052802c0012107200320106b22064197014f0d020c030b200541e8006a2012109102200541e0016a41186a2204200141186a290000370300200541e0016a41106a2214200141106a290000370300200541e0016a41086a2210200141086a290000370300200520012900003703e0012005280270220620074d0d1f20052802682216200741216c6a220620052903e001370001200641013a0000200641096a2010290300370000200641116a2014290300370000200641196a2004290300370000410e10262206450d20200641066a41002900a6b642370000200641002900a0b6423700002006410e411c10272206450d212006201236000e200541e0016a41186a22074200370300200541e0016a41106a22044200370300200541e0016a41086a22124200370300200542003703e00120064112200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2004290300370300200541c0016a41086a2012290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541e8006a200541e0016a109e0220061023200528026c450d0a201610230c0a0b41182107200320106b2206419701490d010b2005200e200d2007ad4200109804200541086a2903002117200529030021150c030b2006450d012007ad221342017c2218201354ad2119200541186a210442002115420021170340200541106a200e200d201820191097044200200d20042903007d200e2005290310221a54ad7d2213200e201a7d221a200e562013200d562013200d511b22071b220d20177c4200201a20071b220e20157c2215200e54ad7c21172006417f6a22060d000c030b0b4200210e200541e8006a41086a220442003703002005420037036841e9c3c2004111200541e8006a100020054190016a41086a2004290300370300200520052903683703900120054190016a411041a886c500410041001001417f460d02200542003703c801200542003703c00120054190016a4110200541c0016a4110410010012204417f460d1e2004410f4d0d1e200541c8016a290300210d20052903c001210e0c030b42002115420021170b2017200f7c201520117c220e201554ad7c210d0c050b4200210d0b200541e0016a2001200e200d4108108502024020052802e0014101470d0020052802e801210720052802e401210620052802ac01450d1f20052802a801102320090d200c210b20052903e801210e2005200541e0016a41106a2903003703e8012005200e3703e0012005200541e0016a3602c001200541c0016a10de014200210e200541e8006a41086a220442003703002005420037036841e9c3c2004111200541e8006a100020054190016a41086a200429030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012204417f460d1e2004410f4d0d1e200541e8016a290300210d20052903e001210e0c010b4200210d0b200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200b200d7d200c200e54ad7d210b200c200e7d210c200541c0016a21040b200541e0016a41186a200441186a290000370300200541e0016a41106a200441106a290000370300200541e0016a41086a200441086a290000370300200520042900003703e001024002400240024020052802ac012006470d00200641016a22042006490d0720064101742212200420042012491b2214ad42217e220e422088a70d07200ea722124100480d072006450d0120052802a801200641216c2012102722040d020c200b20052802a80121040c020b201210262204450d1e0b200520143602ac01200520043602a8010b200541a8016a41086a200641016a3602002004200641216c6a220420052903e001370001200441013a0000200441096a200541e0016a41086a290300370000200441116a200541e0016a41106a290300370000200441196a200541f8016a2903003700002006413f470d00200541e8006a41086a220642003703002005420037036841d5c3c2004114200541e8006a100020054190016a41086a200629030037030020052005290368370390012005200741016a3602e00120054190016a4110200541e0016a410410040b200541e0016a41086a200541a8016a41086a280200360200200520052903a8013703e0012007200541e0016a109f020b4200210e200541e8006a41086a220642003703002005420037036841a5bcc2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012206417f460d112006410f4d0d11200541e8016a290300210d20052903e001210e0c010b4200210d0b200541206a2001200e200d105b024020052802202206450d002005280224210720090d1d0c1e0b200541e8006a41086a220642003703002005420037036841acc1c2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200541003602e00120054190016a4110200541e0016a41044100100141016a41044d0d1220052802e00141016a21060c010b410121060b4200210e200541e8006a41086a220742003703002005420037036841acc1c2004112200541e8006a100020054190016a41086a20072903003703002005200529036837039001200520063602e00120054190016a4110200541e0016a410410044200210d0b200542e3ded5f3b6ac9ab6f3003703b801200541b8016a2001200c200b427f410f1062200541d0006a200b3703002005200c3703482005200d3703402005200e3703382005200336025c20052003360258411310262206450d102006410f6a41002800c5b542360000200641086a41002900beb542370000200641002900b6b54237000020064113413310272206450d11200620012900003700132006412b6a200141186a290000370000200641236a200141106a2900003700002006411b6a200141086a290000370000200541e0016a41186a22074200370300200541e0016a41106a22034200370300200541e0016a41086a22044200370300200542003703e00120064133200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2003290300370300200541c0016a41086a2004290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541386a200541e0016a10ed01200610232002280204211420022802002103024002400240024002400240200a410576221b450d00201b41027422061026221c450d18201c211d200a0d010c020b4104211c4104211d200a450d010b0240201b0d0041041026221c450d1c4101211b201c211d0b201d4100360200200a417f6a210441012116410021024100210602400340201620024d0d08201d20024102746a22072007280200200320066a2d00002006411f71746a360200200620044f0d0102400240200641016a2206411f71450d00200a20064b0d020c010b0240201b2016470d00201b41016a2207201b490d08201b4101742212200720072012491b2207ad420286220e422088a70d08200ea722124100480d0802400240201b450d00201c201b41027420121027221c0d010c110b20121026221c450d100b201c211d2007211b0b201d20164102746a4100360200200241016a2102201641016a2116200a20064b0d010b0b41ecb3c2002006200a1029000b02402014450d00200310230b4100211e0340200541386a41186a2203200141186a290000370300200541386a41106a220a200141106a290000370300200541386a41086a2204200141086a290000370300200520012900003703382016410820164108491b221f410274212002400240201f450d00202010262221450d0d2021201d20201094042102201f21074113102622060d010c0a0b410421214104210241002107411310262206450d090b2006410f6a410028009cb642360000200641086a4100290095b6423700002006410029008db64237000020064113413310272206450d09200620052903383700132006412b6a2003290300370000200641236a200a2903003700002006411b6a20042903003700002006413341e60010272222450d0a2022201e360033200541e0016a41186a22064200370300200541e0016a41106a22034200370300200541e0016a41086a22104200370300200542003703e00120224137200541e0016a1002200541c0016a41186a2006290300370300200541c0016a41106a2003290300370300200541c0016a41086a2010290300370300200520052903e0013703c00120104100360200200542013703e00120052007360268200541e8006a200541e0016a104102400240024020070d0020052802e4012106200541c0016a412020052802e001220a2010280200100420060d010c020b200741027421044100201028020022066b210720052802e40121030340200228020021140240024002400240200320076a41044f0d00200641046a220a2006490d0c20034101742212200a200a2012491b22124100480d0c2003450d0120052802e001200320121027220a0d020c0d0b20052802e001210a0c020b20121026220a450d0b0b200520123602e4012005200a3602e001201221030b200241046a21022010200641046a2212360200200a20066a20143600002007417c6a2107201221062004417c6a22040d000b200541c0016a4120200a201210042003450d010b200a10230b2016201f6b2116202210230240201f450d00202110230b201d20206a211d201e41016a211e20160d000b201b450d01201c10234100210620090d020c030b2014450d00200310230b410021062009450d010b200810230b0c1d0b101e000b20124101102a000b41d8b4c200200220161029000b41134101102a000b41334101102a000b41e6004101102a000b20204104102a000b20124104102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41134101102a000b41334101102a000b20064104102a000b41d8b4c200200720061029000b410e4101102a000b411c4101102a000b41d4aac10041331021000b41044104102a000b41d4aac10041331021000b20124101102a000b2009450d010b200810230b200241046a280200450d00200228020010230b200020073602042000200636020020054180026a24000bf909010c7f23004190016b22022400200241086a20014106762203109102024002400240200228021022042001413f7122014d0d002002280208200141216c6a22012002290028370001200141003a0000200141096a200241286a41086a2204290000370000200141116a200241286a41106a290000370000200141196a200241c0006a2900003700002004200241086a41086a280200360200200220022903083703282003200241286a109f02200442003703002002420037032841acc1c2004112200241286a1000200241f0006a41086a200429030037030020022002290328370370417f210102400240200241f0006a411041a886c500410041001001417f460d0020024100360228200241f0006a4110200241286a41044100100141016a41044d0d012002280228417f6a21010b200241286a41086a220342003703002002420037032841acc1c2004112200241286a1000200241f0006a41086a220520032903003703002002200229032837037020022001360228200241f0006a4110200241286a41041004200241286a41186a2206200041186a2207290000370300200241286a41106a2208200041106a22092900003703002003200041086a220a2900003703002002410036024820022000290000370328200241186a200241286a108d0202400240024002402002280220450d00410021040340200241d0006a41186a220b2007290000370300200241d0006a41106a220c2009290000370300200241d0006a41086a220d200a29000037030020022000290000370350411310262201450d042001410f6a410028009cb642360000200141086a4100290095b6423700002001410029008db64237000020014113413310272201450d02200120022903503700132001412b6a200b290300370000200141236a200c2903003700002001411b6a200d2903003700002001413341e60010272201450d03200120043600332006420037030020084200370300200342003703002002420037032820014137200241286a1002200241f0006a41186a2006290300370300200241f0006a41106a20082903003703002005200329030037030020022002290328370370200241f0006a4120100320011023200441016a21040240200228021c450d00200228021810230b200241286a41206a200436020020062007290000370300200820092900003703002003200a29000037030020022000290000370328200241186a200241286a108d02200241186a41086a2802000d000b0b0240200228021c450d00200228021810230b411310262201450d052001410f6a41002800c5b542360000200141086a41002900beb542370000200141002900b6b54237000020014113413310272201450d06200120002900003700132001412b6a200041186a290000370000200141236a200041106a2900003700002001411b6a200041086a290000370000200241286a41186a22044200370300200241286a41106a22034200370300200241286a41086a220642003703002002420037032820014133200241286a1002200241f0006a41186a2004290300370300200241f0006a41106a2003290300370300200241f0006a41086a200629030037030020022002290328370370200241f0006a412010032001102320024190016a24000f0b41334101102a000b41e6004101102a000b41134101102a000b41d4aac10041331021000b41d8b4c200200120041029000b41134101102a000b41334101102a000bdb0a03087f047e0b7f230041a0016b2202240002400240200141086a220328020022042001410c6a2802002205460d0020012802102106200241f8006a41186a2107200141146a2108034020032004220941286a2204360200200941086a290300210a200941106a290300210b200941186a290300210c2009290300210d200241f8006a41206a200941206a2903003703002007200c370300200241f8006a41106a220e200b370300200241f8006a41086a200a3703002002200d3703780240200e2903002006290300580d002008280200220e2007460d002007290000200e290000520d030b20052004470d000b200521040b2000410036020820004208370200024020042005460d00200141086a2004200541586a20046b41286e41286c6a41286a3602000b02402001280204450d00200128020010230b200241a0016a24000f0b200241d0006a41206a2204200241f8006a41206a290300370300200241d0006a41186a2207200241f8006a41186a290300370300200241d0006a41106a2203200241f8006a41106a290300370300200241d0006a41086a2208200241f8006a41086a29030037030020022002290378370350200241286a41206a220f2004290300370300200241286a41186a22042007290300370300200241286a41106a22072003290300370300200241286a41086a2203200829030037030020022002290350370328200241206a2208200f290300370300200241186a22102004290300370300200241106a22042007290300370300200241086a22072003290300370300200220022903283703000240024002400240024041281026220f450d00200f2002290300370300200f41206a2008290300370300200f41186a2010290300370300200f41106a2004290300370300200f41086a2007290300370300200128020421112001280200211241012101024002400240200541586a2009460d00200e200241f8006a41186a2204460d02200941286a2113200541586a2114410121014101211003402013210902400340200241f8006a41206a2207200941206a2903003703002004200941186a290300370300200241f8006a41106a2203200941106a290300220a370300200241f8006a41086a2208200941086a290300370300200220092903003703780240200a2006290300580d002004290000200e290000520d020b2005200941286a2209470d000c040b0b200241d0006a41206a22132007290300370300200241d0006a41186a22152004290300370300200241d0006a41106a22162003290300370300200241d0006a41086a2217200829030037030020022002290378370350200241286a41206a22182013290300370300200241286a41186a22132015290300370300200241286a41106a22152016290300370300200241286a41086a22162017290300370300200220022903503703282007201829030037030020042013290300370300200320152903003703002008201629030037030020022002290328370378024020102001470d00200141016a22102001490d0720014101742213201020102013491b2210ad42287e220a422088a70d07200aa722134100480d0702402001450d00200f200141286c20131027220f0d010c070b20131026220f450d060b200941286a2113200f200141286c6a22152002290378370300201541206a2007290300370300201541186a2004290300370300201541106a2003290300370300201541086a2008290300370300200141016a210120142009470d000c020b0b410121100b2011450d050c040b4101211020110d030c040b41284108102a000b20134108102a000b101e000b201210230b20002001360208200020103602042000200f360200200241a0016a24000bc60501087f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002104102400240024002400240024002402000450d00200041216c2104200241086a21050240034002400240024002400240024002400240024002400240024020032d00004101470d002002280204220020052802002206470d01200641016a22002006490d0f20064101742207200020002007491b22004100480d0f2006450d03200228020020062000102722070d040c100b2002280204220020052802002206470d01200641016a22002006490d0e20064101742207200020002007491b22004100480d0e2006450d05200228020020062000102722070d060c100b200228020021070c030b200228020021070c050b200010262207450d0c0b20022000360204200220073602000b2005200641016a2208360200200720066a41013a00000240200020086b41204f0d00200841206a22092008490d0a20004101742206200920092006491b22064100480d0a2000450d04200720002006102722070d050c0d0b200641216a21090c050b200010262207450d0a0b20022000360204200220073602000b2005200641016a2209360200200720066a41003a0000200341216a21032004415f6a22040d030c040b200610262207450d080b2002200636020420022007360200200621000b20052009360200200720086a220641086a200341016a220841086a290000370000200641106a200841106a290000370000200641186a200841186a29000037000020062008290000370000200341216a21032004415f6a22040d000b0b200128020020012802042007200910042000450d060c050b200228020421002001280200200128020420022802002207200241086a280200100420000d040c050b101e000b20004101102a000b20004101102a000b20064101102a000b200710230b200241106a24000b840201047f230041c0006b2202240002400240410e10262203450d00200341066a41002900a6b642370000200341002900a0b6423700002003410e411c10272203450d012003200036000e200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034112200241206a1002200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a109e02200310230240200141046a280200450d00200128020010230b200241c0006a24000f0b410e4101102a000b411c4101102a000ba20d010e7f230041e0006b220224000240024020012802042203200128020022046b418001490d00200141046a210503402001200441206a360200200141086a220628020022032802282107200341306a2802002108200241c0006a41186a22034200370300200241c0006a41106a22094200370300200241c0006a41086a220a42003703002002420037034020044120200241c0006a1002200241186a220b2003290300370300200241106a220c2009290300370300200241086a220d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d0020062802002206280230210b200628022821062003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a290300370300200220022903403703202006200b200241206a4120100c20040d030b20052802002203200128020022046b41ff004b0d000b0b024020042003460d00200141046a210c03402001200441206a360200200141086a220b28020022032802282106200341306a2802002107200241c0006a41186a22034200370300200241c0006a41106a22094200370300200241c0006a41086a220a42003703002002420037034020044120200241c0006a1002200241186a2003290300370300200241106a2009290300370300200241086a200a29030037030020022002290340370300200241003602402006200720024120200241c0006a100a2108024020022802402207417f460d00200b2802002206280230210b200628022821062003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a290300370300200220022903403703202006200b200241206a4120100c20040d030b20012802002204200c280200470d000b0b20004100360200200241e0006a24000f0b20002008360204200020043602002000410c6a2007360200200041086a2007360200200241e0006a24000b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b22064190016d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad4290017e2209422088a70d032009a722084100480d032002450d01200028020020024190016c200810272202450d020c040b200028020021020c040b2008102622020d020b20084108102a000b101e000b20002002360200200041046a2003360200200041086a28020021030b200220034190016c6a200520061094041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010230b0b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641e8006d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad42e8007e2209422088a70d032009a722084100480d032002450d012000280200200241e8006c200810272202450d020c040b200028020021020c040b2008102622020d020b20084108102a000b101e000b20002002360200200041046a2003360200200041086a28020021030b2002200341e8006c6a200520061094041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010230b0bcd0201077f230041106b220224002002410036020c2002410c6a20012802002203200128020422044104200441044922051b22061094041a2001200420066b3602042001200320066a3602000240024002400240024002400240024020050d00200228020c21052002200110452002280200450d0320022802042204417f4c0d042004450d01200410ac012203450d0520032001280200200141046a22072802002206200420062004491b22061094041a200728020022082006490d062007200820066b3602002001200128020020066a36020020062004470d020c070b20004100360204200241106a24000f0b4101210341002004460d050b2004450d00200310230b20004100360204200241106a24000f0b101d000b20044101102a000b200620081048000b2000200436020820002003360204200020053602002000410c6a2004360200200241106a24000bdb0201057f230041106b220224002002410036020c20014100200128020020012802042002410c6a41042001280208100122032003417f461b22034104200341044922031b20012802086a360208024002400240024002400240024020030d00200228020c210420022001104a2002280200450d0320022802042203417f4c0d042003450d01200310ac012205450d05200141086a2206200341002001280200200141046a280200200520032006280200100122012001417f461b2201200120034b1b220120062802006a36020020012003470d020c060b20004100360204200241106a24000f0b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d040b2003450d00200510230b20004100360204200241106a24000f0b101d000b20034101102a000b2000200336020820002005360204200020043602002000410c6a2003360200200241106a24000b8203010a7f230041106b220224002002200110450240024002400240024002400240024002402002280200450d0020022802042203417f4c0d072003450d01200310262204450d08200141046a2105410021064100210720032108034020052802002109200241003a000f2002410f6a2001280200220a2009410047220b1094041a2009200b490d0520052009200b6b3602002001200a200b6a3602002009450d04200741016a210920022d000f210b024020072008470d002006200920092006491b22084100480d0702402007450d00200420072008102722040d010c090b200810262204450d080b200420076a200b3a0000200641026a21062009210720092003490d000c030b0b20004100360200200241106a24000f0b4101210441002109410021080b2000200836020420002004360200200041086a2009360200200241106a24000f0b2000410036020002402008450d00200410230b200241106a24000f0b200b20091048000b101e000b20084101102a000b101d000b20034101102a000bf502010a7f230041106b2202240020022001104a024002400240024002400240024002402002280200450d0020022802042203417f4c0d062003450d01200310262204450d07200141046a2105200141086a21064100210741002108200321090340200241003a000f200128020020052802002002410f6a410120062802001001210a20062006280200200a41016a41014b220a6a360200200a450d04200841016a210a20022d000f210b024020082009470d002007200a200a2007491b22094100480d0602402008450d00200420082009102722040d010c080b200910262204450d070b200420086a200b3a0000200741026a2107200a2108200a2003490d000c030b0b20004100360200200241106a24000f0b410121044100210a410021090b2000200936020420002004360200200041086a200a360200200241106a24000f0b2000410036020002402009450d00200410230b200241106a24000f0b101e000b20094101102a000b101d000b20034101102a000bed0504027f017e0f7f017e230041f0006b22022400200241086a200110450240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241f0006a24000f0b4108210620030d030b410021114100210e0c030b101d000b20054108102a000b200241d0006a41186a2107200241d0006a41106a2108200241d0006a41086a2109200141046a210a4100210b4100210c4100210d2003210e0240034020074200370300200842003703002009420037030020024200370350200241d0006a2001280200220f200a28020022054120200541204922101b22111094041a200a200520116b22053602002001200f20116a221136020020100d01200241306a41186a22102007290300370300200241306a41106a22122008290300370300200241306a41086a221320092903003703002002200229035037033020024200370350200241d0006a20112005410820054108491b220f1094041a200a2005200f6b36020020012011200f6a360200200541074d0d01200d41016a211120022903502104200241106a41186a220f2010290300370300200241106a41106a22102012290300370300200241106a41086a22122013290300370300200220022903303703100240200d200e470d00200b20112011200b491b220ead42287e2214422088a70d042014a722054100480d040240200d450d002006200c2005102722060d010c060b200510262206450d050b2006200c6a22052002290310370300200541186a200f290300370300200541106a2010290300370300200541086a2012290300370300200541206a2004370300200b41026a210b200c41286a210c2011210d20112003490d000c020b0b200041003602000240200e450d00200610230b200241f0006a24000f0b2000200e36020420002006360200200041086a2011360200200241f0006a24000f0b101e000b20054108102a000be60403027f017e0b7f230041106b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad420c7e2204422088a70d082004a72205417f4c0d082005450d01200510262206450d032003450d020c040b20004100360200200241106a24000f0b4104210620030d020b4100210e4100210c0c020b20054104102a000b200141086a2107200141046a2108410021094100210a4100210b2003210c034020022001104a0240024002402002280200450d0020022802042205417f4c0d07024002402005450d00200510ac01220d450d0320072005410020012802002008280200200d200520072802001001220e200e417f461b220e200e20054b1b220e20072802006a360200200e2005470d010c040b4101210d2001280200200828020041014100200728020010011a41002005460d030b2005450d00200d10230b200041003602000240200b450d002006210503400240200541046a280200450d00200528020010230b2005410c6a2105200a41746a220a0d000b0b0240200c450d00200610230b200241106a24000f0b20054101102a000b200b41016a210e0240200b200c470d002009200e200e2009491b220cad420c7e2204422088a70d032004a7220f4100480d030240200b450d002006200a200f102722060d010c050b200f10262206450d040b2006200a6a220b200d360200200b41046a2005ad2204422086200484370200200941026a2109200a410c6a210a200e210b200e2003490d000b0b2000200c36020420002006360200200041086a200e360200200241106a24000f0b101e000b200f4104102a000b101d000bb00d03027f017e167f230041f0006b22022400200241106a2001104a02400240024002400240024002400240024002402002280210450d0020022802142203ad42247e2204422088a70d092004a72205417f4c0d092005450d01200510262206450d032003450d020c040b20004100360200200241f0006a24000f0b4104210620030d020b41002111410021100c020b20054104102a000b200241d0006a41046a21072002413d6a2108200241d7006a2109200141086a210a200241d0006a41186a210b200241d0006a41106a210c200241e3006a220d41056a210e4100210f20032110410021110340200241003a00502001280200200141046a2212280200200241d0006a4101200a28020010012105200a200a280200200541016a41014b22056a2213360200024002400240024002400240024002400240024002402005450d004105211420022d0050220541064b0d08024020050e07000b030b020405000b200241086a2001104a2002280208450d08200228020c2215417f4c0d102015450d05201510ac012205450d07200a201541002001280200201228020020052015200a280200100122122012417f461b2212201220154b1b2212200a2802006a36020020122015470d060c090b410521140c070b200241d0006a200110a40220022802542215450d0620022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410221140c080b200b4200370300200c4200370300200241d0006a41086a420037030020024200370350200a410020012802002012280200200241d0006a41202013100122052005417f461b2205412020054120491b200a2802006a3602002005411f4d0d05200241c0006a41086a200941086a280000360200200220092900003703402002200d2900003703302002200e29000037003520022f0150210520022d0052211420022800532117200841026a200241cd006a41026a2d00003a0000200820022f004d3b0000201741087621162005201441107472211a41002114200228024021150c070b200241d0006a200110a40220022802542215450d0420022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410321140c060b200241d0006a200110a40220022802542215450d0320022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410121140c050b410121052001280200201228020041014100200a28020010011a41002015460d030b2015450d01200510230c010b20154101102a000b0c010b200241c0006a41086a2002280250360200200241306a41086a200741086a2902003703002002200729020037033020022015ad22044220862004843703402005410876211641042114200521170b20072002290330370200200741086a200241306a41086a2903003702002002200241c0006a41086a28020036025020144105460d0220022802442112200241186a41106a2213200c280200360200200241186a41086a2218200241d0006a41086a29020037030020022002290250370318024020112010470d00201041016a22052010490d0420104101742219200520052019491b2205ad42247e2204422088a70d042004a722194100480d04024002402010450d002006201041246c2019102722060d010c070b201910262206450d060b200521100b2006200f6a220520143a00002005410c6a2012360200200541086a2015360200200541046a2016410874201741ff017172360200200541036a201a4110763a0000200541016a201a3b0000200541206a2013280200360200200541186a2018290300370200200541106a2002290318370200200f41246a210f201141016a22112003490d000b0b2000201036020420002006360200200041086a2011360200200241f0006a24000f0b2000410036020002402011450d002006210503400240024020052d0000220a41034b0d00024002400240200a0e0404000102040b2005410c6a280200450d03200541086a2802001023200541246a2105200f415c6a220f0d040c050b2005410c6a280200450d02200541086a2802001023200541246a2105200f415c6a220f0d030c040b2005410c6a280200450d01200541086a2802001023200541246a2105200f415c6a220f0d020c030b200541086a280200450d00200541046a28020010230b200541246a2105200f415c6a220f0d000b0b02402010450d00200610230b200241f0006a24000f0b101e000b20194104102a000b101d000bb30405027f017e077f017e017f230041e0056b2202240020022001104502400240024002400240024002400240024002402002280200450d0020022802042203ad42f8017e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241e0056a24000f0b4108210620030d030b4100210b4100210a0c030b101d000b20054108102a000b200241f8016a41f8006a21074100210841002105410021092003210a0340200241f8016a2001109402200241f0046a200241f8016a41f0001094041a200241f8016a41f0006a2903002104200241f0036a20074180011094041a20044203510d02200941016a210b20024188016a200241f0046a41f0001094041a200241086a200241f0036a4180011094041a02402009200a470d002008200b200b2008491b220aad42f8017e220c422088a70d04200ca7220d4100480d0402402009450d0020062005200d102722060d010c060b200d10262206450d050b200620056a20024188016a41f000109404220941f0006a2004370300200941f8006a200241086a4180011094041a200841026a2108200541f8016a2105200b2109200b2003490d000b0b2000200a36020420002006360200200041086a200b360200200241e0056a24000f0b2000410036020002402009450d0020064188016a210b0340200b1024200b41f8016a210b200541887e6a22050d000b0b0240200a450d00200610230b200241e0056a24000f0b101e000b200d4108102a000be30a04177f027e087f017e23004180016b220224000240200141086a220328020022042001410c6a2802002205460d002001280210220628020021072006280208220841014621094100210a0340024002400240024002400240024002400240200a0e020001010b2003200441206a220b360200200241e0006a41186a200441186a290000370300200241e0006a41106a200441106a290000370300200241e0006a41086a200441086a290000370300200220042900003703604100210a0240024020090d002008450d014100210a2008210c0340200c410176220d200a6a220e200a2007200e4105746a200241e0006a41201096044101481b210a200c200d6b220c41014b0d000b0b2007200a4105746a200241e0006a41201096040d00200b2104200b2005470d07200521040c0a0b200241206a41186a220a200241e0006a41186a290300370300200241206a41106a220f200241e0006a41106a290300370300200241206a41086a220c200241e0006a41086a29030037030020022002290360370320200241186a220d200a290300370300200241106a220a200f290300370300200241086a220f200c29030037030020022002290320370300200241c0006a41186a220c200d290300370300200241c0006a41106a220d200a290300370300200241c0006a41086a220a200f29030037030020022002290300370340412010262210450d0420102002290340370000201041186a200c290300370000201041106a200d290300370000201041086a200a2903003700002001280204211120012802002112200b2005460d014101210f41082113200641086a211441182115411021164120211741052118420521194220211a4100211b4101211c4101211d4101210a0c080b2014280200211e2006280200211f02400340200241e0006a20156a2220200b20156a290000370300200241e0006a20166a2221200b20166a290000370300200241e0006a20136a2222200b20136a2900003703002002200b290000370360200b20176a210b4100210a0240201e200f460d00201e450d024100210a201e210c0340200c200f76220d200a6a220e200a201f200e2018746a200241e0006a2017109604200f481b210a200c200d6b220c200f4b0d000b0b201f200a2018746a200241e0006a20171096040d01200b2005470d000c030b0b200241206a20156a220a2020290300370300200241206a20166a220c2021290300370300200241206a20136a220d202229030037030020022002290360370320200241c0006a20156a220e200a290300370300200241c0006a20166a220a200c290300370300200241c0006a20136a220c200d29030037030020022002290320370340200220156a220d200e290300370300200220166a220e200a290300370300200220136a221f200c290300370300200220022903403703000240201d201c470d00201c200f6a220a201c490d03201c200f74220c200a200a200c491b221dad2019862223201a88a70d032023a7220a201b480d030240201c450d002010201c201874200a102722100d010c060b200a10262210450d050b2010201c2018746a220a2002290300370000200a20156a200d290300370000200a20166a200e290300370000200a20136a201f290300370000201c200f6a211c200b2005470d060c010b4101211c4101211d0b02402011450d00201210230b2000201c3602082000201d3602042000201036020020024180016a24000f0b101e000b41204101102a000b200a4101102a000b4100210a0c010b4101210a0c000b0b2000410036020820004201370200024020042005460d00200141086a2004200520046b41606a4160716a41206a3602000b02402001280204450d00200128020010230b20024180016a24000b0c002000280200200110ad020bce7601027f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a220341aa014b0d00024020030eab010002030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b200128021841d3eac40041032001411c6a28020028020c11020021010cb1010b200128021841c8eac400410b2001411c6a28020028020c11020021010cb0010b2002200128021841d6eac40041052001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000caf010b2002200128021841eceac40041042001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000cae010b2002200128021841f0eac40041022001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000cad010b200128021841f2eac40041042001411c6a28020028020c11020021010cac010b200128021841f6eac40041032001411c6a28020028020c11020021010cab010b2002200128021841f9eac40041022001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450daa01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000caa010b20022001280218418cebc40041042001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca9010b200220012802184190ebc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a4198ebc40010de03210120022000410c6a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450da801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca8010b200128021841a8ebc40041062001411c6a28020028020c11020021010ca7010b2002200128021841aeebc40041042001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca6010b2002200128021841b2ebc400410c2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c4101210120022002410c6a41fceac40010de0321032002200041016a36020c20032002410c6a41c0ebc40010de031a20022d0008210020022802042203450da2010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca5010b200128021841d0ebc40041042001411c6a28020028020c11020021010ca4010b200128021841d4ebc40041062001411c6a28020028020c11020021010ca3010b2002200128021841daebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca2010b2002200128021841e2ebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca1010b2002200128021841eaebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca0010b2002200128021841f2ebc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d9f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9f010b2002200128021841fbebc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d9e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9e010b200220012802184184ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9d010b20022001280218418becc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9c010b200220012802184192ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9b010b200220012802184199ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9a010b2002200128021841a0ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c99010b2002200128021841a9ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c98010b2002200128021841b2ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c97010b2002200128021841bcecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c96010b2002200128021841c6ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9501200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c95010b2002200128021841cfecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c94010b2002200128021841d8ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c93010b2002200128021841e2ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c92010b2002200128021841ececc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c91010b2002200128021841f6ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c90010b200220012802184180edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8f010b200220012802184188edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8e010b200220012802184190edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8d010b200220012802184198edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8c010b2002200128021841a0edc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8b010b2002200128021841a9edc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8a010b2002200128021841b3edc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c89010b2002200128021841bcedc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c88010b2002200128021841c6edc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c87010b2002200128021841d0edc400410d2001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41c0ebc40010de031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c86010b2002200128021841ddedc400410a2001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41c0ebc40010de031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c85010b2002200128021841e7edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41f0edc40010de031a20022d0008210120022802042203450d8401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c84010b200220012802184180eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a4188eec40010de031a20022d0008210120022802042203450d8301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c83010b200220012802184198eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d8201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c82010b2002200128021841a0eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a41a8eec40010de031a20022d0008210120022802042203450d8101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c81010b200128021841b8eec40041062001411c6a28020028020c11020021010c80010b200128021841beeec40041052001411c6a28020028020c11020021010c7f0b200128021841c3eec40041052001411c6a28020028020c11020021010c7e0b200128021841c8eec40041062001411c6a28020028020c11020021010c7d0b200128021841ceeec40041062001411c6a28020028020c11020021010c7c0b200128021841d4eec40041062001411c6a28020028020c11020021010c7b0b200128021841daeec40041062001411c6a28020028020c11020021010c7a0b200128021841e0eec40041062001411c6a28020028020c11020021010c790b200128021841e6eec40041062001411c6a28020028020c11020021010c780b200128021841eceec40041062001411c6a28020028020c11020021010c770b200128021841f2eec40041062001411c6a28020028020c11020021010c760b200128021841f8eec40041062001411c6a28020028020c11020021010c750b200128021841feeec40041052001411c6a28020028020c11020021010c740b20012802184183efc40041052001411c6a28020028020c11020021010c730b20012802184188efc40041062001411c6a28020028020c11020021010c720b2001280218418eefc40041062001411c6a28020028020c11020021010c710b20012802184194efc40041062001411c6a28020028020c11020021010c700b2001280218419aefc40041062001411c6a28020028020c11020021010c6f0b200128021841a0efc40041062001411c6a28020028020c11020021010c6e0b200128021841a6efc40041062001411c6a28020028020c11020021010c6d0b200128021841acefc40041062001411c6a28020028020c11020021010c6c0b200128021841b2efc40041062001411c6a28020028020c11020021010c6b0b200128021841b8efc40041052001411c6a28020028020c11020021010c6a0b200128021841bdefc40041052001411c6a28020028020c11020021010c690b200128021841c2efc40041052001411c6a28020028020c11020021010c680b200128021841c7efc40041052001411c6a28020028020c11020021010c670b200128021841ccefc40041052001411c6a28020028020c11020021010c660b200128021841d1efc40041052001411c6a28020028020c11020021010c650b200128021841d6efc40041052001411c6a28020028020c11020021010c640b200128021841dbefc40041052001411c6a28020028020c11020021010c630b200128021841e0efc40041052001411c6a28020028020c11020021010c620b200128021841e5efc40041052001411c6a28020028020c11020021010c610b200128021841eaefc40041052001411c6a28020028020c11020021010c600b200128021841efefc40041052001411c6a28020028020c11020021010c5f0b200128021841f4efc40041062001411c6a28020028020c11020021010c5e0b200128021841faefc40041062001411c6a28020028020c11020021010c5d0b20012802184180f0c40041092001411c6a28020028020c11020021010c5c0b20012802184189f0c40041062001411c6a28020028020c11020021010c5b0b2001280218418ff0c40041062001411c6a28020028020c11020021010c5a0b20012802184195f0c40041062001411c6a28020028020c11020021010c590b2001280218419bf0c40041072001411c6a28020028020c11020021010c580b200128021841a2f0c40041072001411c6a28020028020c11020021010c570b200128021841a9f0c40041072001411c6a28020028020c11020021010c560b200128021841b0f0c40041072001411c6a28020028020c11020021010c550b200128021841b7f0c40041062001411c6a28020028020c11020021010c540b200128021841bdf0c40041052001411c6a28020028020c11020021010c530b200128021841c2f0c40041062001411c6a28020028020c11020021010c520b200128021841c8f0c40041062001411c6a28020028020c11020021010c510b200128021841cef0c40041072001411c6a28020028020c11020021010c500b200128021841d5f0c40041072001411c6a28020028020c11020021010c4f0b200128021841dcf0c40041072001411c6a28020028020c11020021010c4e0b200128021841e3f0c40041072001411c6a28020028020c11020021010c4d0b200128021841eaf0c40041062001411c6a28020028020c11020021010c4c0b200128021841f0f0c40041062001411c6a28020028020c11020021010c4b0b200128021841f6f0c40041092001411c6a28020028020c11020021010c4a0b200128021841fff0c40041062001411c6a28020028020c11020021010c490b20012802184185f1c40041062001411c6a28020028020c11020021010c480b2001280218418bf1c40041062001411c6a28020028020c11020021010c470b20012802184191f1c40041072001411c6a28020028020c11020021010c460b20012802184198f1c40041072001411c6a28020028020c11020021010c450b2001280218419ff1c40041072001411c6a28020028020c11020021010c440b200128021841a6f1c40041072001411c6a28020028020c11020021010c430b200128021841adf1c40041062001411c6a28020028020c11020021010c420b200128021841b3f1c40041052001411c6a28020028020c11020021010c410b200128021841b8f1c40041062001411c6a28020028020c11020021010c400b200128021841bef1c40041062001411c6a28020028020c11020021010c3f0b200128021841c4f1c40041072001411c6a28020028020c11020021010c3e0b200128021841cbf1c40041072001411c6a28020028020c11020021010c3d0b200128021841d2f1c40041072001411c6a28020028020c11020021010c3c0b200128021841d9f1c40041072001411c6a28020028020c11020021010c3b0b200128021841e0f1c40041062001411c6a28020028020c11020021010c3a0b200128021841e6f1c40041062001411c6a28020028020c11020021010c390b200128021841ecf1c40041072001411c6a28020028020c11020021010c380b200128021841f3f1c40041082001411c6a28020028020c11020021010c370b200128021841fbf1c40041082001411c6a28020028020c11020021010c360b20012802184183f2c400410a2001411c6a28020028020c11020021010c350b2001280218418df2c40041072001411c6a28020028020c11020021010c340b20012802184194f2c40041062001411c6a28020028020c11020021010c330b2001280218419af2c40041062001411c6a28020028020c11020021010c320b200128021841a0f2c40041062001411c6a28020028020c11020021010c310b200128021841a6f2c40041062001411c6a28020028020c11020021010c300b200128021841acf2c40041062001411c6a28020028020c11020021010c2f0b200128021841b2f2c40041062001411c6a28020028020c11020021010c2e0b200128021841b8f2c400410b2001411c6a28020028020c11020021010c2d0b200128021841c3f2c40041062001411c6a28020028020c11020021010c2c0b200128021841c9f2c40041062001411c6a28020028020c11020021010c2b0b200128021841cff2c40041072001411c6a28020028020c11020021010c2a0b200128021841d6f2c40041082001411c6a28020028020c11020021010c290b200128021841def2c40041082001411c6a28020028020c11020021010c280b200128021841e6f2c400410a2001411c6a28020028020c11020021010c270b200128021841f0f2c40041072001411c6a28020028020c11020021010c260b200128021841f7f2c40041062001411c6a28020028020c11020021010c250b200128021841fdf2c40041062001411c6a28020028020c11020021010c240b20012802184183f3c40041062001411c6a28020028020c11020021010c230b20012802184189f3c40041062001411c6a28020028020c11020021010c220b2001280218418ff3c40041062001411c6a28020028020c11020021010c210b20012802184195f3c40041062001411c6a28020028020c11020021010c200b2001280218419bf3c400410b2001411c6a28020028020c11020021010c1f0b200128021841a6f3c400410a2001411c6a28020028020c11020021010c1e0b200128021841b0f3c400410c2001411c6a28020028020c11020021010c1d0b200128021841bcf3c400410c2001411c6a28020028020c11020021010c1c0b200128021841c8f3c400410c2001411c6a28020028020c11020021010c1b0b200128021841d4f3c400410c2001411c6a28020028020c11020021010c1a0b200128021841e0f3c400410d2001411c6a28020028020c11020021010c190b200128021841edf3c400410d2001411c6a28020028020c11020021010c180b200128021841faf3c400410c2001411c6a28020028020c11020021010c170b20012802184186f4c400410c2001411c6a28020028020c11020021010c160b20012802184192f4c400410c2001411c6a28020028020c11020021010c150b2001280218419ef4c400410c2001411c6a28020028020c11020021010c140b200128021841aaf4c400410e2001411c6a28020028020c11020021010c130b200128021841b8f4c400410e2001411c6a28020028020c11020021010c120b200128021841c6f4c400410e2001411c6a28020028020c11020021010c110b200128021841d4f4c400410e2001411c6a28020028020c11020021010c100b200128021841e2f4c400410c2001411c6a28020028020c11020021010c0f0b200128021841eef4c400410e2001411c6a28020028020c11020021010c0e0b200128021841fcf4c400410e2001411c6a28020028020c11020021010c0d0b2001280218418af5c400410e2001411c6a28020028020c11020021010c0c0b20012802184198f5c400410e2001411c6a28020028020c11020021010c0b0b200128021841a6f5c400410d2001411c6a28020028020c11020021010c0a0b200128021841b3f5c40041112001411c6a28020028020c11020021010c090b200128021841c4f5c40041112001411c6a28020028020c11020021010c080b200128021841d5f5c40041112001411c6a28020028020c11020021010c070b200128021841e6f5c40041112001411c6a28020028020c11020021010c060b200021010c050b200021010c040b200021010c030b200021010c020b200021010c010b200021010b200241106a2400200141ff01714100470bd3ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610272205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610272205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810272209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810272206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610272205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810272209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810272209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810272209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610272205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810272209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610272205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910272206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610272205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510272208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610272205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810272209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910272206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610272205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610272205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610272205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610272208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510272208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610272205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610272205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610272205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610272205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610272205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510272208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910272206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610272205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510272208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610272205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610272205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610272205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610272205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610272205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610272205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810272209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610272205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810272209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610272205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610272205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610272205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610272205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610272205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610272205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610272205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610272205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610272205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610272205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610272205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610272205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610272205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810272209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810272209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610272205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610272205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610272205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810272209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810272209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610272205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610272205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610272205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610272205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610272205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610272205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610272205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610272205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810272209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610272205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610272205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610272205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610272205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610272205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610272205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610272205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910272206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610272205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610272205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610272205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610272205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610272205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610272205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610272205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510272208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810272209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610272205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610272205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610272205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610272205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610272205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610272205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610272205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610272205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610272205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610272205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610272205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610272205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610272205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610272205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610272205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610272205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610272205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610272205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610272205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610272205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610272205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610272205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610272205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610272205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610272205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610272205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610272205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610272205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610272205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810272209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810272205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910272206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610272205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610272205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610272205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610272205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610272205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610272205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610272205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610272205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610272205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610272205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610272205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610272205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610272205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610272205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610272205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610272205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610272205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610272205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610272205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810272209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810272209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610272205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610272205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610272205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910272206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610272205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610272205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610272205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810272209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610272205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610272205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610272205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610272205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610272205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610272205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610272205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610272205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510272208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610272205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610272205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810272209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610272205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610272205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810272209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810272209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610272205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110272206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810272209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610272205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810272209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510272208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610272205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510272208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610272205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102622050db4050b20064101102a000b2008102622090dad050b20084101102a000b2008102622060da9050b20084101102a000b2006102622050da5050b20064101102a000b2008102622090da1050b20084101102a000b2008102622090d9a050b20084101102a000b2008102622090d96050b20084101102a000b2006102622050d92050b20064101102a000b2008102622090d8e050b20084101102a000b2006102622050d8a050b20064101102a000b2009102622060d86050b20094101102a000b2006102622050d82050b20064101102a000b2005102622080dfe040b20054101102a000b2006102622050dfa040b20064101102a000b2008102622090df6040b20084101102a000b2009102622060df2040b20094101102a000b2006102622050dee040b20064101102a000b2006102622050dea040b20064101102a000b2006102622050de6040b20064101102a000b2006102622080de2040b20064101102a000b2005102622080dde040b20054101102a000b2006102622050dda040b20064101102a000b2006102622050dd6040b20064101102a000b2006102622050dd2040b20064101102a000b2006102622050dce040b20064101102a000b2006102622050dca040b20064101102a000b2005102622080dc6040b20054101102a000b2009102622060dc2040b20094101102a000b2006102622050dbe040b20064101102a000b2005102622080dba040b20054101102a000b2006102622050db6040b20064101102a000b2006102622050db2040b20064101102a000b2006102622050dae040b20064101102a000b2006102622050daa040b20064101102a000b2006102622050da6040b20064101102a000b2006102622050da2040b20064101102a000b2006102622050dee040b20064101102a000b2008102622090d9c040b20084101102a000b2006102622050d98040b20064101102a000b2008102622090d94040b20084101102a000b2006102622050d90040b20064101102a000b2006102622050d8c040b20064101102a000b2006102622050d88040b20064101102a000b2006102622050d84040b20064101102a000b2006102622050d80040b20064101102a000b2006102622050dfc030b20064101102a000b2006102622050df8030b20064101102a000b2006102622050df4030b20064101102a000b2006102622050df0030b20064101102a000b2006102622050dec030b20064101102a000b2006102622050de8030b20064101102a000b2006102622050de4030b20064101102a000b2006102622050de0030b20064101102a000b2008102622090ddc030b20084101102a000b2008102622090dd8030b20084101102a000b2006102622050dd4030b20064101102a000b2006102622050dd0030b20064101102a000b2006102622050dcc030b20064101102a000b2008102622090dc8030b20084101102a000b2008102622090dc4030b20084101102a000b2006102622050dc0030b20064101102a000b2006102622050dbc030b20064101102a000b2006102622050db8030b20064101102a000b2006102622050db4030b20064101102a000b2006102622050db0030b20064101102a000b2006102622050dac030b20064101102a000b2006102622050da8030b20064101102a000b2006102622050da4030b20064101102a000b2008102622090da0030b20084101102a000b2006102622050d9c030b20064101102a000b2006102622050d98030b20064101102a000b2006102622050d94030b20064101102a000b2006102622050d90030b20064101102a000b2006102622050d8c030b20064101102a000b2006102622050d88030b20064101102a000b2006102622050d84030b20064101102a000b2009102622060d80030b20094101102a000b2006102622050dfc020b20064101102a000b2006102622050df8020b20064101102a000b2006102622050df4020b20064101102a000b2006102622050df0020b20064101102a000b2006102622050dec020b20064101102a000b2006102622050de8020b20064101102a000b2006102622050de4020b20064101102a000b2005102622080de0020b20054101102a000b2008102622090ddc020b20084101102a000b2006102622050dd8020b20064101102a000b2006102622050dd3020b20064101102a000b2006102622050dcf020b20064101102a000b2006102622050dcb020b20064101102a000b2006102622050dc7020b20064101102a000b2006102622050dc3020b20064101102a000b2006102622050dbf020b20064101102a000b2006102622050dbb020b20064101102a000b2006102622050db7020b20064101102a000b2006102622050db3020b20064101102a000b2006102622050daf020b20064101102a000b2006102622050dab020b20064101102a000b2006102622050da7020b20064101102a000b2006102622050da3020b20064101102a000b2006102622050d9f020b20064101102a000b2006102622050d9b020b20064101102a000b2006102622050d97020b20064101102a000b2006102622050d93020b20064101102a000b2006102622050d8f020b20064101102a000b2006102622050d8b020b20064101102a000b2006102622050d87020b20064101102a000b2006102622050d83020b20064101102a000b2006102622050dff010b20064101102a000b2006102622050dfb010b20064101102a000b2006102622050df7010b20064101102a000b2006102622050df3010b20064101102a000b2006102622050def010b20064101102a000b2006102622050deb010b20064101102a000b2006102622050de7010b20064101102a000b2008102622090de3010b20084101102a000b2008102622050ddf010b20084101102a000b2009102622060ddb010b20094101102a000b2006102622050dd7010b20064101102a000b2006102622050dd3010b20064101102a000b2006102622050dcf010b20064101102a000b2006102622050dcb010b20064101102a000b2006102622050dc7010b20064101102a000b2006102622050dc3010b20064101102a000b2006102622050dbf010b20064101102a000b2006102622050dbb010b20064101102a000b2006102622050db7010b20064101102a000b2006102622050db3010b20064101102a000b2006102622050daf010b20064101102a000b2006102622050dab010b20064101102a000b2006102622050da7010b20064101102a000b2006102622050da3010b20064101102a000b2006102622050d9f010b20064101102a000b2006102622050d9b010b20064101102a000b2006102622050d97010b20064101102a000b2006102622050d93010b20064101102a000b2006102622050d8f010b20064101102a000b2008102622090d8b010b20084101102a000b2008102622090d87010b20084101102a000b2006102622050d83010b20064101102a000b2006102622050d7f0b20064101102a000b2006102622050d7b0b20064101102a000b2009102622060d770b20094101102a000b2006102622050d730b20064101102a000b2006102622050d6f0b20064101102a000b2006102622050d6b0b20064101102a000b2008102622090d670b20084101102a000b2006102622050d630b20064101102a000b2006102622050d5f0b20064101102a000b2006102622050d5b0b20064101102a000b2006102622050d570b20064101102a000b2006102622050d530b20064101102a000b2006102622050d4f0b20064101102a000b2006102622050d4b0b20064101102a000b2006102622050d470b20064101102a000b2005102622080d430b20054101102a000b2006102622050d3f0b20064101102a000b2006102622050d3b0b20064101102a000b2008102622090d370b20084101102a000b2006102622050d330b20064101102a000b2006102622050d2f0b20064101102a000b2008102622090d2b0b20084101102a000b2008102622090d270b20084101102a000b2006102622050d230b20064101102a000b2001102622060d1f0b20014101102a000b2008102622090d1b0b20084101102a000b2006102622050d170b20064101102a000b2008102622090d130b20084101102a000b2005102622080d0f0b20054101102a000b2006102622050d0b0b20064101102a000b2005102622080d070b20054101102a000b2006102622050d030b20064101102a000b101e000b101e000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d4101102a000b20094101102a000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210af020240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102722050d020c060b200928020021050c020b200810262205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10230b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1023200341106a24000f0b20084101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210b00220032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a200210b10220032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001023200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d4101102a000b20094101102a000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b20094101102a000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102722080d020c050b200b28020021080c020b200710262208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610272205450d020c040b200b28020021050c040b2006102622050d020b20064101102a000b20074101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102722060d020c070b200728020021060c020b200910262206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b101e000b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102722050d020c070b200728020021050c020b200910262205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b101e000b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200341106a24000bc60301067f2004410c6a2105200441086a2106200441046a210702400240024003400240024002400240200628020020052802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120072802002008200a102722090d020c070b200728020021090c020b200a10262209450d050b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b024020022003460d002004410c6a2105200441086a2106200441046a210703402002280200210103400240024002400240200628020020052802002208470d00200841016a22092008490d072008410174220a20092009200a491b220a4100480d072008450d0120072802002008200a102722090d020c080b200728020021090c020b200a10262209450d060b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b200241046a22022003470d000b0b2000411a3a00000f0b101e000b200a4101102a000b200a4101102a000bd40301077f200141c000712103200141ff00712104024002400240024002400240200141077522050d002003450d010b2002410c6a2106200241086a2107200241046a2108034002402005417f470d00200341ff01710d020b0240024002400240200728020020062802002209470d00200941016a22032009490d0620094101742204200320032004491b22044100480d062009450d01200828020020092004102722030d020c070b200828020021030c020b200410262203450d050b2007200436020020082003360200200628020021090b2006200941016a360200200320096a200141807f723a0000200541c000712103200541ff007121042005210120054107752209210520090d002009210520030d000b0b024002400240200241086a2802002002410c6a2802002205470d00200541016a22092005490d0320054101742206200920092006491b22064100480d032005450d01200241046a2802002005200610272209450d020c050b200241046a28020021090c050b2006102622090d030b20064101102a000b101e000b20044101102a000b200241086a2006360200200241046a20093602002002410c6a28020021050b2002410c6a200541016a360200200920056a20043a00002000411a3a00000bd40301077f2001a7220341c000712104200341ff00712105024002400240024002400240200142078722014200520d002004450d010b2002410c6a2106200241086a2107200241046a2108034002402001427f520d00200441ff01710d020b0240024002400240200728020020062802002204470d00200441016a22052004490d0620044101742209200520052009491b22094100480d062004450d01200828020020042009102722050d020c070b200828020021050c020b200910262205450d050b2007200936020020082005360200200628020021040b2006200441016a360200200520046a200341807f723a00002001a7220341c000712104200341ff00712105200142078722014200520d0020040d000b0b024002400240200241086a2802002002410c6a2802002204470d00200441016a22032004490d0320044101742206200320032006491b22064100480d032004450d01200241046a2802002004200610272203450d020c050b200241046a28020021030c050b2006102622030d030b20064101102a000b101e000b20094101102a000b200241086a2006360200200241046a20033602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000bf61402047f017e2000280248210202400240024002400240024002400240200141046a2802002203200141086a28020022046b41044f0d00200441046a22052004490d0520034101742204200520052004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200320046a20023600002000290300210602400240024002400240200141046a2802002203200528020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290308210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290310210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290318210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290320210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290328210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290330210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290338210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290340210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a2006370000200028024c210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280250210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280254210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a200536000002400240024002400240200141046a28020020022802002204470d00200441016a22032004490d0520044101742202200320032002491b22024100480d052004450d0120012802002004200210272203450d020c030b200128020021030c030b2002102622030d010b20024101102a000b20012003360200200141046a2002360200200141086a28020021040b200141086a2202200441016a360200200320046a200041dc006a2d00003a000020002802582103024002400240200141046a2802002204200228020022006b41044f0d00200041046a22022000490d0320044101742200200220022000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a20033600000bc00201037f230041106b22022400200241003602082002420137030020002d0000210341011026210402400240024002400240024020034101470d002004450d03200441013a000020024281808080103702042002200436020020044101412110272204450d0420042000290001370001200441096a200041096a290000370000200441116a200041116a290000370000200441196a200041196a290000370000200242a1808080900437020420022004360200200128020020012802042004412110044100450d010c020b2004450d04200441003a0000200242818080801037020420022004360200200041086a200210b402200228020421002001280200200128020420022802002204200241086a28020010042000450d010b200410230b200241106a24000f0b41014101102a000b41214101102a000b41014101102a000b8a0c02067f027e230041106b22022400200028022821032002200041306a280200220436020c2002410c6a2001104102400240024002400240024002400240200141046a2802002205200141086a28020022066b20044f0d00200620046a22072006490d0520054101742206200720072006491b22064100480d052005450d0120012802002005200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021060b200141086a2207200620046a360200200520066a200320041094041a2000280234210502400240024002400240200141046a2802002206200728020022046b41044f0d00200441046a22032004490d0520064101742204200320032004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2203200441046a360200200620046a200536000002400240024002400240200141046a2802002206200328020022046b41204f0d00200441206a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441206a360200200620046a220441186a200041d0006a290000370000200441106a200041c8006a290000370000200441086a200041c0006a29000037000020042000290038370000200041086a29030021082000290300210902400240024002400240200141046a2802002206200528020022046b41104f0d00200441106a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441106a360200200620046a22042008370008200420093700002000290310210802400240024002400240200141046a2802002206200528020022046b41084f0d00200441086a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441086a360200200620046a20083700000240024002400240024002400240024002400240024020002903184201520d00200141046a28020020052802002204470d01200441016a22062004490d0b20044101742205200620062005491b22054100480d0b2004450d0320012802002004200510272206450d040c090b200141046a28020020052802002200470d01200041016a22042000490d0a20004101742206200420042006491b22064100480d0a2000450d0420012802002000200610272204450d050c060b200128020021060c080b200128020021040c050b2005102622060d050b20054101102a000b2006102622040d010b20064101102a000b20012004360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200420006a41003a0000200241106a24000f0b20012006360200200141046a2005360200200141086a28020021040b200141086a2205200441016a360200200620046a41013a0000200041206a2903002108024002400240200141046a2802002204200528020022006b41084f0d00200041086a22062000490d0320044101742200200620062000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200420006a2008370000200241106a24000b13002000410636020420004198cfc2003602000b130020004108360204200041a0c9c2003602000b13002000411636020420004188e7c2003602000b7801047f230041106b2202240020024100360208200242013703000240410110262203450d00200220033602002002410136020420002002290300370200200241086a22042004280200220441016a2205360200200320046a41003a0000200041086a2005360200200241106a24000f0b41014101102a000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242003700000f0b41084101102a000bab0101017f230041f0006b22022400200241003a005c20024280808480800237035020024201370340200242013703382002420137033020024201370328200242013703202002420137031820024201370310200242013703082002420137030020024280808080c0003703482002412036025820024100360268200242013703602002200241e0006a10b202200041086a200228026836020020002002290360370200200241f0006a24000b3501017f0240410810262202450d002000428880808080013702042000200236020020024280ade2043700000f0b41084101102a000b3301017f0240410410262202450d0020004284808080c00037020420002002360200200241e4003600000f0b41044101102a000b3301017f0240410810262202450d0020004288808080800137020420002002360200200242af013700000f0b41084101102a000b3301017f0240410810262202450d002000428880808080013702042000200236020020024287013700000f0b41084101102a000b3901017f0240411010262202450d002002420037000820024215370000200042908080808002370204200020023602000f0b41104101102a000bc32b05087f037e037f017e047f23004190056b22022400200241003a00c80220012802002001280204200241c8026a410120012802081001210320012001280208200341016a41014b22036a220436020802400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00c802220341054b0d06024020030e06000503040206000b200241c8026a200110c102200241b0046a200241c8026a41dc001094041a20024190046a41026a2201200241a7036a2d00003a0000200220022f00a5033b01900420022d00a40322034102470d09200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200241b0046a41186a22054200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a2208280200200241b0046a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d05200241e8016a41186a22042005290300370300200241e8016a41106a22052006290300370300200241e8016a41086a22062007290300370300200220022903b0043703e801200241c8026a41186a22072004290300370300200241c8026a41106a22042005290300370300200241c8026a41086a22052006290300370300200220022903e8013703c802200241f0036a41186a2007290300370300200241f0036a41106a2004290300370300200241f0036a41086a2005290300370300200220022903c8023703f003200241003a00c80220012802002008280200200241c8026a410120091001210420032003280200200441016a41014b22046a22053602002004450d0920022d00c8022203450d1520034101470d09200241b0046a41186a22044200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a280200200241b0046a41202005100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d09200241e8016a41186a22012004290300370300200241e8016a41106a22032006290300370300200241e8016a41086a22042007290300370300200220022903b0043703e801200241c8026a41186a22052001290300370300200241c8026a41106a22012003290300370300200241c8026a41086a22032004290300370300200220022903e8013703c80220024190046a41186a200529030037030020024190046a41106a200129030037030020024190046a41086a2003290300370300200220022903c80237039004410121010c160b20024180016a200110c202200241c8026a41086a220320024189016a290000370300200241c8026a41106a220420024191016a290000370300200241c8026a41186a220520024199016a290000370300200241c8026a411f6a2206200241a0016a28000036000020022002290081013703c80220022d00800122074102470d05200041073a000020024190056a24000f0b200241e0006a2001104c2002290360a7450d08200241f0006a290300210a2002290368210b200241d0006a2001104b2002290350a7450d0b2002290358210c200241b0046a41186a22064200370300200241b0046a41106a22074200370300200241b0046a41086a22084200370300200242003703b00441002105200141086a220341002001280200200141046a280200200241b0046a41202003280200100122042004417f461b2204412020044120491b20032802006a36020002402004411f4d0d00200241e8016a41186a22032006290300370300200241e8016a41106a22042007290300370300200241e8016a41086a22052008290300370300200220022903b0043703e80120024180016a41186a200329030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903e80137038001410121050b200241c8026a41186a220320024180016a41186a290300370300200241c8026a41106a220420024180016a41106a290300370300200241c8026a41086a220620024180016a41086a29030037030020022002290380013703c8022005450d0c20024190046a41186a200329030037030020024190046a41106a200429030037030020024190046a41086a2006290300370300200220022903c80237039004200241c8006a2001104a2002280248450d1a200228024c2203417f4c0d1e2003450d18200310ac012204450d22200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d190c260b200241086a2001104b2002290308a7450d082002290310210a20022001104a2002280200450d0f20022802042203417f4c0d1d2003450d0d200310ac012204450d20200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d0e0c240b200241b0046a41186a22054200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a2208280200200241b0046a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d04200241e8016a41186a22042005290300370300200241e8016a41106a220d2006290300370300200241e8016a41086a220e2007290300370300200220022903b0043703e801200241c8026a41186a220f2004290300370300200241c8026a41106a2204200d290300370300200241c8026a41086a220d200e290300370300200220022903e8013703c802200241f0036a41186a200f290300370300200241f0036a41106a2004290300370300200241f0036a41086a200d290300370300200220022903c8023703f003200542003703002006420037030020074200370300200242003703b0042003410020012802002008280200200241b0046a41202009100122042004417f461b2204412020044120491b20032802006a22053602002004411f4d0d08200241e8016a41186a2203200241b0046a41186a290300370300200241e8016a41106a2204200241b0046a41106a290300370300200241e8016a41086a2206200241b0046a41086a290300370300200220022903b0043703e80120024190046a41186a200329030037030020024190046a41106a200429030037030020024190046a41086a2006290300370300200220022903e8013703900420024200370388012002420037038001200141086a220441002001280200200141046a28020020024180016a41102005100122032003417f461b2203411020034110491b20042802006a3602002003410f4d0d0f20024180016a41086a290300210c2002290380012110200241f8006a2001104a2002280278450d1b200228027c2211ad220a421b88a70d1c200a420586a72203417f4c0d1c2003450d1920031026220d0d1a20034101102a000b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200241b0046a411f6a2006280000360000200241b0046a41186a2005290300370300200241b0046a41106a2004290300370300200241b0046a41086a2003290300370300200220022903c8023703b004200241306a2001104c2002290330a7450d08200241306a41106a290300210a2002290338210b200241206a2001104b2002290320a7450d0d2002290328210c200241186a2001104a2002280218450d12200228021c2203417f4c0d192003450d10200310ac012204450d1e200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d110c1f0b200241e8016a200241b0046a41dc001094041a200241f0036a41026a220420012d00003a0000200220022f0190043b01f00320024187016a200241e8016a41dc001094041a200041013a0000200041016a20024180016a41e3001094041a200041e4006a20033a0000200041e5006a20022f01f0033b0000200041e7006a20042d00003a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d160b2003450d00200410230b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b410021010b200241b0036a41186a220320024190046a41186a290300370300200241b0036a41106a220420024190046a41106a290300370300200241b0036a41086a220520024190046a41086a29030037030020022002290390043703b003200241d0036a41186a2206200241f0036a41186a290300370300200241d0036a41106a2207200241f0036a41106a290300370300200241d0036a41086a2208200241f0036a41086a290300370300200220022903f0033703d003200041053a0000200041216a20013a0000200020022903d003370001200041096a2008290300370000200041116a2007290300370000200041196a2006290300370000200041226a20022903b0033700002000412a6a2005290300370000200041326a20042903003700002000413a6a2003290300370000200041e0006a2002419e016a290100370100200041da006a20024180016a41186a290100370100200041d2006a20024180016a41106a290100370100200041ca006a20024180016a41086a290100370100200041c2006a20022901800137010020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d0e0b2003450d00200410230b200041073a000020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d0d0b2003450d00200410230b200041073a000020024190056a24000f0b4101210d0b0240024002402011450d0020024180016a41186a210820024180016a41106a2109200141046a21124200210a410021074100210541002104201121130340200842003703002009420037030020024180016a41086a220e42003703002002420037038001200141086a220341002001280200201228020020024180016a41202003280200100122062006417f461b2206412020064120491b20032802006a3602002006411f4d0d03200441016a2103200241c8026a41186a22062008290300370300200241c8026a41106a220f2009290300370300200241c8026a41086a2214200e29030037030020022002290380013703c802024020042013470d002007200320032007491b2213ad420586220b422088a70d07200ba7220e4100480d0702402004450d00200d2005200e1027220d0d010c090b200e1026220d450d080b200d20056a220420022903c802370000200441186a2006290300370000200441106a200f290300370000200441086a2014290300370000200a4280808080107c210a200741026a2107200541206a21052003210420032011490d000c020b0b410021134200210a0b200d450d01200241d0036a41186a2201200241f0036a41186a290300370300200241d0036a41106a2203200241f0036a41106a290300370300200241d0036a41086a2204200241f0036a41086a290300370300200241b0036a41086a220520024190046a41086a290300370300200241b0036a41106a220620024190046a41106a290300370300200241b0036a41186a220720024190046a41186a290300370300200220022903f0033703d00320022002290390043703b003200041063a0000200020022903d003370001200041096a2004290300370000200041116a2003290300370000200041196a2001290300370000200041216a20022903b003370000200041296a2005290300370000200041316a2006290300370000200041396a2007290300370000200041c1006a20022f00ad033b0000200041c3006a200241af036a2d00003a0000200041d8006a200c370300200041d0006a2010370300200041c8006a200a2013ad84370000200041c4006a200d36000020024190056a24000f0b2013450d00200d10230b200041073a000020024190056a24000f0b101d000b101e000b200e4101102a000b20034101102a000b20034101102a000b20034101102a000b200241e8016a411f6a2201200241b0046a411f6a280000360000200241e8016a41186a2205200241b0046a41186a290300370300200241e8016a41106a2206200241b0046a41106a290300370300200241e8016a41086a2208200241b0046a41086a290300370300200220022903b0043703e801200041c0006a200a370300200041386a200b370300200041033a0000200041046a20073a0000200041c8006a200c3703002000412c6a2003ad220a422086200a84370200200041286a2004360200200020022f00f0033b0001200041036a200241f2036a2d00003a0000200041056a20022903e8013700002000410d6a2008290300370000200041156a20062903003700002000411d6a2005290300370000200041246a2001280000360000200041e0006a20024190046a41106a290300370300200041d8006a20024190046a41086a290300370300200041d0006a20022903900437030020024190056a24000f0b200020022f00c8023b0001200041023a0000200041106a200a370300200041046a2004360000200041036a200241c8026a41026a2d00003a0000200041086a2003ad220a422086200a84370000200041186a20024180016a41d0001094041a20024190056a24000f0b200241f0036a41186a220120024190046a41186a290300370300200241f0036a41106a220520024190046a41106a290300370300200241f0036a41086a220620024190046a41086a29030037030020022002290390043703f003200041386a200a370300200041306a200b370300200041043a0000200041c0006a200c370300200041286a2003ad220a422086200a84370000200041246a2004360000200020022903f003370001200041096a2006290300370000200041116a2005290300370000200041196a2001290300370000200041216a20022f00b0033b0000200041236a200241b2036a2d00003a0000200041c8006a20022903d003370300200041d0006a200241d0036a41086a290300370300200041d8006a200241d0036a41106a290300370300200041e0006a200241d0036a41186a29030037030020024190056a24000be10c05057f017e017f087e037f230041106b22022400200241003602082001410020012802002001280204200241086a41042001280208100122032003417f461b2203410420034104491b20012802086a2204360208024002400240024002400240024002400240024002400240024002400240200341034d0d002002280208210520024200370308200141086a220641002001280200200141046a280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d012002290308210720024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d022002290308210920024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d032002290308210a20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d042002290308210b20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d052002290308210c20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d062002290308210d20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d072002290308210e20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d082002290308210f20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d0920022903082110200141046a22082802002103200241003602082006410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0a200228020821112008280200210320024100360208200141086a2206410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0b20022802082112200141046a22082802002103200241003602082006410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0c20022802082113200241003a000820012802002008280200200241086a4101200410012104200141086a22032003280200200441016a41014b22046a22063602002004450d0d20022d00082108200141046a2802002104200241003602082003410020012802002004200241086a41042006100122012001417f461b2201410420014104491b20032802006a360200200141034d0d0e20022802082101200020083a005c2000200136025820002013360254200020123602502000201136024c20002005360248200020103703402000200f3703382000200e3703302000200d3703282000200c3703202000200b3703182000200a3703102000200937030820002007370300200020022f00053b005d200041df006a200241076a2d00003a0000200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000be10701067f230041f0006b22022400200241003a005020012802002001280204200241d0006a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002402003450d0020022d0050220341ef014d0d01200341847e6a220341034b0d00024002400240024020030e0400010203000b200141046a2802002103200241003b0150200141086a2205410020012802002003200241d0006a41022004100122012001417f461b2201410220014102491b20052802006a360200200141014d0d0320022f0150220341f0014f0d040c030b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d024101210120022802502203418080044f0d040c020b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a3602000c010b200241d0006a41186a4200370300200241d0006a41106a4200370300200241d0006a41086a42003703002002420037035041002105200141086a220341002001280200200141046a280200200241d0006a41202004100122012001417f461b2201412020014120491b20032802006a360200024002402001411f4d0d00200241ca006a20022d00523a0000200241286a41086a200241df006a290000370300200241286a41106a200241e7006a290000370300200241286a41186a200241d0006a411f6a2d00003a0000200220022f01503b01482002200229005737032820022800532103410121050c010b0b200241cc006a41026a2201200241c8006a41026a2d00003a0000200241d0006a41086a2204200241286a41086a290300370300200241d0006a41106a2206200241286a41106a290300370300200241d0006a41186a2207200241286a41186a2d00003a0000200220022f01483b014c200220022903283703502005450d00200241246a41026a20012d00003a0000200241086a41086a2004290300370300200241086a41106a2006290300370300200241086a41186a20072d00003a0000200220022f014c3b012420022002290350370308410021010c020b200041023a0000200241f0006a24000f0b410121010b200020022f01243b0001200020013a0000200041046a2003360200200041086a2002290308370200200041036a200241266a2d00003a0000200041106a200241086a41086a290300370200200041186a200241086a41106a290300370200200041206a200241086a41186a280200360200200241f0006a24000bca3303077f097e097f230041d0036b22022400200241003a00a803200241a8036a200128020022032001280204220441004722051094041a02400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d00a803220441054b0d06024020040e06000503040206000b200241003602880120024188016a20052006410420064104491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641034d0d072002280288012108200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d072002290388012109200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210a200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210b200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210c200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210d200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210e200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210f200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d072002290388012110200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d072002290388012111200241003602880120024188016a20052006410420064104491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641034d0d072002280288012112200241003602880120024188016a20052004410420044104491b22031094041a2007200420036b22063602002001200520036a2205360200200441034d0d072002280288012107200241003602880120024188016a20052006410420064104491b22031094041a200141046a200620036b22043602002001200520036a2205360200200641034d0d072002280288012113200241003a00880120024188016a2005200441004722061094041a20042006490d2e200141046a2214200420066b22033602002001200520066a22053602002004450d0720022d0088012106200241003602880120024188016a20052003410420034104491b22041094041a2014200320046b3602002001200520046a360200200341034d0d072002280288012101200241d8016a41026a220420024180026a41026a2d00003a0000200220022f0080023b01d801200041013a0000200041e4006a20063a0000200041e0006a2001360000200041dc006a2013360000200041d8006a2007360000200041d4006a2012360000200041d0006a2008360000200041c8006a2011370000200041c0006a2010370000200041386a200f370000200041306a200e370000200041286a200d370000200041206a200c370000200041186a200b370000200041106a200a370000200041086a2009370000200020022800a803360001200041046a200241a8036a41036a280000360000200041e7006a20042d00003a0000200041e5006a20022f01d8013b0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b20024180026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a200141046a200620046b22033602002001200520046a22043602002006411f4d0d06200241d8016a41186a220520024180026a41186a290000370300200241d8016a41106a220620024180026a41106a290000370300200241d8016a41086a220720024180026a41086a29000037030020022002290080023703d801200241a8036a41186a22082005290300370300200241a8036a41106a22052006290300370300200241a8036a41086a22062007290300370300200220022903d8013703a803200241e8026a41186a2008290300370300200241e8026a41106a2005290300370300200241e8026a41086a2006290300370300200220022903a8033703e802200241003a00a803200241a8036a2004200341004722051094041a20032005490d24200141046a200320056b22063602002001200420056a22043602002003450d0b20022d00a8032205450d1620054101470d0b20024180026a2006412020064120491b22056a41004100412020056b2005411f4b1b1093041a20024180026a200420051094041a200141046a200620056b3602002001200420056a3602002006411f4d0d0b200241d8016a41186a220120024180026a41186a290000370300200241d8016a41106a220420024180026a41106a290000370300200241d8016a41086a220520024180026a41086a29000037030020022002290080023703d801200241a8036a41186a22062001290300370300200241a8036a41106a22012004290300370300200241a8036a41086a22042005290300370300200220022903d8013703a80320024188036a41186a200629030037030020024188036a41106a200129030037030020024188036a41086a2004290300370300200220022903a80337038803410121010c170b20024188016a2001109502200241a8036a41086a220420024191016a290000370300200241a8036a41106a220520024199016a290000370300200241a8036a41186a2206200241a1016a290000370300200241a8036a411f6a2203200241a8016a28000036000020022002290089013703a80320022d00880122074102470d06200041073a0000200241d0036a24000f0b200241e8006a200110472002290368a7450d07200241f8006a29030021092002290370210a200241d8006a200110462002290358a7450d0b2002290360210b20024180026a41186a2207420037030020024180026a41106a2208420037030020024180026a41086a22124200370300200242003703800220024180026a20012802002206200141046a22032802002204412020044120491b22051094041a2003200420056b3602002001200620056a3602002004411f4d0d0c200241d8016a41186a22042007290300370300200241d8016a41106a22052008290300370300200241d8016a41086a2206201229030037030020022002290380023703d80120024188016a41186a200429030037030020024188016a41106a200529030037030020024188016a41086a2006290300370300200220022903d80137038801410121040c0d0b200241106a200110462002290310a7450d0720022903182109200241086a200110452002280208450d10200228020c2204417f4c0d1f2004450d0e200410ac012206450d2320062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d242003200720056b3602002001200128020020056a36020020052004470d0f0c2c0b20024180026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a200141046a2214200620046b22033602002001200520046a22053602002006411f4d0d04200241d8016a41186a220620024180026a41186a2215290000370300200241d8016a41106a220720024180026a41106a2216290000370300200241d8016a41086a220820024180026a41086a221729000037030020022002290080023703d801200241a8036a41186a22042006290300370300200241a8036a41106a22122007290300370300200241a8036a41086a22132008290300370300200220022903d8013703a803200241e8026a41186a2004290300370300200241e8026a41106a2012290300370300200241e8026a41086a2013290300370300200220022903a8033703e80220024180026a2003412020034120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a2014200320046b22123602002001200520046a22043602002003411f4d0d0820062015290000370300200720162900003703002008201729000037030020022002290080023703d80120024188036a41186a200629030037030020024188036a41106a200729030037030020024188036a41086a2008290300370300200220022903d801370388032002420037039001200242003703880120024188016a20042012411020124110491b22051094041a200141046a201220056b3602002001200420056a3602002012410f4d0d1020024190016a290300210b200229038801210c20024180016a20011045200228028001450d1c2002280284012218ad2209421b88a70d1e2009420586a72204417f4c0d1e2004450d1a2004102622160d1b20044101102a000b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b20024180026a411f6a200328000036000020024180026a41186a200629030037030020024180026a41106a200529030037030020024180026a41086a2004290300370300200220022903a80337038002200241386a200110472002290338a7450d08200241386a41106a29030021092002290340210a200241286a200110462002290328a7450d0d2002290330210b200241206a200110452002280220450d1220022802242204417f4c0d1a2004450d10200410ac012206450d2020062001280200200141046a22032802002205200420052004491b22051094041a200328020022082005490d212003200820056b3602002001200128020020056a36020020052004470d110c260b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b410021040b200241a8036a41186a220520024188016a41186a290300370300200241a8036a41106a220620024188016a41106a290300370300200241a8036a41086a220320024188016a41086a29030037030020022002290388013703a80302402004450d0020024188036a41186a200529030037030020024188036a41106a200629030037030020024188036a41086a2003290300370300200220022903a80337038803200241d0006a200110452002280250450d0e20022802542204417f4c0d132004450d0c200410ac012206450d1b20062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d1c2003200720056b3602002001200128020020056a36020020052004470d0d0c1e0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b4101210641002004460d1d0b2004450d00200610230b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b410021010b200241a8026a41186a220420024188036a41186a290300370300200241a8026a41106a220520024188036a41106a290300370300200241a8026a41086a220620024188036a41086a29030037030020022002290388033703a802200241c8026a41186a2203200241e8026a41186a290300370300200241c8026a41106a2207200241e8026a41106a290300370300200241c8026a41086a2208200241e8026a41086a290300370300200220022903e8023703c802200041053a0000200041216a20013a0000200020022903c802370001200041096a2008290300370000200041116a2007290300370000200041196a2003290300370000200041226a20022903a8023700002000412a6a2006290300370000200041326a20052903003700002000413a6a2004290300370000200041e0006a200241a6016a290100370100200041da006a20024188016a41186a290100370100200041d2006a20024188016a41106a290100370100200041ca006a20024188016a41086a290100370100200041c2006a200229018801370100200241d0036a24000f0b4101210641002004460d150b2004450d00200610230b200041073a0000200241d0036a24000f0b4101210641002004460d110b2004450d00200610230b200041073a0000200241d0036a24000f0b410121160b0240024002402018450d0020024188016a41186a211220024188016a41106a211420024188016a41086a2113200141046a210842002109410021074100210641002105201821190340201242003703002014420037030020134200370300200242003703880120024188016a2001280200221520082802002204412020044120491b22031094041a2008200420036b3602002001201520036a3602002004411f4d0d03200541016a2104200241a8036a41186a22032012290300370300200241a8036a41106a22152014290300370300200241a8036a41086a2217201329030037030020022002290388013703a803024020052019470d002007200420042007491b2219ad420586220a422088a70d08200aa7221a4100480d0802402005450d0020162006201a102722160d010c0b0b201a10262216450d0a0b201620066a220520022903a803370000200541186a2003290300370000200541106a2015290300370000200541086a201729030037000020094280808080107c2109200741026a2107200641206a21062004210520042018490d000c020b0b41002119420021090b2016450d01200241c8026a41186a2201200241e8026a41186a290300370300200241c8026a41106a2204200241e8026a41106a290300370300200241c8026a41086a2205200241e8026a41086a290300370300200241a8026a41086a220620024188036a41086a290300370300200241a8026a41106a220320024188036a41106a290300370300200241a8026a41186a220720024188036a41186a290300370300200220022903e8023703c80220022002290388033703a802200041063a0000200020022903c802370001200041096a2005290300370000200041116a2004290300370000200041196a2001290300370000200041216a20022903a802370000200041296a2006290300370000200041316a2003290300370000200041396a2007290300370000200041c1006a20022f00a5023b0000200041c3006a200241a7026a2d00003a0000200041d8006a200b370300200041d0006a200c370300200041c8006a20092019ad84370000200041c4006a2016360000200241d0036a24000f0b2019450d00201610230b200041073a0000200241d0036a24000f0b200520041048000b101d000b101e000b200520031048000b201a4101102a000b20044101102a000b200520071048000b20044101102a000b200520081048000b20044101102a000b200520071048000b200620041048000b200241e8026a41186a220120024188036a41186a290300370300200241e8026a41106a220520024188036a41106a290300370300200241e8026a41086a220320024188036a41086a29030037030020022002290388033703e802200041386a2009370300200041306a200a370300200041043a0000200041c0006a200b370300200041286a2004ad2209422086200984370000200041246a2006360000200020022903e802370001200041096a2003290300370000200041116a2005290300370000200041196a2001290300370000200041216a20022f00a8023b0000200041236a200241aa026a2d00003a0000200041c8006a20022903c802370300200041d0006a200241c8026a41086a290300370300200041d8006a200241c8026a41106a290300370300200041e0006a200241c8026a41186a290300370300200241d0036a24000f0b200241d8016a411f6a220120024180026a411f6a280000360000200241d8016a41186a220520024180026a41186a290300370300200241d8016a41106a220320024180026a41106a290300370300200241d8016a41086a220820024180026a41086a29030037030020022002290380023703d801200041c0006a2009370300200041386a200a370300200041033a0000200041046a20073a0000200041c8006a200b3703002000412c6a2004ad2209422086200984370200200041286a2006360200200020022f00e8023b0001200041036a200241ea026a2d00003a0000200041056a20022903d8013700002000410d6a2008290300370000200041156a20032903003700002000411d6a2005290300370000200041246a2001280000360000200041e0006a20024188036a41106a290300370300200041d8006a20024188036a41086a290300370300200041d0006a200229038803370300200241d0036a24000f0b200020022f00a8033b0001200041023a0000200041106a2009370300200041046a2006360000200041036a200241a8036a41026a2d00003a0000200041086a2004ad2209422086200984370000200041186a20024188016a41d0001094041a200241d0036a24000b8812010d7f230041a0016b22032400024002400240024002400240024002400240024002400240024002400240411410262204450d00200441106a41002800d28943360000200441086a41002900ca8943370000200441002900c2894337000020044114413410272204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341f8006a41186a22054200370300200341f8006a41106a22064200370300200341f8006a41086a220742003703002003420037037820044134200341f8006a1002200341d8006a41186a2005290300370300200341d8006a41106a2006290300370300200341d8006a41086a2007290300370300200320032903783703580240024002400240200341d8006a412041a886c500410041001001417f460d002003422037027c2003200341d8006a360278200341286a200341f8006a104a2003280228450d03200328022c2106200341206a200341f8006a104a2003280220450d0320032802242107200341186a200341f8006a104a2003280218450d03200328021c210841002109200341003a009f0120034180016a2205200528020022052003280278200328027c2003419f016a41012005100141016a41014b22056a3602002005450d03024020032d009f012205450d004101210920054101470d040b200341106a200341f8006a104a2003280210450d0320032802142205417f4c0d092005450d01200510ac01220a450d0620034180016a220b200b280200220b200541002003280278200328027c200a2005200b1001220b200b417f461b220b200b20054b1b220b6a360200200b2005470d020c070b200410234101210441d689c300210641112107410221090c070b4101210a2003280278200328027c4101410020034180016a28020010011a41002005460d050b2005450d00200a10230b41d4aac10041331021000b41144101102a000b41344101102a000b20054101102a000b200341d4006a41026a220b200341386a41026a2d00003a0000200320032f00383b0154200341f8006a41026a220c200b2d00003a0000200320032f01543b017820041023200341d8006a41026a200c2d00003a0000200320032f01783b0158410021040b200341346a41026a220b200341d8006a41026a2d00003a0000200320032f01583b013402402004450d002000200636020420004101360200200041086a2007360200200341a0016a24000f0b200341306a41026a200b2d00003a0000200320032f01343b01300240024002400240200228024820064d0d00411510262204450d05410021062004410d6a41002900f48943370000200441086a41002900ef8943370000200441002900e7894337000020044115413510272204450d06200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341f8006a41186a22074200370300200341f8006a41106a22094200370300200341f8006a41086a220b42003703002003420037037820044135200341f8006a1002200341d8006a41186a2007290300370300200341d8006a41106a2009290300370300200341d8006a41086a200b29030037030020032003290378370358200341d8006a412041a886c500410041001001417f460d012003422037027c2003200341d8006a360278200341086a200341f8006a104a2003280208450d08200328020c2207417f4c0d042007450d02200710ac012206450d0920034180016a220920092802002209200741002003280278200328027c200620072009100122092009417f461b2209200920074b1b22096a36020020092007460d030c070b200521042005210b200a21020c0c0b0c010b410121062003280278200328027c4101410020034180016a28020010011a41002007470d040b200410232007411a20061b210d200641fc89c30020061b210c024002400240024002402006450d00200341f8006a200c2007200210c502200341f8006a41086a2802002107200328027c210620032802784101470d042000200636020420004101360200200041086a2007360200200d450d01200c102320050d020c030b2000200c36020420004101360200200041086a200d3602000b2005450d010b200a10230b200341a0016a24000f0b200341d8006a41026a220e20034197016a2d00003a0000200320032f0095013b015820034194016a2d0000210920034190016a28020021042003418c016a280200210b20034188016a280200210220034184016a280200210802402005450d00200a10230b200341306a41026a200e2d00003a0000200320032f01583b01302004417f4c0d004101210a02402004450d0020041026220a450d09200a200220041094041a0b200341386a41146a2004360200200341386a41106a2004360200200320083602402003200736023c200320063602382003200a3602442003200941ff01714101463a0050411410262205450d06200541106a41002800d28943360000200541086a41002900ca8943370000200541002900c2894337000020054114413410272205450d07200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200341f8006a41186a22014200370300200341f8006a41106a220e4200370300200341f8006a41086a220f42003703002003420037037820054134200341f8006a1002200341d8006a41186a2001290300370300200341d8006a41106a200e290300370300200341d8006a41086a200f29030037030020032003290378370358200341d8006a200341386a10b1012005102302402004450d00200a10230b200d450d09200c10230c090b101d000b41154101102a000b41354101102a000b2007450d00200610230b41d4aac10041331021000b20074101102a000b41144101102a000b41344101102a000b20044101102a000b20002006360204200020032f01303b001d200041003602002000411c6a20093a0000200041186a2004360200200041146a200b360200200041106a20023602002000410c6a2008360200200041086a20073602002000411f6a200341326a2d00003a0000200341a0016a24000bc0dc0123227f037e017f017e107f017e067f017e027f017e037f017e017f017e087f017e017f017e027f017e047f017e177f017e017f017e6a7f017e1d7f017e147f017e067f027e0f7f230041e0056b22042400410021052004410036028802200420023602840220042001360280020240024002400240024002400240200241034b0d00200441013a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a20120042802a0022102200428029c0221062004280298022107410521080c010b20044188026a4104360200024002400240024020012800004180c2cdeb06470d002002417c714104470d01200441013a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a20120042802a0022102200428029c022106200428029802210741052108410021050c040b410121080c010b02400240024002400240024002400240024002400240200241074d0d0020044180026a41086a41083602000240024002400240200128000422074101470d00200441d0046a20044180026a10a00120042802d0044101470d014104210a4100210b4100210c20042d00d4040d020c050b410221080c0f0b200441d0046a410572210f4104210a200441d0046a412c6a2110200441f4046a2111200441f0046a2112200441ec046a2113200441e8046a2114200441e4046a2115200441e0046a2116200441dc046a2117200441d8046a211841002107412821054100210b4100210c410021090340200441a8036a41026a2219200f41026a2d00003a00002004200f2f00003b01a8032010280200211a200441f8046a280200211b2011280200211c2012280200211d2013280200211e2014280200211f20152802002120201628020021212017280200212220182802002106024020042d00d4042223417e6a220141ff0171410a4b0d0002400240024002400240024002400240024002400240024002400240024002402001410a4b22240d00024020010e0b00070405020809060b030a000b200941ff0171222541014d0d0c0c0b0b200941ff0171222541004b0d0a0c0b0b200941ff0171222541054d0d0a0c090b200941ff01712225410a4d0d090c080b200941ff0171222541034d0d080c070b200941ff0171222541044d0d070c060b200941ff0171222541084d0d060c050b200941ff0171222541024d0d050c040b200941ff0171222541064d0d040c030b200941ff0171222541074d0d030c020b200941ff01712225410b4d0d020c010b200941ff0171222541094d0d010b411321082023410d4b0d010c020b02400240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b20254101470d0e0c0b0b20254100460d0a0c0d0b20254105470d0c0c090b2025410a470d0b0c080b20254103470d0a0c070b20254104470d090c060b20254108470d080c050b20254102470d070c040b20254106470d060c030b20254107470d050c020b2025410b470d040c010b20254109470d030b411421082023410d4d0d010b02402022450d00200610230b0240201f450d00201e450d00201f10230b201b450d0d201c1023200b0d0e0c0f0b024002400240024002400240024002400240024002400240024002400240024020230e0e1b0405011b1b1b08031c070002061b0b2021450d1a4118218a012006202141186c6a218b014104218c014114218d014110218e01410c218f014109219001410821910141ffffffff03219201417021930120062194014100215d0c0a0b2021450d19202141286c21022006210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200241586a22020d000c1a0b0b2021450d18411c21950120062021411c6c6a219601410c219701410821980141142199014104219a014110219b014109219c0141ffffffff03219d014170219e012006219f014101215d0c090b2021450d17202141146c21022006210103400240200141046a280200450d00200128020010230b200141146a21012002416c6a22020d000c180b0b02402022450d00200610230b201f450d1720201023200b0d180c190b2021450d15202141047421022006210103400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000c160b0b200641ff017122014102460d0320014101460d022021450d1520221023200b0d160c170b2021450d13411c21a00120062021411c6c6a21a101410c21a201410821a301411421a401410421a501411021a601410921a70141ffffffff0321a801417021a901200621aa014102215d0c050b2021450d12410421ab01200620214104746a21ac01411021ad01410921ae01410821af0141ffffffff0321b001417021b101200621b2014103215d0c050b201f450d10201f410c6c2102202121010340024020012802002205450d00200141046a280200450d00200510230b2001410c6a2101200241746a22020d000c110b0b201f450d0f410421b3012021201f4104746a21b401411021b501410c21b601410821b701417421b801202121b9014106215d0c040b410821010c0b0b410821010c0a0b410821010c090b410821010c080b410821010c070b0240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b410121090c0b0b410021090c0a0b410521090c090b410a21090c080b410321090c070b410421090c060b410821090c050b410221090c040b410621090c030b410721090c020b410b21090c010b410921090b20044198026a41026a222420192d00003a0000200420042f01a8033b0198020240200b200c470d00200b41016a2201200b490d072007200120012007491b220cad422c7e2226422088a70d072026a722014100480d070240200b450d00200a200541586a20011027220a0d010c040b20011026220a450d030b200a20056a220141586a20233a00002001201a3602002001417c6a201b360200200141786a201c360200200141746a201d360200200141706a201e3602002001416c6a201f360200200141686a2020360200200141646a2021360200200141606a20223602002001415c6a20063602002001415b6a20242d00003a0000200141596a20042f0198023b0000200741026a21072005412c6a2105200b41016a210b200441d0046a20044180026a10a00120042802d0044101470d000b20042d00d404450d030b20042902d4042227a722084110762105200841087621092027422088a72107200441d0046a41106a2802002102200441dc046a2802002106200b0d090c0a0b20014104102a000b41082002108c01000b200b412c6c2101200a41606a21050240024003402001450d01200141546a2101200541206a21072005412c6a220d210520072d0000410b470d000b200d280200210e0c010b4100210e0b200b412c6c2101200a41586a21050240024003402001450d01200141546a2101200541286a21072005412c6a220d210520072d00004104470d000b200441b0016a200d10be03200e20042802b401460d010c0a0b200e4100470d090b024002400240024002400240024002400240024002400240024020044180026a41086a2802002002470d004280c2cdeb062128200441d4036a200b360200200441d0036a2201200c360200200441cc036a200a36020041002129200441003602c00320044280c2cdeb06428080808010843702c403200a2001290300222a422088a7220e412c6c6a2105200a2101034020052001460d0220012d000021022001412c6a2207210120024102470d000b200441a8016a200741586a10be034104212b20042802a8012102024020042802ac012223450d00202341047422014100480d0f20011026222b450d0b0b410021294100212402402023450d002023410474210741002124202b21010340200241086a2802002205417f4c0d052002410c6a2d0000210d2002280200212c024002402005450d0020051026220f0d010c080b4101210f0b200f202c2005109404212c2001410d6a2002410d6a2d00003a00002001410c6a200d3a0000200141086a2005360200200141046a20053602002001202c360200200141106a2101202441016a2124200241106a2102200741706a22070d000b0b202b450d01202321290c020b200441003a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a201200441db046a20044198026a41086a28020036000020042004290398023700d304200441cc036a200441d7046a290000370000200441053a00c403200441013602c003200420042900d0043700c5030240200b450d00200b412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b200441c0036a41047221010240200c450d00200a10230b4100450d190c1a0b4104212b410021240b200a200e412c6c6a2107200a210102400240024003404100210541a886c500210d20072001460d0120012d000021022001412c6a222c210120024103470d000b200441a0016a202c41586a10be034100210120042802a0012202450d012002210d4104211020042802a40122010d020c0b0b410021010b410421102001450d090b200141286c211e200d411c6a21014104211d410021054100211441042111410021074100211f410121124100210f410021194104211a41002102410021234100211c4100212c4101210d0340024002400240024002400240024002400240024002400240024002400240024002402001417c6a2d0000221b4101460d000240201b4102460d00201b4103470d022001417e6a22132d000021152001417d6a22162d000021172019200f470d04200f41016a221b200f490d1e200f4101742225201b201b2025491b221b201b6a2218201b490d1e20184100480d1e200f450d0b201220252018102722120d0c0c170b200441d0046a41086a221b200141086a280200360200200420012902003703d00420052014470d06200541016a22132005490d1d20054101742214201320132014491b2214ad420c7e2226422088a70d1d2026a722134100480d1d2005450d0520112005410c6c2013102722110d060c140b200441d0046a41086a221b200141086a280200360200200420012902003703d004201f2007470d01200741016a22132007490d1c20074101742215201320132015491b2215ad420c7e2226422088a70d1c2026a722134100480d1c2007450d06201d2007410c6c20131027221d0d070c140b2001280200211b20232002470d02200241016a22132002490d1b20024101742215201320132015491b2215ad4202862226422088a70d1b2026a722134100480d1b2002450d0a201a200241027420131027221a0d0b0c150b201f21130c060b200f211b2019210f0c070b202321130c090b201310262211450d0e0b20112005410c6c6a221320042903d004370200201341086a201b280200360200200541016a2105200141286a2101201e41586a221e0d0a0c140b20131026221d450d0d0b20072113201521070b201d2013410c6c6a221320042903d004370200201341086a201b280200360200201f41016a211f200141286a2101201e41586a221e0d070c110b201810262212450d0b0b2012200f4101746a220f20154101713a0001200f20173a000020132d0000210f20162d00002113202c201c470d04201c41016a222c201c490d11201c4101742216202c202c2016491b222c202c6a2215202c490d1120154100480d11201c450d03200d201620151027220d0d040c0c0b20131026221a450d0a0b20022113201521020b201a20134102746a201b360200202341016a2123200141286a2101201e41586a221e0d020c0c0b20151026220d450d080b201941016a2119200d201c4101746a2215200f4101713a0001201520133a0000201c41016a211c201b210f200141286a2101201e41586a221e0d000c0a0b0b101d000b20054101102a000b20134104102a000b20134104102a000b20184101102a000b20134104102a000b20154101102a000b20014104102a000b410121124104211d4100211441042111410021074100211f4100210f410021194104211a41002102410021234100211c4100212c4101210d0b200a200e412c6c6a211e200a21010240024002400240024002400240024002400240024002400340201e2001460d0120012d0000211b2001412c6a22132101201b2010470d000b20044198016a201341586a10be03200428029c01221b450d002004280298012101201b410274211b03402001280200211e024002400240024020232002470d00200241016a22102002490d1220024101742213201020102013491b2213ad4202862226422088a70d122026a722104100480d122002450d01201a200241027420101027221a0d020c070b20022113202321100c020b20101026221a450d050b20022110201321020b200141046a2101201a20104102746a201e360200202341016a2123201b417c6a221b0d000c020b0b200221130b200a200e412c6c6a211b200a2101024002400240024002400340201b2001460d0120012d000021022001412c6a221e210120024105470d000b20044190016a201e41586a10be03200428029401410c6c221b450d002004280290012101200441e4046a2115200441e0046a21160340200141086a21020240200141046a2802004101470d0020042002280200221e3602a80320012802002210201e4d0d0020044198026a410c6a41023602002015410236020020044198026a41086a20044180026a3602002004410236029c022004201036028002201620044198026a360200200442023702d4042004418cd6c4003602d0042004200441a8036a36029802200441c0036a200441d0046a10a20120042802c003222d0d040b20012902002126200441d0046a41086a221e2002280200360200200420263703d0040240024002400240201f2007470d00200741016a22022007490d1520074101742210200220022010491b2210ad420c7e2226422088a70d152026a722024100480d152007450d01201d2007410c6c20021027221d0d020c0b0b20072110201f21020c020b20021026221d450d090b20072102201021070b2001410c6a2101201d2002410c6c6a220220042903d004370200200241086a201e280200360200201f41016a211f201b41746a221b0d000c020b0b200721100b200a200e412c6c6a2107200a2101024002400240034020072001460d0120012d000021022001412c6a221b210120024106470d000b20044188016a201b41586a10be03200428028c012202450d0020042802880121012002410c6c211b200541017421072005410c6c21020340200441d0046a200110c00320042802d004222d0d0220012902002126200441d0046a41086a221e200141086a280200360200200420263703d004024020052014470d00200541016a22142005490d132007201420142007491b2214ad420c7e2226422088a70d132026a722154100480d1302402005450d00201120022015102722110d010c0b0b201510262211450d0a0b2001410c6a2101201120026a221520042903d004370200201541086a201e280200360200200741026a21072002410c6a2102200541016a2105201b41746a221b0d000b0b200a200e412c6c6a2107200a210102400240034020072001460d0120012d000021022001412c6a221b210120024107470d000b20044180016a201b41586a10be032004280284012202450d00200428028001220120024104746a2116200441d0046a41086a2117200441e4046a21180340200441d0046a2001200d201c10c10302400240024020042d00d0044101470d002017290300212720042802d404222d450d010c070b200420042d00d10422073a00a80320072001410c6a2d00002202460d0120044198026a410c6a41233602002018410236020020044198026a41086a200441a8036a3602002004412336029c02200420023a008002200441d0046a41106a20044198026a360200200442023702d404200441a0d7c4003602d004200420044180026a36029802200441c0036a200441d0046a10a20120042902c403212720042802c003222d0d060b2001410c6a2d000021070b2001410d6a2d0000211b0240024002402019200f470d00200f41016a2202200f490d16200f4101742215200220022015491b220220026a221e2002490d16201e4100480d16200f450d0120122015201e102722120d020c0e0b200f21022019210f0c010b201e10262212450d0c0b2012200f4101746a220f201b4101713a0001200f20073a0000201941016a21192002210f200141106a22012016470d000c020b0b200f21020b200441f8036a2023360200200441f4036a2013360200200441c0036a412c6a2024360200200441e8036a2029360200200441e0036a2019360200200441dc036a2002360200200441d4036a201f360200200441d0036a20103602002004201a3602f0032004202b3602e403200420123602d8032004201d3602cc03200420053602c803200420143602c403200420113602c003200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024104470d000b200441f8006a200741586a10be03200428027c210f0c010b4100210f0b2004200f3602cc01200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a220721012002410b470d000b2004200741606a28020022013602d001200f2001460d010c100b200441003602d001200f4100470d0f0b200f450d09200a200e412c6c6a2105200a2101034020052001460d0420012d000021022001412c6a2207210120024104470d000b200a200e412c6c6a210f200a21010340200f2001460d0520012d000021022001412c6a220521012002410b470d000b200441f0006a200741586a10be0320042802742201450d0a4102212e2004280270222f20014102746a2130200541606a2131200541586a213220044189056a21334100213441142135200441d0046a41146a2136410121374102213841102139200441d0046a41106a213a4201213b41908bc300213c4104213d4118213e412c213f200441c0036a412c6a2140200441e4036a214142ff01214241202143410821444228214520044188056a214620044184056a21474180800121484281808080102149200441f8046a214a4280808080808010214b410c214c200441d0046a410c6a214d4170214e20044180056a214f200441ec046a21504124215141032152412521534203215441a8cbc40021554220215641782157412621584202215941988bc300215a4198dac400215b4100215c4104215d0c0b0b20042902d404212720102107202c450d0c0c0b0b20102107202c0d0a0c0b0b20042902c4032127202c0d090c0a0b41a88ac300411e1021000b41c68ac30041c8001021000b20104104102a000b20024104102a000b20154104102a000b201e4101102a000b410021010c050b410021010c040b410821010c030b200d10230b02402014450d00201110230b02402007450d00201d10230b0240200f450d00201210230b02402024450d0020244104742102202b210103400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b02402029450d00202b10230b024002402013450d00201a1023202d0d050c010b410421010c020b410521010c010b200441a4026a4102360200200441e4046a41023602002004410236029c02200442023702d404200441988ac3003602d0042004200441d0016a3602a0022004200441cc016a36029802200420044198026a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d024020042802c4030d00410321010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0900010304050708090c0c0b200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024109470d000b2004200741586a28020022013602b801200441f8036a28020020014d0d012004200441f0036a28020020014102746a280200220136028002200441ec036a28020020014d0d03200441e4036a28020020014104746a22013502084200520d07200131000d4220864280808080f000834280808080c000520d070b200a200e412c6c6a2105200a2101034020052001460d5620012d000021022001412c6a2207210120024108470d000b200441e8006a200741586a220110be03200441d0046a200428026c10c6024110215f4114216020044198026a41106a2261200441d0046a41146a22622802003602004108216320044198026a41086a2264200441d0046a410c6a290200370300200420042902d40437039802200441e0006a200110be0320042802642201450d5420042802602265200141146c6a2166410421674105216841b9f3ddf1792169417c216a4103216b4101216c4102216d417e216e41ff01216f4119217041fffdfb772171417f217241808182847821734100217420044198026a410c6a217542202176410221774202217841b8d9c4002179200441e0036a217a200441d8036a217b200441f8036a217c200441f0036a217d200441ec036a217e4105215d0c220b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c590b200441e4046a410136020020042080013602ac0320042081013602a803200441013602bc01200442013702d404200441d88bc3003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d208801450d590c6b0b200441e4046a4101360200200441023602ac03200442023702d40420044198dac4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c570b20042802c0031023410321010c6a0b0240200441d0036a280200450d00200441cc036a28020010230b0240200441dc036a280200450d00200441d8036a28020010230b0240200441ec036a2802002202450d00200441e4036a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b0240200441e8036a280200450d00200441e4036a28020010230b0240200441f4036a280200450d00200441f0036a28020010230b202c450d13200d1023410421010c690b202d450d130c6a0b412d1026222d450d04202d41256a41002900cd8b43370000202d41206a41002900c88b43370000202d41186a41002900c08b43370000202d41106a41002900b88b43370000202d41086a41002900b08b43370000202d41002900a88b4337000042ad808080d005212720042802c4030d0a0c090b200a450d02202aa721c701200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024102470d000b200441386a200741586a10be0320042802382101200428023c21020c010b410021010b2002410020011b211e200141a886c50020011b211c200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024108470d000b200441306a200741586a10be0320042802302101200428023421020c010b410021010b2002410020011b215d200141a886c50020011b2107200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a220f210120024104470d000b200441286a200f41586a10be0320042802282101200428022c21020c010b410021010b2002410020011b211f200141a886c50020011b211b200a200e412c6c6a210f200a2101024002400240034041002102200f2001460d0120012d000021052001412c6a2223210120054103470d000b200441206a202341586a10be0320042802244100200428022022011b22050d010c020b410021014100410041001b2205450d010b200541286c2105200141a886c50020011b41186a2101410021020340200220012d0000456a2102200141286a2101200541586a22050d000b0b2007205d41146c6a215d4100211a4100211902400240024002400240024003402007205d460d012007280200210f4138210141e2bdc400210502400240200741086a28020022234106460d0020234104470d074101211a200f41a7c4c400460d01200f28000041e3c2b1e306460d010c070b41012119200f41e5c4c400460d00200f41e5c4c40041061096040d060b2007410c6a2802000d02200741106a280200220120026b220f20014b0d0341ebc4c400210541262101201f200f4d0d05201b200f4102746a220f450d054191c5c400210541202101201e200f280200220f4d0d05201c200f4104746a220f450d05411f210141d7bec4002105200f2802080d05200741146a2107200f2d000d4104460d000c050b0b201a201971410171450d02200a200e412c6c6a2105200a2101034020052001460d0520012d000021022001412c6a2207210120024106470d000b200441186a200741586a10be03200428021c450d04200041f6bec400360204411f21010c500b41132101419abec40021050c020b412a210141adbec40021050c010b411c411e201941017122081b210141abc4c40041c7c4c40020081b21050b200020053602040c4c0b200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024102470d000b200441106a200741586a10be0320042802102101200428021421020c010b410021010b2002410020011b21c801200141a886c50020011b21c901200a200e412c6c6a2105200a2101024002400340410021ca0120052001460d0120012d000021022001412c6a2207210120024103470d000b200441086a200741586a10be0320042802082101200428020c21020c010b410021010b412821cb01200141a886c50020011b22cc012002410020011b41286c6a21cd01410321ce0141cae2c40021cf01410121d001410221d101411c21d201410621d30141cbbfc40021d401410421d501200341dc006a21d601410b21d70141bed0c40021d80141e3cec40021d90141e00021da01410d21db014187cfc40021dc01417d21dd01411321de0141cde2c40021df0141b1cfc40021e001410721e10141bdcec40021e20142e5f0d1fbb5ac98b6ec0021e30141c5cec40021e401410a21e50141cfcec40021e60141d9cec40021e70141a7cfc40021e80141fbcec40021e901410c21ea0141eecec40021eb0141c9cfc40021ec01410e21ed0141d7cfc40021ee01419fcec40021ef01410f21f00141aecec40021f10141e5cfc40021f201411021f30141f5cfc40021f40141b8cfc40021f501411121f6014185d0c40021f70141acd0c40021f801411221f9014192cfc40021fa01411521fb014196d0c40021fc01411621fd01410021fe010c050b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c510b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d40420044198dac4003602d004200420044180026a3602a80320044198026a200441d0046a10a2010c500b4195bfc40041361021000b412d4101102a000b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240205d0e0a02030405000106080913130b2004205c3602d4012031280200210120322802002102203620373602002004203836028402203a20044180026a3602002004203b3702d4042004203c3602d0042004200441d4016a3602800220044198026a200441d0046a10a201200429029c022127200428029802212d2001205c4d0da70102402027a7450d00202d10230b2004202f280200220136028002024002400240024002400240204028020020014d0d002002205c203e6c6a2202280214221c450d0120412802002001203d746a22052d000d212320052802002119200228020c21012002280200211f2005280208221b210702402002280208221e450d00201e205274210f201b2102201f21050340200220052802006a22072002490d04200520446a210520072102200f20576a220f0d000b0b204410262202450d2a20022023ad20428320458637020020044180026a202e6a220520044198026a202e6a2d00003a0000200420042f0098023b018002204620233a000020472048360200200441d0046a203f6a220f2049370200204a2002360200200441d0046a20436a204b370300200441d0046a203e6a2223203b37030020362007360200203a201e360200204d201f360200200441d0046a20446a201b360200203320042f0180023b00002033202e6a20052d00003a0000200420193602d404201c203d7421052004200441c0036a3602d004410021020340200420023602e801200420013602ec01200441b8016a200441d0046a200110c403024020042802b801450d00200441a8036a20446a200441b8016a20446a280200360200200420042903b8013703a80320044198026a20356a205136020020044198026a204c6a203836020020044180026a20356a205236020020044198026a20396a200441a8036a36020020044198026a20446a200441e8016a3602002004205336029c0220044180026a20396a20044198026a360200200420543702840220042055360280022004200441ec016a36029802200441f0016a20044180026a10a201024020042802ac03450d0020042802a80310230b20042802f00122070d050b200120396a2101200220376a21022005204e6a22050d000b204f2802000d2b02402050280200450d00202328020010230b200f280200450d05204a2802001023205c20376a215c202f203d6a222f2030470d450c610b20362037360200200420383602ac03203a200441a8036a360200200420593702d4042004205b3602d004200420044180026a3602a80320044198026a200441d0046a10a201200429029c022226205688a721012026a7210220042802980222070d030c040b204310262207450d2b2007203e6a20342900a0cb44370000200720396a2034290098cb44370000200720446a2034290090cb4437000020072034290088cb44370000412021024120210120070d020c030b204310262207450d292007203e6a20342900e8dc44370000200720396a20342900e0dc44370000200720446a20342900d8dc44370000200720342900d0dc44370000412021024120210120070d010c020b20042902f401212602402050280200450d00202328020010230b2026205688215e0240200f280200450d00204a28020010230b205ea721012026a721020b200420073602800220042001ad2056862002ad8437028402200420044180026a3602a80320044198026a204c6a20583602002036202e36020020044198026a20446a200441a8036a3602002004203836029c02203a20044198026a360200200420593702d4042004205a3602d0042004200441d4016a36029802200441d8016a200441d0046a10a2010240200428028402450d0020042802800210230b20042802d801222d0d070b205c20376a215c202f203d6a222f2030470d3e410021010cba010b2065227f450d9f0141002102207f2802082280012101207f280200228101210502402080012067490d0041002102208101210120800121050340200128000020022068777320696c2102200120676a21012005206a6a2205206b4b0d000b208001206a6a22012001206a7122056b210120810120056a20676a21050b0240024002402001206c4d0d002005206d6a2107200220687720052f00007320696c21022001206e6a450d020c010b200521072001450d010b200220687720072d00007320696c21020b207f20606a21652002206877206f7320696c228201207076228301206374208301722201205f7420017221840120642802002185014100218601200428029802218701200428029c02218801208201218901410021010c8c010b0240209401208c016a280200450d0020940128020010230b0240209401208d016a2802002202450d0020940128020c21012002208c017421020340024020012d0000209001470d0020012091016a28020020920171450d002001208c016a28020010230b2001208e016a210120022093016a22020d000b0b209401208a016a21010240209401208e016a280200450d00209401208f016a28020010230b20012194012001208b01470d380cbc010b0240209f012097016a2802002202450d00209f0128020421012002209a017421020340024020012d0000209c01470d0020012098016a280200209d0171450d002001209a016a28020010230b2001209b016a21012002209e016a22020d000b0b0240209f012098016a280200450d00209f01209a016a28020010230b209f012095016a21010240209f012099016a280200450d00209f0128021010230b2001219f012001209601470d380cbb010b024020aa0120a2016a2802002202450d0020aa012802042101200220a5017421020340024020012d000020a701470d00200120a3016a28020020a80171450d00200120a5016a28020010230b200120a6016a2101200220a9016a22020d000b0b024020aa0120a3016a280200450d0020aa0120a5016a28020010230b20aa0120a0016a2101024020aa0120a4016a280200450d0020aa0128021010230b200121aa01200120a101470d380cba010b024020b2012802082202450d0020b2012802002101200220ab017421020340024020012d000020ae01470d00200120af016a28020020b00171450d00200120ab016a28020010230b200120ad016a2101200220b1016a22020d000b0b20b20120ad016a2101024020b20120ab016a280200450d0020b20128020010230b200121b201200120ac01470d380cb9010b20b901220720b5016a21b901024020072802042201450d000240200720b6016a2802002202450d00200220b6016c21020340024020012802002205450d00200120b3016a280200450d00200510230b200120b6016a2101200220b8016a22020d000b0b200720b7016a280200450d00200720b3016a28020010230b20b90120b401470d3a0cb7010b20042902dc01212720042802c4030d5c0c5b0b20bb01450d9a01200420bb0128020022013602800220bd0128020020014d0d01200441d0046a20bb0120be016a20c00128020020bf0128020010c10320042d00d00420c101460d0220042d00d1040d03200441c0006a20bb0110c503024020042802442201450d0020042802402102200120c20174210520c301280200210703402004200228020022013602b801200720014d0d60200420c401280200200120c201746a28020022013602800220c50128020020014d0d61200220be016a2102200520c6016a22050d000b0b20bb0120ba016a22bb0120bc01470d390c9a010b024020cc0120cd01460d00418ec1c4002102412d210120cc0128020820ce01470d0d024020cc01280200220520cf01460d00200520cf0120ce011096040d0e0b024020cc012d0018220120d001460d0020cc0120cb016a2105024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200120d101460d00200120ce01460d2641d1bfc40021024136210120c80120cc0128021c22074d0d3520c901200720d501746a220f450d3520cc01280214212320cc0128020c210720d6012d00000d01202320d701470d0141c2c0c400210241382101200720d801460d35200720d80120d701109604450d350c020b41bbc1c4002102412f210120cc0128021420d301470d34024020cc0128020c220720d401460d00200720d40120d3011096040d350b20fe010d2e20cc0120d2016a21fe01200521cc014108215d0ca7010b419cc0c400210241262101202320dd016a222320de014b0d3320230e14013333330c0e330d000b0a06050f070833330910010b200720d901460d0120d901200720d701109604450d01200720dc01460d0220dc01200720d701109604450d020240200720d801460d0020d801200720d7011096040d2b0b20d10110262223450d48202320ca013b0000200f2d000c20da01470d29200f28020820d101470d29200f280200215d410021010340200120d0014b0d04202320016a2102205d20016a2107200120d0016a210120072d000020022d0000460d000c2a0b0b200720df01460d31200720df0120ce01109604450d3120df01200720ce011096040d3120d0011026225d450d4a205d20ca013a0000200f2d000c20da01470d32200f28020820d001470d32200f280200211f41002102034020020d17205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c330b0b419cc0c400210241262101200f2d000c20da01470d30200f2802080d30200521cc01200f20db016a2d000020d501460d730c300b419cc0c400210241262101200f2d000c20da01470d2f200f2802080d2f200521cc01200f20db016a2d000020d501460d710c2f0b200f20db016a2d0000210120231023200521cc01200120d501460d6f0c260b200720ef01460d0b20ef01200720f001109604450d0b0240200720f101460d0020f101200720f0011096040d2e0b20d0011026221f450d4c201f20ca013a0000200f2d000c20da01470d36200f28020820d001470d36200f280200211b41002107034020070d18201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c370b0b200720ec01460d0b20ec01200720ed01109604450d0b0240200720ee01460d0020ee01200720ed011096040d2d0b20ce011026225d450d47205d20ca013a0002205d20ca013b0000200f2d000c20da01470d38200f28020820ce01470d38200f280200211f410021020340200220d1014b0d18205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c390b0b200720f501460d0b20f501200720f601109604450d0b0240200720f701460d0020f701200720f6011096040d2c0b20d5011026225d450d42205d20ca01360000200f2d000c20da01470d35200f28020820d501470d35200f280200211f410021020340200220ce014b0d18205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c360b0b0240200720f801460d0020f801200720f9011096040d2b0b419cc0c400210241262101200f2d000c20da01470d2a200f2802080d2a200521cc01200f20db016a2d000020d501460d570c2a0b0240200720fa01460d0020fa01200720fb011096040d2a0b419cc0c400210241262101200f2d000c20da01470d29200f2802080d29200521cc01200f20db016a2d000020d501460d5f0c290b0240200720eb01460d0020eb01200720db011096040d290b419cc0c400210241262101200f2d000c20da01470d28200f2802080d28200521cc01200f20db016a2d000020d501460d600c280b0240200720e901460d0020e901200720ea011096040d280b419cc0c400210241262101200f2d000c20da01470d27200f2802080d27200521cc01200f20db016a2d000020d501460d5e0c270b0240200720e001460d0020e001200720e1011096040d270b419cc0c400210241262101200f2d000c20da01470d26200f2802080d26200521cc01200f20db016a2d000020d501460d5b0c260b200720e401460d0620e401200720e501109604450d06200720e601460d0e20e601200720e501109604450d0e200720e701460d1420e701200720e501109604450d140240200720e801460d0020e801200720e5011096040d260b20d1011026225d450d41205d20ca013b0000200f2d000c20da01470d33200f28020820d101470d33200f280200211f410021020340200220d0014b0d16205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c340b0b0240200720e201460d00200729000020e301520d250b20e1011026221f450d42201f20ca01360003201f20d0013a0002201f20ca013b0000200f2d000c20da01470d22200f28020820e101470d22200f280200211b410021070340200720d3014b0d08201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c230b0b200720f201460d0520f201200720f301109604450d050240200720f401460d0020f401200720f3011096040d240b20ce011026225d450d37205d20ca013a0002205d20ca013b0000200f2d000c20da01470d2e200f28020820ce01470d2e200f280200211f410021020340200220d1014b0d11205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c2f0b0b0240200720fc01460d0020fc01200720fd011096040d230b20d1011026221f450d3c201f20ca013b0000200f2d000c20da01470d21200f28020820d101470d21200f280200211b410021070340200720d0014b0d07201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c220b0b20d5011026225d450d34205d20ca01360000200f2d000c20da01470d28200f28020820d501470d28200f280200211f410021020340200220ce014b0d08205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c290b0b419cc0c400210241262101200f2d000c20da01470d20200f2802080d20200f20db016a2d0000220720d501460d20200521cc01200720d5017220d501460d520c180b20d1011026225d450d3c205d20ca013b0000200f2d000c20da01470d27200f28020820d101470d27200f280200211f410021020340200220d0014b0d07205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c280b0b20e1011026221f450d36201f20ca01360003201f20d0013a0002201f20ca013b0000200f2d000c20da01470d24200f28020820e101470d24200f280200211b410021070340200720d3014b0d07201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c250b0b419cc0c400210241262101200f2d000c20da01470d1d200f2802080d1d200f20db016a2d0000220720d501460d1d200521cc01200720d5017220d501460d4d0c150b200f20db016a2d0000220720d501460d1a201f1023200521cc01200720d5017220d501460d590c1c0b200f20db016a2d00002101201f1023200521cc01200120d501460d490c130b200f20db016a2d00002101205d1023200521cc01200120d501460d5a0c120b200f20db016a2d00002101205d1023200521cc01200120d501460d580c110b200f20db016a2d00002101205d1023200521cc01200120d501460d4c0c100b200f20db016a2d0000220720d501460d1d201f1023200521cc01200720d5017220d501460d530c170b20d1011026225d450d2b205d20ca013b0000200f2d000c20da01470d23200f28020820d101470d23200f280200211f410021020340200220d0014b0d05205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c240b0b200f20db016a2d0000220720d501460d1e201f1023200521cc01200720d5017220d501460d530c150b200f20db016a2d00002101205d1023200521cc01200120d501460d450c0c0b200f20db016a2d00002101205d1023200521cc01200120d501460d460c0b0b200f20db016a2d00002101205d1023200521cc01200120d501460d410c0a0b200f20db016a2d00002101205d1023200521cc01200120d501460d4c0c090b419cc0c400210241262101200f2d000c20da01470d10200f2802080d10200521cc01200f20db016a2d000020d501460d4a0c100b200f20db016a2d00002101205d1023200521cc01200120d501460d480c070b4115210120004187c0c4003602040c98010b41142101200041fac0c4003602040c97010b024020fe01450d0020fe01280204450d0620fe0128020022ff0120fe0141086a2802002280024d0d0820004189c2c40036020441c90021010c97010b410021ff0141002180020c080b200441e4046a4101360200200441023602ac03200442023702d404200441e8d9c4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c9c010b200441d8046a290300212720042802d404212d20042802c4030d560c550b41201026222d450d2d202d41186a41002900908c43370000202d41106a41002900888c43370000202d41086a41002900808c43370000202d41002900f88b4337000042a08080808004212720042802c4030d530c520b202310230b412621012000419cc0c4003602040c91010b20004193c3c400360204413221010c90010b411f2101200041eac1c4003602040c8f010b20800220032802544d0d00200041d2c2c40036020441c10021010c8e010b200441d0046a41086a22024200370300200441f098c4003602d40420042003290308228102a7417f208102428080808010541b3602e00420042003290310228102a7417f208102428080808010541b3602d004200441d0046a4104722201410d10c6032001410c10c6032001410710c6032001410f10c603200441c8016a20042802e004360200200441b8016a41086a2002290300370300200420042903d0043703b801200a450d23200441d0046a410c6a202a3702002004200a3602d80420042028428080808010843703d00420044198026a200441d0046a10c703410110262201450d24200141003a0000200420042f01d0043b01c003200441e0046a41e0083b0100200441d8046a428180808010370300200420013602d404200441013602d004200420042f01c0033b01e20420044198026a200441d0046a10c8032123410310262202450d25200241026a41002d00cce2443a0000200241002f00cae2443b0000410310262205450d26200541026a41002d00cfe2443a0000200541002f00cde2443b0000200441c0036a41026a228202200441d0046a41026a2283022d00003a0000200420042f00d0043b01c003200441ac026a220f280200210720044198026a41106a28020021012083022082022d00003a0000200420042f01c0033b01d00420072001470d07200141016a22072001490da901200141017422820220072007208202491b228202ad42287e228102422088a70da901208102a722074100480da9012001450d05200441a4026a280200200141286c200710272201450d080c060b2084022d0000208b026a2201208c024b0d7b024002400240024020010e0400030102000b20840228020c2201450d7e2001208d026c2102208402280204208e026a2101034002402001208f026a2802000d0020012802002205208202490d00200120052083026a3602000b2001208d026a210120022090026a22020d000c7f0b0b20840228020c2201450d7d20840228020422a40220012091026c6a21a502410121010c7c0b20840228020c2201450d7c20840228020422a60220012093026c6a21a7020c7a0b2084022802042201208202490d7b2084022088026a20012083026a3602002084022086026a228402208702470d470c7c0b201f10232000419cc0c4003602040c8b010b201f10230b200020023602040c89010b205d10232000419cc0c4003602040c88010b200710262201450d020b200441a8026a208202360200200441a4026a2001360200200441ac026a28020021070b200441a4026a280200200741286c6a220141003a00182001200536020c200142838080803037020420012002360200200141106a4283808080303702002001411b6a200441d2046a2d00003a0000200141196a20042f01d0043b00002001411c6a2023360200200f200f28020041016a360200200441d0046a20044198026a418c011094041a200441a8036a200441d0046a10c903200441a8036a41106a2802002223412c6c210120042802b00322840241586a210202400340410021052001450d01200141546a2101200241286a21072002412c6a220f210220072d00004103470d000b200f41086a2802002201450d00200141286c2102200f28020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b2023412c6c210120840241586a21022005417f6a21820202400340410021052001450d01200141546a2101200241286a21072002412c6a220f210220072d00004103470d000b200f41086a2802002201450d00200141286c2102200f28020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b2023412c6c210120840241606a21020240024003402001450d01200141546a2101200241206a21072002412c6a220f210220072d00004104470d000b200f280200210120230d010c780b410021012023450d770b200120056a218502412c2186022084022023412c6c6a2187024104218802200441b8016a4104722189024100218a024178218b024103218c024114218d024110218e02417c218f024101218302416c219002411c21910241022192024118219302410c2194024108219502428080808010219602412d2197024220218102417f219802410b2199024170219a02417e219b0241ec00219c024203219d024202219e0241ff01219f02410521a002410621a102410021a202410021a3024109215d0c700b20074104102a000b201f10232000419cc0c4003602040c83010b205d10232000419cc0c4003602040c82010b205d10232000419cc0c4003602040c81010b201f10232000419cc0c4003602040c80010b205d10232000419cc0c4003602040c7f0b205d10232000419cc0c4003602040c7e0b205d10232000419cc0c4003602040c7d0b205d10232000419cc0c4003602040c7c0b205d10232000419cc0c4003602040c7b0b41084104102a000b41c0cbc400104f000b41204101102a000b41204101102a000b41044101102a000b41034101102a000b41024101102a000b41024101102a000b41044101102a000b41074101102a000b41014101102a000b41024101102a000b41034101102a000b41024101102a000b41024101102a000b41074101102a000b41014101102a000b4195bfc40041361021000b41014101102a000b41034101102a000b41034101102a000b41204101102a000b4100215d0c2d0b4101215d0c2d0b4102215d0c2d0b4103215d0c2d0b4104215d0c2d0b4104215d0c2d0b4106215d0c2e0b4107215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2f0b4109215d0c300b410021010c5e0b410321010c5d0b410221010c5c0b410321010c5b0b410221010c5a0b410321010c590b410221010c580b410321010c570b410221010c560b410421010c550b410521010c540b410621010c530b410721010c520b410821010c510b410821010c500b410821010c4f0b410821010c4e0b410821010c4d0b410821010c4c0b410821010c4b0b410821010c4a0b410821010c490b410821010c480b410821010c470b410821010c460b410821010c450b410821010c440b410821010c430b410821010c420b410821010c410b410821010c400b410821010c3f0b410821010c3e0b410821010c3d0b410821010c3c0b410821010c3b0b410821010c3a0b410821010c390b410821010c380b410821010c370b410821010c360b410821010c350b410821010c340b410821010c330b410821010c320b410821010c310b410821010c300b410821010c2f0b410821010c2e0b410221010b034002400240024002400240024002400240024002400240024002400240024020010e03000102020b02402087012089012088017122016a2800002205208401732202207273200220716a712073712202450d0003400240208001208501200268206b7620016a20880171206b746a220720676a280200470d0020810120072802002207460d082081012007208001109604450d070b200220726a20027122020d000b0b20860120676a22860120016a21890120052005206c7471207371450d03024020612802000d0020044198026a10c702200428029802218701200428029c022188010b410021010340200120676a22012082012088017122026a21820120870120026a2800002073712205450d000b0240208701200568206b7620026a2088017122016a2c000022022074480d0020870120870128020020737168206b7622016a2d000021020b20870120016a2083013a00002087012001206a6a208801716a20676a2083013a0000206120612802002002206c716b36020020752075280200206c6a36020020642802002001206b746a208001ad207686208101ad8437020002400240024002400240024002400240207f28020c2201206c460d0002402001206d460d002001206b470d022004207f28021022013602f001207a28020020014d0d06207b2802002001206c746a2d0001450d030c070b2004207f28021022013602b801200441c0036a20636a28020020014b0d022062206c360200200420773602ac03200441d0046a205f6a200441a8036a360200200420783702d404200420793602d0042004200441b8016a3602a80320044180026a200441d0046a10a201200428028002222d450d020c110b2004207f28021022013602b801200441c0036a20606a28020020014b0d010c030b2004207f28021022013602f001207c28020020014d0d012004207d2802002001206d746a28020022013602b801207e28020020014d0d050b20652066470d0b0c260b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3e0c2c0b200441e4046a4101360200200441023602ac03200442023702d404200441e8d9c4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3d0c2b0b200441e4046a4101360200200441023602ac03200442023702d404200441b8dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3c0c2a0b200441e4046a4101360200200441023602ac03200442023702d404200441d8dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3b0c290b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d40420044198dac4003602d0042004200441b8016a3602a80320044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3a0c280b20a40222012091026a21a402024020012802182202450d002001280210210120022092027421020340024020012802002205208202490d00200120052083026a3602000b20012088026a21012002208f026a22020d000b0b20a40220a502470d010c0e0b20a3022111024020a602280214208802742202450d0020a60228020c21010340024020012d0000209902470d0020012088026a22052802002207208202490d00200520072083026a3602000b2001208e026a21012002209a026a22020d000b0b20950210262201450d0620012096023702002088021026221c450d0520a6022094026a2105201c208a0236020020a602208d026a22102802002224450d0841002102410121234101210f4101211b41012107024002400240024041002024221f4f0d000240034020022083026a211f0240024002400240024002400240024020052802002002208802746a2d00002202209b026a208c024f0d00200210ca0321a802200441b8016a2095026a28020021a90220890221aa020c010b0240024002400240024002400240200220a002460d00200220a102470d012007450d0f20072098026a21070c0a0b2007450d0e2023200f470d0120232083026a22022023490d4d202320830274221e20022002201e491b221ead209d0286222620810288a70d4d2026a72202208a02480d4d2023450d0220012023208c02742002102722010d030c040b200210ca0321ab02200441b8016a2095026a28020021ac0220890221ad020c060b2023211e0c010b200210262201450d010b2001200f208c02746a22022083023602042002201f360200024002400240201b20072098026a2223470d00201b208302742202200720072002491b2219ad209e0286222620810288a70d4c2026a72202208a02480d4c201b450d01201c201b2092027420021027221c0d020c040b201b21190c010b20021026221c450d020b200f2083026a2102201c2023209202746a200f360200201f20244f0d180c080b20024104102a000b20024104102a000b410021020c010b410121020b0240024003400240024020020e020001010b20aa0228020022192095026a21a30220192f0106211e410021020240024002400340201e2002460d01208a0220980220830220a30220026a2d0000221a20a802209f0271221d4b1b201a201d461b221a450d0220022083026a2102201a208302460d000b20022098026a211e0b024020a902450d0020a9022098026a21a9022019201e209202746a209c026a21aa02410021020c040b200441b8016a211e20072098026a22022007490d010c0b0b200441b8016a211e024020192002208c02746a208d026a2202450d0020022802002219208302460d0b2019209202470d0020022088026a211e0b20072098026a220220074f0d0a0b200220074b0d09200f201c2002209202746a28020022024d0d0920012002208c02746a22192802042202201e2802006a221e2002490d0920192088026a201e36020002402023200f470d0020232083026a22022023490d49202320830274221e20022002201e491b221ead209d0286222620810288a70d492026a72202208a02480d492023450d0620012023208c02742002102722010d070c0c0b2023211e0c060b20ad0228020022192095026a21a30220192f0106211e4100210202400340201e2002460d01208a0220980220830220a30220026a2d0000221a20ab02209f0271221d4b1b201a201d461b221a450d0320022083026a2102201a208302460d000b20022098026a211e0b024020ac02450d0020ac022098026a21ac022019201e209202746a209c026a21ad02410121020c010b0b200441b8016a211e20072098026a22022007490d010c070b200441b8016a211e024020192002208c02746a208d026a2202450d0020022802002219208302460d072019209202470d0020022088026a211e0b20072098026a220220074f0d060b200220074b0d05200f201c2002209202746a28020022024d0d0520012002208c02746a22192802042202201e2802006a221e2002490d0520192088026a201e3602000b2023211e200f2102201b2119201f2024490d020c120b200210262201450d050b2001200f208c02746a22022083023602042002201f360200024002400240201b2007470d00201b2083026a2202201b490d44201b208302742223200220022023491b2219ad209e0286222620810288a70d442026a72202208a02480d44201b450d01201c201b2092027420021027221c0d020c080b201b21190c010b20021026221c450d060b200f2083026a2102201c2007209202746a200f36020020072083026a2107201f20244f0d100b201e21232002210f2019211b201f22022010280200221f490d000c020b0b02402023450d00200110230b410121a2020240201b450d00201c1023201121a3022084022086026a228402208702470d040c130b201121a3020c110b41d0e2c4002002201f1029000b20024104102a000b20024104102a000b4109215d410821010c390b410121010c0b0b410021010c0a0b410121010c360b410121010c350b4105215d410821010c340b41044104102a000b41084104102a000b20042902840221272088010d300c1e0b20012095026a210f410121194101211e0c010b2002450d0120012002208c02746a210f0b200121234101210203402001290200212620042097023a00d00420042026208102883e02d404200520022026a76a22072098026a200441d0046a10cb0320042099023a00d00420042082023602d40420052007200441d0046a10cb0320022092026a2102200f20012095026a2201470d000b202321010b0240201e450d00200110230b02402019450d00201c10230b20a6022093026a21a60202400240200441b8016a208e026a280200450d0020102802002202450d00200528020021012002208802742102410021050340024020012d0000208602470d0020012099023a000020012088026a20850236020020052083026a21050b2001208e026a21012002209a026a22020d000b410121a30220050d010b201121a3020b20a60220a702460d01410221010c000b0b2084022086026a228402208702470d0d0b024020a202410171450d0020042802b0032109200441b4036a2902002227a7210202402027422088a72201450d002001412c6c21082009210103402001109f012001412c6a2101200841546a22080d000b0b02402002450d00200910230b20042802bc01200441c0016a280200200441c4016a28020010d301200041c5c3c400360204411a21010c030b024020a302410171450d00200441d0046a41106a200441a8036a41106a280200360200200441d0046a41086a200441a8036a41086a290300370300200420042903a8033703d004200441c0036a200441d0046a10c703411010262208450d08200841063a0000410110262201450d09200141003a0000410110262202450d0a200220012d00003a000020011023411010262209450d0b200941063a000041f00010262201450d0c200141063a00602001412c3b015020012082023602442001410b3a0040200141d8003a00302001412d3a0020200141003602142001410f3a0010200141003602042001410f3a00002001200441c8016a280200360224024020092d00004109470d00200928020841ffffffff0371450d00200928020410230b20091023024020082d00004109470d00200828020841ffffffff0371450d00200828020410230b20081023200441f4046a4287808080f000370200200441f0046a2001360200200441ec046a4100360200200441d0046a410c6a4281808080800c370200200441d8046a4101360200200441003602fc04200442043702e404200420023602d404200441013602d004200441c0036a200441d0046a10cc03200441d0046a200441c0036a418c011094041a20044180026a200441d0046a10c90320044180026a410c6a2902002127200428028802218402200428028402210120042802800221080c020b20042802b0032184020b200441b4036a290200212720042802ac03210120042802a80321080b20042802bc01200441c0016a280200200441b8016a410c6a28020010d301208402450d02200441c0036a410c6a202737020020042084023602c80320042001ad4220862008ad843703c003200441d0046a200441c0036a200328025010cd0320042802d0044101470d010240200441d8046a280200450d0020042802d40410230b200041dfc3c400360204412321010b20004101360200200041086a2001360200200441e0056a24000f0b200441dc046a280200222c450d01200441e0046a2903002127200441d8046a280200210220042802d40421092003280248212320044100360288022004420137038002410410262201450d02200441043602840220044188026a22082008280200220541046a3602002004200136028002200120056a20093600000240024002402004280284022209200828020022016b41044f0d00200141046a22082001490d2a20094101742201200820082001491b22014100480d2a2009450d012004280280022009200110272208450d020c0c0b20042802800221080c0c0b2001102622080d0a0b20014101102a000b4195bfc40041361021000b4195bfc40041361021000b41044101102a000b41104108102a000b41014101102a000b41014101102a000b41104108102a000b41f0004108102a000b4109215d410821010c1d0b2004200136028402200420083602800220044188026a28020021010b20044180026a41086a200141046a360200200820016a2002360000202c2027422088a72201412c6c22086a21022027a7210f024002400240024002402001450d00200841546a2122200441d0046a4101722108200441d0046a41276a2105200441d0046a41206a210b200441d0046a41186a2107200441d0046a41106a2106200441d0046a41086a2121202c2101034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703d0042009410f460d02200441c0036a41276a22202005280000360000200441c0036a41206a220a200b290300370300200441c0036a41186a222d2007290300370300200441c0036a41106a220d2006290300370300200441c0036a41086a220e2021290300370300200420042903d0043703c003200820042903c003370000200841086a200e290300370000200841106a200d290300370000200841186a202d290300370000200841206a200a290300370000200841276a2020280000360000200420093a00d00420044198026a200441d0046a20044180026a109a0120042d0098022209411a470d05202241546a21222001412c6a22012002470d000b200222012002470d020c030b202c22012002470d010c020b2001412c6a22012002460d010b200441d0046a4101722108200441d0046a41276a2105200441d0046a41206a210b200441d0046a41186a2107200441d0046a41106a2106200441d0046a41086a2121034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703d0042009410f460d01200441c0036a41276a22222005280000360000200441c0036a41206a2220200b290300370300200441c0036a41186a220a2007290300370300200441c0036a41106a222d2006290300370300200441c0036a41086a220d2021290300370300200420042903d0043703c003200820042903c003370000200841086a200d290300370000200841106a202d290300370000200841186a200a290300370000200841206a2020290300370000200841276a2022280000360000200420093a00d004200441d0046a109f012001412c6a22012002470d000b0b0240200f450d00202c10230b20044180026a41086a280200210120042903800221272000411c6a41003a0000200041186a2001360200200041106a20273702002000410c6a208002360200200041086a20ff0136020020002023360204200041003602002000411d6a20042f00a8033b00002000411f6a200441aa036a2d00003a0000200441e0056a24000f0b20044198026a41086a2802002123200428029c0221820202402022450d002001412c6a2101200441d0046a4101722108200441d0046a41276a210b200441d0046a41206a2107200441d0046a41186a2106200441d0046a41106a2121200441d0046a41086a2122034020012d00002105200b200141286a2800003600002007200141216a2900003703002006200141196a2900003703002021200141116a2900003703002022200141096a2900003703002004200141016a2900003703d0042005410f460d01200441c0036a41276a2220200b280000360000200441c0036a41206a220a2007290300370300200441c0036a41186a222d2006290300370300200441c0036a41106a220d2021290300370300200441c0036a41086a220e2022290300370300200420042903d0043703c003200820042903c003370000200841086a200e290300370000200841106a200d290300370000200841186a202d290300370000200841206a200a290300370000200841276a2020280000360000200420053a00d004200441d0046a109f012001412c6a22012002470d000b0b0240200f450d00202c10230b0240200428028402450d0020042802800210230b024020094105470d002023450d0020820210230b20004182c4c40036020420004101360200200041086a4125360200200441e0056a24000f0b20004101360200200041086a2001360200200a450d2a0240200e450d00200e412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b20c701450d2a200a1023200441e0056a24000f0b200428029c02450d0020042802980210230b200a200e412c6c6a2105200a21010240034020052001460d0120012d000021022001412c6a2207210120024103470d000b200441d8006a200741586a10be03200428025c2201450d0020042802582107200141286c210f41002101200441a4026a211f200441e4046a211b200441a0026a211e200441e0046a211c200441ec036a21230340024002400240200720016a220241186a2d000022054101460d00024020054102460d0020054103470d022002411a6a2d0000450d030c090b200441d0046a2002411c6a10c00320042802d004222d450d020c060b200241206a2802004101470d012002411c6a28020021052004200241246a28020022023602b801200520024d0d01201f4102360200201b4102360200201e200441a8036a3602002004410236029c02200420053602a803201c20044198026a360200200442023702d4042004418cd6c4003602d0042004200441b8016a3602980220044180026a200441d0046a10a201200428028002222d450d010c0c0b20042002411c6a280200220236028002202328020020024d0d050b200f200141286a2201470d000b0b0240200441c0036a41146a28020022014102490d00200441d0046a41146a41013602002004410236028402200420013602a803200442013702d404200441e88bc3003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a10a2010c050b0240200441c8036a280200220141014d0d00200441e4046a41013602002004410236028402200420013602a803200442013702d404200441f08bc3003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a10a2010c050b200a200e412c6c6a2105200a21010240034020052001460d0120012d000021022001412c6a220721012002410c470d000b200441d0006a200741586a10be03200428025022012004280254411c6c6a2105200441c8036a2107200441e0036a210f200441c0036a41186a2123200441e4046a211f200441e0046a211b034020012005460d01200420012802002202360280020240200728020020024b0d00201f4101360200200441023602ac03201b200441a8036a360200200442023702d404200441b8d9c4003602d004200420044180026a3602a80320044198026a200441d0046a10a201200428029802222d0d0a0b200441d0046a200141046a22012023280200200f28020010c10320042d00d0044101460d08200141186a210120042d00d104450d000b41201026222d450d0a202d41186a41002900908c43370000202d41106a41002900888c43370000202d41086a41002900808c43370000202d41002900f88b4337000042a08080808004212720042802c4030d0f0c0e0b200a200e412c6c6a2105200a2101034020052001460d0120012d000021022001412c6a220721012002410a470d000b200441c8006a200741586a10be03200428024c2201450d00411c21ba01200428024822bb012001411c6c6a21bc01200441d4036a21bd01410421be01200441e0036a21bf01200441d8036a21c001410121c101410221c201200441f8036a21c301200441f0036a21c401200441ec036a21c501417c21c6014107215d0c160b024020042802c403450d0020042802c00310230b0240200441d0036a280200450d00200441cc036a28020010230b0240200441dc036a280200450d00200441d8036a28020010230b0240200441ec036a2802002202450d00200441e4036a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b0240200441e8036a280200450d00200441e4036a28020010230b0240200441f4036a280200450d00200441f0036a28020010230b202c450d14200d1023410521010c170b20042902d404212720042802c4030d0a0c090b200441e4046a4101360200200441023602ac03200442023702d40420044198dac4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c010b2002410c6a2802002101200241146a2802002102200441d0046a41146a410136020020042002360284022004200136028002200441013602ac03200442013702d404200441e08bc3003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010b200429029c022127200428029802212d0b20042802c403450d04410221010c120b200441d8046a290300212720042802d404212d20042802c4030d090c080b200429029c02212720042802c4030d0c0c0b0b200429028402212720042802c4030d090c080b41204101102a000b410321010c0d0b410321010c0c0b410221010c0b0b410321010c0a0b410221010c090b410321010c080b410221010c070b410321010c060b410221010c050b410321010c040b410221010c030b410521010c020b410821010c010b2087011023024020042802c4030d00410321010c010b410221010c000b0b101e000b02402027a7450d00202d10230b0240200e450d00200e412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b41b9bdc400210141132108202aa7450d0c200a10230c0c0b2020450d0120211023200b0d020c030b2022450d00200610230b200b450d010b200b412c6c210b200a210103402001109f012001412c6a2101200b41546a220b0d000b0b200c450d04200a10230c040b0240200b450d00200b412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b41192108200c450d00200a10230b0b0c010b410021090b200441d0036a2002360200200441cc036a2006360200200441013602c00320042007ad4220862005ad42ffff03834210862009ad42ff0183420886842008ad42ff018384843702c403200441c0036a4104722101200841ff01714105470d010b2001280208450d002001280204102320042802c0030d0041002108200441cc036a2802002209210103402001109f012001412c6a2101200841546a22080d000b200441d0036a280200450d00200910230b41ccbdc4002101411621080b2000200136020420004101360200200041086a20083602000b200441e0056a24000bed0202017e067f024002400240024002400240024002402001450d00200141074b0d01200141016a21010c020b200041086a4280808080c000370200200041046a41a48ec300360200410021010c030b2001ad4203862202422088a70d052002a7220341076e210142808080801021022003410e490d010b417f2001417f6a677641016aad42208621020b2002423d88a70d012002422088a7220141076a417c712203200141046a2204490d0120032002421d88a76a22052003490d012005417d4f0d01200510262206450d022001417f6a220541084921072002422388a741076c2108200641ff012004109304220420036a21030240200141034b0d00200420016a418001410420016b1093041a0b2005200820071b21012000410c6a2003360200200041086a2005360200200041046a20043602000b200041003a0000200041146a2001360200200041106a41003602000f0b41948dc300104f000b20054104102a000b41948dc300104f000be00e03397f017e027f230041206b220124000240024002400240024002400240200028020c220241016a22032002490d00200041046a28020022022104024020024108490d00200241016a41037641076c21040b0240200320044101764f0d00200241016a210541002106410421074103210841fffefdfb0721094107210a417f210b4181828408210c41004101710d020c030b200141086a200310c60220012d00084101460d062001411c6a280200210d200141086a410c6a280200210e200141106a280200210f200128020c2110417f21114180818284782112410421134101211420002802002215200041046a2802006a41016a21162000410c6a28020021172000280208211841202119417c211a4138211b4105211c41b9f3ddf179211d4103211e4102211f417e212041ff01212141002122411921232015280200417f734180818284787122240d040c030b41948dc300104f000b410121020c030b410021020c020b410321020c010b410421020b0240024002400340024002400240024002400240024002400240024002400240024020020e050100090304040b200620086a220220064922030d04200220054f0d042005200620076a20031b200520022005491b21060c010b200620054f0d0320062102200641016a21060b200028020020026a220220022802002202200a76200b73200c7120022009726a3602004101410171450d09410121020c0a0b201520136a21020340200220164f0d03201820196a211820022802002103200220136a22042102200320127122032012460d000b200320127321242004201a6a2115410421020c090b2018202468201b716a22262802002127410021030240202628020422282013490d00410021032027210220282104034020022800002003201c7773201d6c2103200220136a21022004201a6a2204201e4b0d000b2028201a6a22022002201a7122026b2128202720026a20136a21270b024002400240202820144d0d002027201f6a21022003201c7720272f000073201d6c2103202820206a0d010c020b202721022028450d010b2003201c7720022d000073201d6c21030b202420116a2127410021022003201c77202173201d6c222521030340200220136a22022003200f7122046a2103201020046a2800002012712228450d000b02402010202868201e7620046a200f7122026a2c00002022480d00201028020020127168201e7621020b201020026a202520237622033a000020102002201a6a200f716a20136a20033a0000200e2002201e746a2026290200370200202720247122240d05410321020c080b20002802002102200041046a220428020041016a220341034b0d01200241046a200220031095041a2000280200200428020022026a41016a418001410320026b1093041a0c020b2000200d20176b3602102000410c6a2017360200200041086a200e3602002000280200210320002010360200200041046a221328020021022013200f3602002002450d0a200310230c0a0b200220036a20022800003600000b410421294101212a200041046a222b28020041016a222c450d054100212d418001212e4103212f200041086a21304105213141b9f3ddf1792132417c213341022134417e213541ff01213641808182847821374119213841002139410221020c040b20392225202a6a21390240024002400240202520002802006a2d0000202e460d002039202c470d050c010b0240034020302802002025202f746a223b2802002127410021030240203b28020422282029490d004100210320272102202821040340200228000020032031777320326c2103200220296a2102200420336a2204202f4b0d000b202820336a2202200220337122026b2128202720026a20296a21270b0240024002402028202a4d0d00202720346a2102200320317720272f00007320326c2103202820356a0d010c020b202721022028450d010b200320317720022d00007320326c21030b202b28020021282000280200212741002102200320317720367320326c223c21030340200220296a2202200320287122046a2103202720046a2800002037712226450d000b02402027202668202f7620046a20287122026a2c0000202d480d00202728020020377168202f7621020b02402002203c20287122036b202520036b73202871202f4d0d00202720026a22032d000021042003203c20387622263a00002027200220336a2028716a20296a20263a000020042036460d0220302802002002202f746a2202290200213a2002203b290200370200203b203a3702000c010b0b202720256a203c20387622023a000020272028202520336a716a20296a20023a00002039202c470d030c010b2000280200220320256a20363a00002003202b280200202520336a716a20296a20363a000020302802002002202f746a203b2902003702002039202c470d010b200041046a280200221341084f0d070c080b410221020c040b410221020c030b410421020c020b410221020c010b410021020c000b0b417f21130b2013202a6a41037641076c21130b200020132000410c6a2802006b360210200141206a24000f0b200141206a24000b1c00200128021841bbb0c500410e2001411c6a28020028020c1102000b810101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004413c6a41273602002004412c6a4102360200200441013602342004420237021c2004419083c5003602182004200441106a3602382004200441086a3602302004200441306a360228200441186a41a083c5001061000b1c00200128021841b0b0c500410b2001411c6a28020028020c1102000bc10201037f23004180016b220224000240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110cc02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000bd40203037f017e027f230041306b220324004127210402400240024020004290ce00540d00412721040340200341096a20046a2205417c6a200020004290ce0080220642f0b17f7e7ca7220741e4006e220841017441ea86c5006a2f00003b00002005417e6a2008419c7f6c20076a41017441ea86c5006a2f00003b00002004417c6a2104200042ffc1d72f5621052006210020050d000b2006a7220541e3004c0d020c010b20002206a7220541e3004c0d010b200341096a2004417e6a22046a2006a7220741ffff037141e4006e2205419c7f6c20076a41ffff037141017441ea86c5006a2f00003b00000b02400240200541094a0d00200341096a2004417f6a22046a200541306a3a00000c010b200341096a2004417e6a22046a200541017441ea86c5006a2f00003b00000b2002200141a886c5004100200341096a20046a412720046b1097012104200341306a240020040be80102037f017e230041206b22012400200141106a41086a220242003703002001420037031041f5ccc2004111200141106a1000200141086a220320022903003703002001200129031037030042002104024002402001411041a886c500410041001001417f460d002001420037031020014110200141106a41084100100141016a41084d0d01200129031021040b200242003703002001420037031041f5ccc2004111200141106a100020032002290300370300200120012903103703002001200420007c37031020014110200141106a41081004200141206a24000f0b41d4aac10041331021000b9a820108067f027e037f017e0f7f027e0c7f027e230041d0076b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441054b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000402030105000b200341c8056a200141086a41c8001094041a200341d8046a41086a2204200141dc006a290200370300200341d8046a41106a2205200141e4006a2802003602002003200141d4006a2902003703d80420022d000120022d000072450d0a41b394c3002104412821020c5f0b200341c0036a41186a200141196a290000370300200341c0036a41106a200141116a290000370300200341c0036a41086a200141096a290000370300200320012900013703c003200341c8056a41206a200141c1006a2d00003a0000200341c8056a41186a200141396a290000370300200341c8056a41106a200141316a290000370300200341c8056a41086a200141296a2900003703002003200141216a2900003703c805200341b8066a41086a2204200241096a290000370300200341b8066a41106a2205200241116a290000370300200341b8066a41186a2206200241196a290000370300200341b8066a41206a2207200241216a2d00003a0000200341dc046a2208200241266a2f01003b0100200320022900013703b8062003200241226a2801003602d80420022d00002202450d0420034180026a41266a20032802d8043601002003418d026a200429030037000020034195026a20052903003700002003419d026a2006290300370000200341a5026a20072d00003a0000200341aa026a20082f01003b0100200320032903b80637008502200320023a008402200341013a0080020c580b200141c0006a2903002109200141386a290300210a200141306a280200210b2001412c6a280200210c200141286a280200210d2001411d6a290000210e2001411c6a2d0000210f2001411b6a2d00002110200141196a2f00002111200141186a2d00002112200141176a2d00002113200141156a2f00002114200141146a2d00002115200141136a2d00002116200141116a2f00002117200141106a2d000021182001410c6a2802002119200141086a280200211a200141076a2d0000211b200141056a2f0000211c200141046a2d0000211d200141c8006a290300211e2002411a6a290100211f200241196a2d00002120200241186a2d00002121200241166a2f01002122200241156a2d00002123200241146a2d00002124200241126a2f01002125200241116a2d00002126200241106a2d000021272002410e6a2f010021282002410d6a2d00002129200241046a2d0000212a200241026a2f0100212b41db94c3002104412a210520022d0000450d044101210641002107410021080c050b200141386a290300211e200141306a2903002109200141c0006a290300211f200341a0016a41186a200141196a290000370300200341a0016a41106a200141116a290000370300200341a0016a41086a200141096a290000370300200320012900013703a001200141246a280200210d200141286a28020021212001412c6a280200212a2002411a6a290100210e200241196a2d0000211a200241186a2d0000211d200241166a2f0100210c200241156a2d00002120200241146a2d00002122200241126a2f01002123200241116a2d00002124200241106a2d000021252002410e6a2f010021262002410d6a2d00002127200241046a2d00002128200241026a2f0100212941db94c3002104412a210520022d0000450d054101210641002107410021080c060b2001410c6a280200210c200141086a280200211a200141046a280200211d200141106a290300211f2002411a6a290100210e200241196a2d00002120200241186a2d00002121200241166a2f0100210d200241156a2d00002122200241146a2d00002123200241126a2f01002124200241116a2d00002125200241106a2d000021262002410e6a2f010021272002410d6a2d00002128200241046a2d00002129200241026a2f0100212a412a210541db94c300210420022d0000450d074101210641002107410021080c080b200141d8006a290300210e200141d0006a290300211e200341c0016a41186a200141196a290000370300200341c0016a41106a200141116a290000370300200341c0016a41086a200141096a290000370300200320012900013703c001200341e0016a41186a200141396a290000370300200341e0016a41106a200141316a290000370300200341e0016a41086a200141296a2900003703002003200141216a2900003703e001200141c4006a280200211d200141c8006a280200211a200141cc006a280200212a2002411a6a290100211f200241196a2d0000210c200241186a2d00002120200241166a2f01002121200241156a2d0000210d200241146a2d00002122200241126a2f01002123200241116a2d00002124200241106a2d000021252002410e6a2f010021262002410d6a2d00002127200241046a2d00002128200241026a2f0100212941db94c3002104412a210520022d0000450d084101210641002107410021080c090b20034180026a41216a20072d00003a000020034180026a41196a200629030037000020034180026a41116a200529030037000020034180026a41096a2004290300370000200320032903b80637008102200341003a00800220032d00810222024101460d0f20024102470d5320032d00c8054101470d53200341c8056a41017221024200211f0c100b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d4e2003201f3703f801200320203a00f701200320213a00f601200320223b01f401200320233a00f301200320243a00f201200320253b01f001200320263a00ef01200320273a00ee01200320283b01ec01200320293a00eb01200320023600e701200320043600e3012003202a3a00e2012003202b3b01e001201d41ff01714101470d4920034180026a201a4106761087012003280280022104200328028802201a413f7122024d0d0f200420024105746a2202290018210e20022d0017210f20022d0016211020022f0014211120022d0013211220022d0012211320022f0010211420022d000f211520022d000e211620022f000c211720022d000b2118200228000721062002280003210720022d0002211b20022f0000211c41012105200328028402450d480c470b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d412003200e3703d8012003201a3a00d7012003201d3a00d6012003200c3b01d401200320203a00d301200320223a00d201200320233b01d001200320243a00cf01200320253a00ce01200320263b01cc01200320273a00cb01200320023600c701200320043600c301200320283a00c201200320293b01c00120034180026a200341c0016a201f10cf022003280280024101470d052003280288022102200328028402210420210d420c430b200141d0006a2802002102200341b8066a200341c8056a41c8001094041a200341c0036a41106a2005280200360200200341c0036a41086a2004290300370300200320032903d8043703c003200341a8056a41086a22044200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2004290300370300200320032903a8053703a001410021050240200341a0016a411041a886c500410041001001417f460d00200342103702b4042003200341a0016a3602b00420034180026a200341b0046a10c10220032d00dc024102460d2520032802c80221050b41d48fc30021040240200520024f0d002003418c026a200236020020034180026a41086a41033a00002003410a3a0080024100210441a886c500410020034180026a102c20034180026a200341b8066a41c8001094041a200341d4026a200341c0036a41086a290300370200200341dc026a200341c0036a41106a280200360200200320023602c802200320032903c0033702cc02200341a8056a41086a22024200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a001200341003602b804200342013703b00420034180026a200341b0046a10b20220032802b4042102200341a0016a411020032802b004220520032802b80410042002450d00200510230b413521020c4f0b41012106410021074100210820022d00014101470d002002410c6a2d000021072002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200841ffff0371410874200741187472200541ff017172210220060d062003200e3703e005200320203a00df05200320213a00de052003200d3b01dc05200320223a00db05200320233a00da05200320243b01d805200320253a00d705200320263a00d605200320273b01d405200320283a00d305200320023600cf05200320043600cb05200320293a00ca052003202a3b01c805200341a8056a41086a22024200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a001200341a0016a411041a886c500410041001001417f460d04200342103702c4032003200341a0016a3602c00320034180026a200341c0036a10c10220032d00dc0222024102460d20200341b8066a20034180026a41dc001094041a20032f00dd022104200341b8066a41df006a20034180026a41df006a2d00003a0000200320043b009507200320023a0094070c050b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d392003201f3703c8042003200c3a00c704200320203a00c604200320213b01c4042003200d3a00c304200320223a00c204200320233b01c004200320243a00bf04200320253a00be04200320263b01bc04200320273a00bb04200320023600b704200320043600b304200320283a00b204200320293b01b00420034180026a200341b0046a10d80120032d00800222044102470d0141012104413421024202211f0c0c0b20034180026a41306a290300210e200341a8026a290300211f200341e0016a41186a20034180026a41206a290300370300200341e0016a41106a20034180026a41186a290300370300200341e0016a41086a20034180026a41106a29030037030020032003290388023703e00120034180026a10d002200320034180026a3602bc03200320034180026a36029005200341c8056a41186a2205200341c0016a41186a290300370300200341c8056a41106a2206200341c0016a41106a290300370300200341c8056a41086a2207200341c0016a41086a290300370300200320032903c0013703c805200341b8066a200341c8056a10d8014100210420032d00b80622084102460d31200341f0066a28020021022008450d0e410021040c310b200341a8056a41086a220520034194026a290200370300200341a8056a41106a22062003419c026a280200360200200341c8056a41086a220720034180026a41306a290300370300200341c8056a41106a2208200341b8026a290300370300200341c8056a41186a220c200341c0026a290300370300200341c8056a41206a2220200341c8026a290300370300200341c8056a41286a2221200341d0026a290300370300200341c8056a41306a220d200341d8026a29030037030020032003418c026a2902003703a805200320034180026a41286a2903003703c80520034180026a41086a28020021024202211f42022109024020040d0020034180026a41206a2903002109200341a0016a41106a2006280200360200200341a0016a41086a2005290300370300200341c0036a41086a2007290300370300200341c0036a41106a2008290300370300200341c0036a41186a200c290300370300200341c0036a41206a2020290300370300200341c0036a41286a2021290300370300200341c0036a41306a200d290300370300200320032903a8053703a001200320032903c8053703c0030b20094202520d0941012104413421020c0a0b200341003a00940720034280808480800237038807200342013703f806200342013703f006200342013703e806200342013703e006200342013703d806200342013703d006200342013703c806200342013703c006200342013703b80620034280808080c0003703800720034120360290070b20034180026a200341c8056a201f10cf022003280280024101470d01200328028802210220032802840221040b4100210841012107201a450d31201d10230c310b200341b0026a290300210e200341a8026a290300211f200341a0026a290300210a20034198026a290300212c20034190026a290300211e200329038802212d200341206a20032903b8064200200cad4200109804201e427f200329032020032903284200521b7d2209201e56200950722206450d03412c2102418990c300210541012104201a0d040c2f0b20032d00c8054101460d434200211f200341a8056a41086a22024200370300200342003703a80541b590c300411c200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a0010240200341a0016a411041a886c500410041001001417f460d00200342003703b806200341a0016a4110200341b8066a41084100100141016a41084d0d1720032903b806211f0b20034180026a41027221020b4100210441012107200341c0036a201f410010d10241ff01714101470d0b4200211f200341a8056a41086a22054200370300200342003703a80541d190c3004118200341a8056a1000200341a0016a41086a2005290300370300200320032903a8053703a001200341a0016a411041a886c500410041001001417f460d09200342003703e004200342003703d804200341a0016a4110200341d8046a4110410010012205417f460d192005410f4d0d19200341e0046a290300210e20032903d804211f0c0a0b410021052003280284020d370c380b20034180026a201d200c200341b8066a10c5022003280280024101470d0320034188026a2802002102200328028402210541012104201a450d2b0b201d10230c2a0b200341c8056a41106a200341a0016a41106a280200360200200341c8056a41086a200341a0016a41086a29030037030020034180026a41086a200341c0036a41086a29030037030020034180026a41106a200341c0036a41106a29030037030020034180026a41186a200341c0036a41186a29030037030020034180026a41206a200341c0036a41206a29030037030020034180026a41286a200341c0036a41286a29030037030020034180026a41306a200341c0036a41306a290300370300200320032903a0013703c805200320032903c00337038002410021042009211f0b20034190056a41106a2205200341c8056a41106a28020036020020034190056a41086a2206200341c8056a41086a290300370300200341d8046a41086a220720034180026a41086a290300370300200341d8046a41106a220820034180026a41106a290300370300200341d8046a41186a220c20034180026a41186a290300370300200341d8046a41206a222020034180026a41206a290300370300200341d8046a41286a222120034180026a41286a290300370300200341d8046a41306a220d20034180026a41306a290300370300200320032903c8053703900520032003290380023703d80402402004450d0041d291c3002104201a0d2e0c2f0b200341b8066a41206a20032903d804370300200341c4066a2006290300370200200341cc066a2005280200360200200341b8066a41286a2007290300370300200341b8066a41306a2008290300370300200341f0066a200c290300370300200341f8066a202029030037030020034180076a202129030037030020034188076a200d29030037030020032003290390053702bc06200320023602b8062003201f3703d00642002109200341a8056a41086a22024200370300200342003703a80541af98c300410d200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a0010240200341a0016a411041a886c500410041001001417f460d002003420037038002200341a0016a411020034180026a41084100100141016a41084d0d1020032903800221090b0240201fa74101470d00200341d8066a2903002009520d00418692c3002104412a2102200341e4066a280200450d2d0c2c0b20034180026a200341c0016a10d80120032d00800222024102470d010c2a0b200341d8046a41186a220420034180026a410472220241186a280200360200200341d8046a41106a2207200241106a290200370300200341d8046a41086a222a200241086a290200370300200320022902003703d80420034180026a41186a2202420037030020034180026a41106a2205420037030020034180026a41086a42003703002003420037038002201d200c20034180026a10022002290300211e20052f0100210820032d009702212020032d009602212120032f019402210d20032d009302212220032d009202212320032d008f02212420032d008e02212520032f018c02212620032d008b0221272003280087022102200328008302210520032d008202212820032f0180022129200341c0036a41186a2004280200360200200341c0036a41106a2007290300370300200341c0036a41086a202a290300370300200320032903d8043703c003411410262204450d14200441106a41002800d28943360000200441086a41002900ca8943370000200441002900c2894337000020044114413410272204450d152004201e37002c200420203a002b200420213a002a2004200d3b0028200420223a0027200420233a0026200420083b0024200420243a0023200420253a0022200420263b0020200420273a001f2004200236001b20042005360017200420283a0016200420293b001420034180026a41186a2207420037030020034180026a41106a222a420037030020034180026a41086a222b420037030020034200370380022004413420034180026a1002200341a8056a41186a2007290300370300200341a8056a41106a202a290300370300200341a8056a41086a202b29030037030020032003290380023703a805200341a8056a200341c0036a10b101200410230240200341c0036a41106a280200450d0020032802cc0310230b411510262204450d162004410d6a41002900f48943370000200441086a41002900ef8943370000200441002900e7894337000020044115413510272204450d172004201e37002d200420203a002c200420213a002b2004200d3b0029200420223a0028200420233a0027200420083b0025200420243a0024200420253a0023200420263b0021200420273a00202004200236001c20042005360018200420283a0017200420293b001520034180026a41186a2207420037030020034180026a41106a222a420037030020034180026a41086a222b420037030020034200370380022004413520034180026a1002200341a8056a41186a2007290300370300200341a8056a41106a202a290300370300200341a8056a41086a202b29030037030020032003290380023703a805200341003602880220034201370380022003200c3602c003200341c0036a20034180026a1041200328028402222b200328028802222a6b200c4f0d02202a200c6a2207202a490d20202b410174220f20072007200f491b220f4100480d20202b450d09200328028002202b200f10272207450d0a0c250b2002450d052003418c026a2d000021022003418d026a290000211f20034195026a280000210420032f008102210520032d0083022106200329028402210a200320034199026a2900003703f004200320043602ec042003201f3702e404200320023a00e3042003200a3700db04200320063a00da04200320053b01d804200341d0066a290300210a200341d8066a290300212c2003201d3602a8052003201d202a4105746a3602ac052003200341b8066a3602b005200341c8056a200341a8056a10a00220032802c805450d0720034180026a41086a2202200341c8056a41086a290300370300200320032903c80537038002411010262205450d192005200329038002370200200541086a2002290300370200200341c0036a41086a200341a8056a41086a280200360200200320032903a8053703c003200341c8056a200341c0036a10a00220032802c805450d0a4101210241012107034020034180026a41086a2206200341c8056a41086a290300370300200320032903c8053703800202400240024020072002470d00200241016a22042002490d2320024101742207200420042007491b2207ad420486221f422088a70d23201fa722084100480d232002450d01200520024104742008102722050d020c140b200241016a21040c010b200810262205450d120b200520024104746a2202200329038002370200200241086a2006290300370200200341c8056a200341c0036a10a0022004210220032802c8050d000c0c0b0b2002417f4c0d33200341ec066a280200211a200341b8066a41306a28020021082002450d05200210262204450d172004200820021094041a201a450d220c210b20032802800221070c230b4200210e0b200341b8066a2002201f200e107e41012106024020032802b8064101470d0020032802c006210220032802bc0621040c2d0b200320032903c0063703b0042003200341c8066a2903003703b8042003200341b0046a3602d804200341d8046a107b0b410121064101211a4101210820012d0000220541064d0d3a0c3b0b200341b4026a280200450d22200341b0026a28020010230c220b41012104201a0d1b0c1c0b4100210741042105410021040c030b200f102622070d1b0b200f4101102a000b41012104410121070b200341e8066a280200210220032802e006210620034100360280022006200220034180026a101321202003280280022206417f460d0b200341c8056a41186a200341e0016a41186a290300370300200341c8056a41106a200341e0016a41106a290300370300200341c8056a41086a200341e0016a41086a290300370300200320032903e0013703c80520034100360288022003420137038002200320063602a805200341a8056a20034180026a1041024002400240200328028402220820032802880222026b20064f0d00200220066a220c2002490d1620084101742221200c200c2021491b22214100480d162008450d01200328028002200820211027220c450d020c110b200328028002220c20026a202020061094041a200220066a2202450d110c120b20211026220c0d0f0b20214101102a000b20034194026a4101360200200341013602bc062003418898c4003602b8062003420137028402200341d497c400360280022003200341b8066a3602900220034180026a41c4cec2001061000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20084104102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41154101102a000b41354101102a000b41f8ffc40041381021000b20024101102a000b41104104102a000b20032021360284022003200c3602800220212108200c20026a202020061094041a200220066a22020d010b4101212120080d010c020b20024100480d02200210262221450d032021200c20021094041a2008450d010b200c10230b20024101742208200241206a220c200c2008491b220d4100480d00024002402002450d0020212002200d10272208450d010c040b200d102622080d030b200d4101102a000b101e000b20024101102a000b200820026a220220032903c805370000200241186a200341c8056a41186a290300370000200241106a200341c8056a41106a290300370000200241086a200341c8056a41086a29030037000020034180026a41186a2202420037030020034180026a41106a2221420037030020034180026a41086a220d420037030020034200370380022008200c20034180026a1002200341c0036a41186a2002290300370300200341c0036a41106a2021290300370300200341c0036a41086a200d29030037030020032003290380023703c0032008102302402006450d00202010230b0240024002400240024002400240200341c0036a200341d8046a4120109604450d00200520044104746a21242004450d01200341e8066a2125200341e0066a212620052102034020022802002206450d03200241046a2802002104200241086a28020021082002410c6a280200210c202528020021202026280200212120034180026a41186a220d420037030020034180026a41106a2222420037030020034180026a41086a2223420037030020034200370380022006412020034180026a1002200341a8056a41186a200d290300370300200341a8056a41106a2022290300370300200341a8056a41086a202329030037030020032003290380023703a80520212020200341a8056a41202004200c100b02402008450d00200410230b200241106a22022024470d000c050b0b2004450d04200441047421082005410c6a2102410021060340200228020020066a2106200241106a2102200841706a22080d000c060b0b200522022024470d010c020b200241106a22022024460d010b03402002280200450d010240200241086a280200450d00200241046a28020010230b200241106a22022024470d000b0b02402007450d00200510230b41b092c300210441162102200341e4066a2802000d090c0a0b410021060b200320032802ec0620066b3602ec0602400240411710262202450d002002410f6a41002900abcd42370000200241086a41002900a4cd423700002002410029009ccd4237000020024117413710272202450d01200220032903b0043700172002412f6a200341b0046a41186a290300370000200241276a200341b0046a41106a2903003700002002411f6a200341b0046a41086a29030037000020034180026a41186a2206420037030020034180026a41106a2208420037030020034180026a41086a220c420037030020034200370380022002413720034180026a1002200341a8056a41186a2006290300370300200341a8056a41106a2008290300370300200341a8056a41086a200c29030037030020032003290380023703a805200341a8056a41201003200210232008200e370300200341a8026a2009202c202a1b37030020034180026a41206a4201200a202a1b37030020062009370300200341b0026a200341e0066a2202290300370300200341b8026a200241086a280200360200200341bc026a200341ec066a280200360200200341c0026a20032903e001370300200341c8026a200341e0016a41086a290300370300200341d0026a200341e0016a41106a290300370300200341d8026a200341e0016a41186a2903003703002003201e37038802200341003a008002200341c0016a20034180026a10dd0120034190016a200341b0046a10840120034190016a41086a290300211f200329039001210e20034180026a200341b0046a4200420010dc01024002402003290380024200510d002003200c3602c805200341c8056a10de010c010b2003200c3602c805200341c8056a107b0b20034180016a200341c0016a200e201f108202200320034188016a2903003703d00520032003290380013703c8052003200341c8056a3602a805200341a8056a107b02402004450d0020044104742104200541046a210203400240200241046a280200450d00200228020010230b200241106a2102200441706a22040d000b0b02402007450d00200510230b410021040240201a450d00201d10230b0c0c0b41174101102a000b41374101102a000b200810230b200341fc036a4100360200200341ec036a221d4200370200200341c0036a41206a41dcacc400360200200341dc036a41a886c500360200200341d4036a22084200370200200341c0036a41106a41f098c400360200200341c0036a41086a2002360200200341a4046a20052903003702002003419c046a200629030037020020034194046a2007290300370200200342083702f4032003428080808080013702e403200341003602cc03200320023602c403200320043602c003200320032903c80537028c04200320034190056a360288042003200341bc036a36028404200320034180026a36028004200341b0046a200341c0036a2009201e200341e0016a200341a0016a200d202a10e2014101210c41012123024020032d00b00422240d00200341b8066a41086a221a2008290200370300200341c8056a41086a200341c4066a280200360200200320032902cc033703b806200320032902bc063703c805200341c8076a200341c8056a10db01200341e8036a2802002220200341f0036a280200220441e8006c6a2108201d280200212220202102024002402004450d00200341c1066a211d202021020240034020022d00002104200341c8056a200241016a41d7001094041a20044106460d01200241d8006a2800002105200241dc006a2800002106200241e0006a2800002107201a20043a00002003410a3a00b806201d200341c8056a41d7001094041a20052007200341b8066a102c02402006450d00200510230b200241e8006a22022008470d000c030b0b200241e8006a21020b20022008460d00034020022d000022044106460d01200241286a2800002105200241246a28000021060240200241dc006a280000450d00200241d8006a28000010230b024020044105490d002005450d00200610230b200241e8006a22022008470d000b0b410021232022450d00202010230b200341e0006a20032903f001200341f8016a29030020032903e801221e420010980420032903e001201e7d10cd02200341f0006a200341c0016a2003290360200341e0006a41086a290300108202200341c8066a200e200341f0006a41086a29030022097d201f2003290370221e54ad7d2009200e7d201e201f54ad7d201e201f582009200e582009200e5122021b22041b220a3703002003201f201e7d201e201f7d20041b222c3703c0062003201e201f562009200e5620021b2202ad221f3703b806024020020d002003202c3703c8052003200a3703d0052003200341c8056a3602d804200341d8046a10de014100210c20032903b806211f0b200341b8066a41086a210202400240201f4200510d00200320023602c805200341c8056a107b0c010b200c450d00200320023602c805200341c8056a10de010b200341f4036a2802002222200341fc036a28020022044190016c6a211d200341f8036a2802002125202221020240024002402004450d00200341c1066a2104200341d8046a4102722105200341b8066a410472210c200341e1066a21202022210202400340200341a8056a41186a2207200241186a290300370300200341a8056a41106a2208200241106a290300370300200341a8056a41086a221a200241086a290300370300200320022903003703a805200241206a2802002106200341c8056a200241246a41ec001094041a2006410e460d01200320063602b806200c200341c8056a41ec001094041a200520032903a805370000200541086a201a290300370000200541106a2008290300370000200541186a200729030037000020034180023b01d804200341d8006a200341b8066a200341d8046a10d20220032802582106200341b8066a41086a41043a000020202006453a0000200420032903a805370000200441086a201a290300370000200441106a2008290300370000200441186a20072903003700002003410a3a00b80641a886c5004100200341b8066a102c20024190016a2202201d470d000b201d2202201d470d020c030b20024190016a21020b2002201d460d010b200341b8066a41206a2105200341b8066a41246a210c0340200341a8056a41186a2206200241186a290300370300200341a8056a41106a2207200241106a290300370300200341a8056a41086a2208200241086a290300370300200320022903003703a805200241206a2802002104200341b8066a200241246a41ec001094041a2004410e460d01200341d8046a41186a221a2006290300370300200341d8046a41106a22062007290300370300200341d8046a41086a22072008290300370300200320032903a8053703d804200341c8056a200341b8066a41ec001094041a20052004360200200341b8066a41186a201a290300370300200341b8066a41106a2006290300370300200341b8066a41086a2007290300370300200320032903d8043703b806200c200341c8056a41ec001094041a2005102420024190016a2202201d470d000b0b02402025450d00202210230b200341b8046a280200210241002104024020244101470d0020032802b40421040b024020032802c0032205450d0020032802c403450d00200510230b2023450d09200341c0036a41186a280200211a200341d0036a280200210502400240200341c0036a41146a2802002207450d002007210820052106034020062802880b21062008417f6a22080d000b0340200520052f01064102746a41880b6a28020021052007417f6a22070d000c020b0b200521060b200341d4066a20052f0106360200200341b8066a41186a4100360200200341b8066a41146a20053602002003201a3602d806200341003602c806200342003703c006200320063602bc06200341003602b806200341b8066a10d4010240200341f0036a2802002206450d00200341c0036a41286a2802002105200641e8006c210603400240200541dc006a280200450d00200541d8006a28020010230b024020052d00004105490d00200541286a280200450d00200541246a28020010230b200541e8006a2105200641987f6a22060d000b0b200341ec036a280200450d09200341e8036a280200102320210d0a0c0b0b2003200f360284022003200736028002200f212b0b2007202a6a201d200c1094041a200341a8056a41202007202a200c6a10040240202b450d00200710230b200410230240201a450d00201d10230b200341a1026a201e370000200341a0026a20203a00002003419f026a20213a00002003419d026a200d3b00002003419c026a20223a00002003419b026a20233a000020034199026a20083b000020034198026a20243a000020034197026a20253a000020034195026a20263b000020034194026a20273a000020034190026a20023602002003418c026a20053602002003418b026a20283a000020034189026a20293b000020034188026a41023a00002003410a3a0080024100210441a886c500410020034180026a102c0b2003202c200a4200200920061b221e4200109804202d201e7d10cd02200341106a200341c8056a2003290300200341086a29030010820220034190026a200e200341106a41086a29030022097d201f2003290310221e54ad7d2009200e7d201e201f54ad7d201e201f582009200e582009200e5122061b22071b220a3703002003201f201e7d201e201f7d20071b222c370388022003201e201f562009200e5620061b2206ad221f3703800241012107024020060d002003202c3703c0032003200a3703c8032003200341c0036a3602d804200341d8046a10de0141002107200329038002211f0b20034180026a41086a210602400240201f4200510d00200320063602c003200341c0036a107b0c010b2007450d00200320063602c003200341c0036a10de010b410021082005410020041b2104410121070b410121064101211a20012d0000220541064d0d170c180b41c692c3002104412e2102200341e4066a280200450d010b20032802e00610230b201a450d010b201d10230b4100211a41012107410121060c110b2021450d010b200d10230b410021060b410121070c0c0b200410230b200741d9cac40020051b21042006411520051b21022005450d052004211a200221190b20034180026a200341e0016a201e10cf0202402003280280024101470d0020032802880221022003280284022104200c0d060c070b20034180026a41306a290300211e200341a8026a290300211f200341b0046a41186a20034180026a41206a290300370300200341b0046a41106a20034180026a41186a290300370300200341b0046a41086a20034180026a41106a29030037030020032003290388023703b00420034180026a10d002200320034180026a36029005200320034180026a3602a001200341c8056a41186a2205200341e0016a41186a290300370300200341c8056a41106a2206200341e0016a41106a290300370300200341c8056a41086a2207200341e0016a41086a290300370300200320032903e0013703c805200341b8066a200341c8056a10d8014100210420032d00b80622084102460d03200341f0066a280200210202402008450d00410021040c040b2002417f4c0d00200341ec066a280200211d200341b8066a41306a280200210802402002450d00200210262204450d022004200820021094041a201d450d040c030b41012104201d0d020c030b101d000b20024101102a000b200810230b200341fc036a4100360200200341ec036a221d4200370200200341c0036a41206a41dcacc400360200200341dc036a41a886c500360200200341d4036a22084200370200200341c0036a41106a41f098c400360200200341c0036a41086a2002360200200341a4046a20052903003702002003419c046a200629030037020020034194046a2007290300370200200342083702f4032003428080808080013702e403200341003602cc03200320023602c403200320043602c003200320032903c80537028c042003200341a0016a36028804200320034190056a36028404200320034180026a360280042003200e3703d0062003200f3a00cf06200320103a00ce06200320113b01cc06200320123a00cb06200320133a00ca06200320143b01c806200320153a00c706200320163a00c606200320173b01c406200320183a00c306200320193600bf062003201a3600bb062003201b3a00ba062003201c3b01b806200341003602d005200342013703c805200341c0016a200341c0036a200341b8066a200a2009200341b0046a200d200b200341c8056a10e7014101212041012123024020032802c00122240d00200341b8066a41086a221a2008290200370300200341c8056a41086a200341c4066a280200360200200320032902cc033703b806200320032902bc063703c805200341c8076a200341c8056a10db01200341e8036a2802002221200341f0036a280200220441e8006c6a2108201d280200212220212102024002402004450d00200341c1066a211d202121020240034020022d00002104200341c8056a200241016a41d7001094041a20044106460d01200241d8006a2800002105200241dc006a2800002106200241e0006a2800002107201a20043a00002003410a3a00b806201d200341c8056a41d7001094041a20052007200341b8066a102c02402006450d00200510230b200241e8006a22022008470d000c030b0b200241e8006a21020b20022008460d00034020022d000022044106460d01200241286a2800002105200241246a28000021060240200241dc006a280000450d00200241d8006a28000010230b024020044105490d002005450d00200610230b200241e8006a22022008470d000b0b410021232022450d00202110230b200341386a20032903c004200341c8046a29030020032903b804220e420010980420032903b004200e7d10cd02200341c8006a200341e0016a2003290338200341386a41086a290300108202200341c8066a201e200341c8006a41086a29030022097d201f2003290348220e54ad7d2009201e7d200e201f54ad7d200e201f582009201e582009201e5122021b22041b220a3703002003201f200e7d200e201f7d20041b222c3703c0062003200e201f562009201e5620021b2202ad221f3703b806024020020d002003202c3703c8052003200a3703d0052003200341c8056a3602d804200341d8046a10de014100212020032903b806211f0b200341b8066a41086a210202400240201f4200510d00200320023602c805200341c8056a107b0c010b2020450d00200320023602c805200341c8056a10de010b200341f4036a2802002222200341fc036a28020022044190016c6a211d200341f8036a2802002125202221020240024002402004450d00200341c1066a2104200341d8046a4102722105200341b8066a4104722120200341e1066a21212022210202400340200341a8056a41186a2207200241186a290300370300200341a8056a41106a2208200241106a290300370300200341a8056a41086a221a200241086a290300370300200320022903003703a805200241206a2802002106200341c8056a200241246a41ec001094041a2006410e460d01200320063602b8062020200341c8056a41ec001094041a200520032903a805370000200541086a201a290300370000200541106a2008290300370000200541186a200729030037000020034180023b01d804200341306a200341b8066a200341d8046a10d20220032802302106200341b8066a41086a41043a000020212006453a0000200420032903a805370000200441086a201a290300370000200441106a2008290300370000200441186a20072903003700002003410a3a00b80641a886c5004100200341b8066a102c20024190016a2202201d470d000b201d2202201d470d020c030b20024190016a21020b2002201d460d010b200341b8066a41206a2105200341b8066a41246a21200340200341a8056a41186a2206200241186a290300370300200341a8056a41106a2207200241106a290300370300200341a8056a41086a2208200241086a290300370300200320022903003703a805200241206a2802002104200341b8066a200241246a41ec001094041a2004410e460d01200341d8046a41186a221a2006290300370300200341d8046a41106a22062007290300370300200341d8046a41086a22072008290300370300200320032903a8053703d804200341c8056a200341b8066a41ec001094041a20052004360200200341b8066a41186a201a290300370300200341b8066a41106a2006290300370300200341b8066a41086a2007290300370300200320032903d8043703b8062020200341c8056a41ec001094041a2005102420024190016a2202201d470d000b0b02402025450d00202210230b200341c8016a280200210220032802c40121050240024002402024450d002005210420032802c00322050d010c020b4100210402402002450d00200510230b20032802c0032205450d010b20032802c403450d00200510230b2023450d00200341c0036a41186a280200211a200341d0036a280200210502400240200341c0036a41146a2802002207450d002007210820052106034020062802880b21062008417f6a22080d000b0340200520052f01064102746a41880b6a28020021052007417f6a22070d000c020b0b200521060b200341d4066a20052f0106360200200341b8066a41186a4100360200200341b8066a41146a20053602002003201a3602d806200341003602c806200342003703c006200320063602bc06200341003602b806200341b8066a10d4010240200341f0036a2802002206450d00200341c0036a41286a2802002105200641e8006c210603400240200541dc006a280200450d00200541d8006a28020010230b024020052d00004105490d00200541286a280200450d00200541246a28020010230b200541e8006a2105200641987f6a22060d000b0b200341ec036a280200450d00200341e8036a2802001023200c0d010c020b200c450d010b200d10230b41012106410021070c020b41e990c300210441e90021020b41012107410121060b4101211a0b4101210820012d0000220541064b0d010b024002400240024020050e0705050003010502050b2008450d04200141086a280200450d04200141046a28020010230c040b2006450d03200141286a280200450d03200141246a28020010230c030b201a450d02200141c8006a280200450d02200141c4006a28020010230c020b2007450d012001412c6a280200450d01200141286a28020010230c010b200141c8006a280200450d00200141c4006a28020010230b2000200236020420002004360200200341d0076a24000bc50602027f047e230041e0006b22032400200341386a41086a22044200370300200342003703384186cdc2004116200341386a1000200341d0006a41086a20042903003703002003200329033837035002400240024002400240200341d0006a411041a886c500410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821050c010b4280ade20421050b42002106200341386a41086a220442003703002003420037033841f5ccc2004111200341386a1000200341d0006a41086a2004290300370300200320032903383703500240200341d0006a411041a886c500410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821060b0240200520067d20025a0d0020004188abc40036020420004101360200200041086a411b360200200341e0006a24000f0b42002105200341386a41086a220442003703002003420037033841b3cdc2004111200341386a1000200341d0006a41086a20042903003703002003200329033837035002400240200341d0006a411041a886c500410041001001417f460d002003420037034020034200370338200341d0006a4110200341386a4110410010012204417f460d042004410f4d0d04200341c0006a2903002105200329033821060c010b420121060b200341186a2005420020024200109804200341286a2002420020064200109804200341086a420042002006420010980402402003290310200329032084420052200341286a41086a2903002207200329030820032903187c7c2208200754724101470d00200041a3abc40036020420004101360200200041086a4127360200200341e0006a24000f0b200341386a2001200329032820084108108502024020032802384101470d002000200329023c37020420004101360200200341e0006a24000f0b20032903402107200041306a200341386a41106a290300370300200041286a2007370300200041206a2005370300200041186a2006370300200041106a2002370300200041086a200237030020004100360200200341e0006a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000bcf0d06087f097e027f057e017f057e23004190016b22012400200141306a41086a220242003703002001420037033041bc8fc3004118200141306a1000200141106a41086a2002290300370300200120012903303703104100210341102104024002400240200141106a411041a886c500410041001001417f460d00200142103702242001200141106a360220200141306a200141206a10c10220012d008c0122034102460d022001410c6a41026a2001418f016a2d00003a0000200120012f008d013b010c200128028801210520012802840121042001280280012106200128027c210720012802782108200129037021092001290368210a2001290360210b2001290358210c2001290350210d2001290348210e2001290340210f20012903382110200129033021110c010b420121094104210741808004210641202105410021084201210a4201210b4201210c4201210d4201210e4201210f42012110420121110b200141306a41086a22024200370300200142003703304182b6c100411b200141306a1000200141106a41086a2212200229030037030020012001290330370310024002400240024002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012213417f460d022013410f4d0d02200141386a2903002114200129033021150c010b42002115420021140b200242003703002001420037033041f492c3004111200141306a10002012200229030037030020012001290330370310024002400240200141106a411041a886c500410041001001417f460d0020014100360230200141106a4110200141306a41044100100141016a41044d0d02200128023021120c010b41e40021120b42002116200141306a41086a2202420037030020014200370330418593c3004114200141306a1000200141106a41086a20022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d042002410f4d0d04200141386a2903002116200129033021170c010b421521170b42002118200141306a41086a2202420037030020014200370330419993c3004114200141306a1000200141106a41086a221320022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012219417f460d052019410f4d0d05200141386a290300211a2001290330211b0c010b4200211b4200211a0b200242003703002001420037033041ad93c3004114200141306a1000201320022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d062002410f4d0d06200141386a290300211c200129033021180c010b4200211c0b200141306a41086a220242003703002001420037033041c193c3004114200141306a1000200141106a41086a2002290300370300200120012903303703100240024002400240200141106a411041a886c500410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d022001290330211d0c010b428701211d0b200141306a41086a220242003703002001420037033041d593c3004116200141306a1000200141106a41086a20022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d032001290330211e0c010b42af01211e0b200020033a005c2000200536025820002004360254200020063602502000200736024c20002008360248200020093703402000200a3703382000200b3703302000200c3703282000200d3703202000200e3703182000200f3703102000201037030820002011370300200020012f010c3b005d200041df006a2001410e6a2d00003a0000200041e8006a201437030020002015370360200020123602b0012000201e3703a8012000201d3703a00120004198016a201c370300200020183703900120004188016a201a3703002000201b37038001200041f8006a20163703002000201737037020014190016a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000ba01b09017f017e017f017e047f087e017f027e037f230041b0036b2203240020034190026a200010d801024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020032d009002417f6a41ff017141014d0d0020034190016a41086a200341d8026a29030037030020034190016a41106a200341e0026a29030037030020034190016a41186a200341e8026a2903003703002003200341d0026a2903003703900120034190026a41106a290300210420034190026a41086a22052903002106200341cc026a2802002107200341c8026a2802002108200341c4026a2802002109200341c0026a280200210a20034190026a41186a290300210b20054200370300200342003703900241af98c300410d20034190026a100020034190036a41086a20052903003703002003200329039002370390034200210c024020034190036a411041a886c500410041001001417f460d00200342003703900220034190036a411020034190026a41084100100141016a41084d0d04200329039002210c0b024042004200200c20017d22012001200c561b2201200b7d220b200b2001561b220d500d0020034180016a200010840120034180016a41086a2903002101200329038001210e4200210b20034190026a41086a22054200370300200342003703900241f1cdc200411a20034190026a100020034190036a41086a20052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d072005410f4d0d070240200329039002220b20034190026a41086a290300220f84500d00200341f0006a200e2001200b200f109704200341f0006a41086a29030021102003290370210b0c020b4200210b0b420021100b20034190026a41086a22054200370300200342003703900241c4cdc200411420034190026a100020034190036a41086a20052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d082005410f4d0d0820034198026a290300210f20032903900221110c010b420021114200210f0b200341c0006a4200420020107d2007ad2210200b54ad7d22122010200b7d220b20105620124200522012501b22051b2210420020114200109804200341d0006a200f42004200200b20051b220b4200109804200341e0006a200b420020114200109804427f20032903602010420052200f42005271200329034842005272200329035842005272200341e0006a41086a290300220b200329034020032903507c7c2211200b547222051b220f427f201120051b221184500d004200210b20034190026a41086a2205420037030020034200370390024182b6c100411b20034190026a100020034190036a41086a2207200529030037030020032003290390023703900320034190036a411041a886c500410041001001417f460d022003420037039802200342003703900220034190036a411020034190026a4110410010012213417f460d072013410f4d0d0720034198026a290300211220032903900221140c030b2009450d00200a10230b410021050c170b42002114420021120b20054200370300200342003703900241d8cdc200411920034190026a1000200720052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d062005410f4d0d0620034198026a2903002115200329039002210b0c010b420021150b200341186a20114200200d42ffffffff0f8342ffffffff0f200d428080808010541b22104200109804200341286a200f420020104200109804200341086a42004200200f4200109804200341386a200041084200200e2006427f20032903282003290320200329031084420052200341286a41086a290300220f200329031820032903087c7c2211200f547222051b22102010200656427f201120051b220f200456200f2004511b22051b22117d22062006200e5620012004200f20051b7d200e201154ad7d220420015620042001511b22071b22064200200420071b22041083022003280238210702402006200b20147c2211542004201520127c2011200b54ad7c220b542004200b511b22130d0020070d0020050d00410221052002450d1420034190026a20002010200f41081085022003280290024101460d072003200341a0026a290300220b3703b801200320034190026a41086a29030022013703b00120034190026a200010d80120032d009002220241024622050d06410020034190026a20051b22052d00000d062005200c37031820052005290308220c20017d370308200541106a22052005290300200b7d200c200154ad7d370300411710262205450d082005410f6a41002900abcd42370000200541086a41002900a4cd423700002005410029009ccd4237000020054117413710272205450d09200520002900003700172005412f6a200041186a290000370000200541276a200041106a2900003700002005411f6a200041086a29000037000020034190036a41186a2200420037030020034190036a41106a2207420037030020034190036a41086a2208420037030020034200370390032005413720034190036a1002200341f0026a41186a2000290300370300200341f0026a41106a2007290300370300200341f0026a41086a200829030037030020032003290390033703f00220034120360294032003200341f0026a3602900320034190026a20034190036a10b30220051023024020020d00200341c4026a280200450d00200341c0026a28020010230b2003200341b0016a3602900220034190026a10de014102210520090d150c160b0240024020130d0020070d0020034190026a20002010200f4108108502410121052003280290024101460d0b2003200341a0026a2903003703c801200320034190026a41086a2903003703c0012003200341c0016a3602900320034190036a10de01200e2011542001200b542001200b511b450d010c150b024002400240200e2011542001200b542001200b511b450d00200341f0016a20004200420010dc01200341f8016a210020032903f0014200510d01200320003602900220034190026a10de014101210520090d180c190b200341d0016a20002011200b10dc01200341d8016a210520032903d0014200510d01200320053602900220034190026a10de010c020b200320003602900220034190026a107b4101210520090d160c170b200320053602900220034190026a107b0b2003410036029002200a200820034190026a101321162003280290022202417f460d0a20034190026a41186a20034190016a41186a29030037030020034190026a41106a20034190016a41106a29030037030020034190026a41086a20034190016a41086a29030037030020032003290390013703900220034100360298032003420137039003200320023602f002200341f0026a20034190036a1041024002400240200328029403220720032802980322056b20024f0d00200520026a22132005490d1320074101742217201320132017491b22174100480d132007450d012003280290032007201710272213450d020c0e0b200328029003221320056a201620021094041a200520026a2205450d0e0c0f0b2017102622130d0c0b20174101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41b8ccc20041351021000b41a2cac30041f10020032802940220034190026a41086a28020010c902000b41174101102a000b41374101102a000b4193cbc300412b20032802940220034190026a41086a28020010c902000b41f8ffc40041381021000b2003201736029403200320133602900320172107201320056a201620021094041a200520026a22050d010b4101211720070d010c020b20054100480d02200510262217450d032017201320051094041a2007450d010b201310230b20054101742207200541206a221320132007491b22184100480d00024002402005450d0020172005201810272207450d010c040b2018102622070d030b20184101102a000b101e000b20054101102a000b200720056a2205200329039002370000200541186a20034190026a41186a290300370000200541106a20034190026a41106a290300370000200541086a20034190026a41086a29030037000020034190036a41186a2205420037030020034190036a41106a2217420037030020034190036a41086a2218420037030020034200370390032007201320034190036a1002200341f0026a41186a22132005290300370300200341f0026a41106a22052017290300370300200341f0026a41086a2217201829030037030020032003290390033703f00220071023200341a9026a2013290300370000200341a1026a200529030037000020034199026a201729030037000041012105200341013a009002200320032903f00237009102200020034190026a10dd01200a2008100d2002450d00201610230b2009450d010b200a1023200341b0036a240020050f0b200341b0036a240020050bc46309077f017e147f017e0d7f037e047f027e047f23004190046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2204410c4b0d000240024020040e0d002a05080c0b0607040a030901000b200141086a29030020022d000020022d000110ea0221044124210541012106410121070c460b200141086a280200210820012802042104200341e0026a41086a2001411c6a290200370300200341e0026a410d6a200141216a2900003700002003200141146a2902003703e002410121092002411a6a290100210a200241196a2d0000210b200241186a2d0000210c200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002106200241116a2d00002107200241106a2d000021102002410e6a2f010021112002410d6a2d000021122002410c6a2d000021132002410a6a2f01002114200241096a2d00002115200241086a2d00002116200241066a2f01002117200241056a2d00002118200241046a2d00002119200241026a2f0100211a20022d0001210520022d0000210220044101460d0b20044102470d2a200141106a280200211b2001410c6a280200211c200341c0036a410d6a200341e0026a410d6a290000370000200341c0036a41086a200341e0026a41086a290300370300200320032903e0023703c0034101210941db94c30021044100211d412a211e200241ff01710d1541002102200541ff01714101470d1620174108742018722016411874722104410021092015211e2014211d201321020c160b200141086a2802002208417f6a220441044b0d2a200141106a290300210a2001410c6a280200211020022d0001210520022d00002102024020040e050014121311000b200aa72108200241ff01710d1841012107200541ff01714101470d18412a210520080d330c340b200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341306a200341c8006a20034198026a10fc02200328023421052003280230210441012106410121070c430b418f94c3002104412421054101210620022d00000d0920022d000141ff01714102470d09200141086a290300210a4200211f20034180046a41086a2202420037030020034200370380044188a4c100411020034180046a100020034180036a41086a2204200229030037030020032003290380043703800320034180036a411041a886c500410041001001417f470d2920024200370300200342003703800441af98c300410d20034180046a100020042002290300370300200320032903800437038003024020034180036a411041a886c500410041001001417f460d002003420037034820034180036a4110200341c8006a41084100100141016a41084d0d272003290348211f0b201f200a540d2a20034180046a41086a2202420037030020034200370380044188a4c100411020034180046a100020034180036a41086a20022903003703002003200329038004370380032003200a37034820034180036a4110200341c8006a4108100441002104410121070c420b200341c8006a200141086a41c8001094041a20034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341086a200341c8006a20034198026a109902200328020c21052003280208210441012106410121070c410b200341c8006a41386a200141c0006a290300370300200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341206a200341c8006a20034198026a109a0220032802242105200328022021044100210941012106410121074101210b4101210c0c430b20034198026a41206a200141246a29020037030020034198026a41186a2001411c6a29020037030020034198026a41106a200141146a29020037030020034198026a41086a2001410c6a2902003703002003200129020437039802200341c8006a41206a200241206a290200370300200341c8006a41186a200241186a290200370300200341c8006a41106a200241106a290200370300200341c8006a41086a200241086a29020037030020032002290200370348200341286a20034198026a200341c8006a10fd02200328022c2105200328022821044100210d41012106410121074101210b4101210c410121090c430b200141086a280200212020012802042121200341c8006a2001410c6a41c4001094041a2002411a6a290100211f200241196a2d0000210d200241186a2d0000210e200241166a2f0100210f200241156a2d00002114200241146a2d00002117200241126a2f01002118200241116a2d0000211e200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d00002127200241086a2d00002128200241066a2f01002129200241056a2d0000212a200241046a2d0000212b200241026a2f0100212c20022d0001210c20022d00002109200341f0016a20034184016a290200370300200341e8016a200341fc006a290200370300200341e0016a200341f4006a290200370300200341d8016a200341ec006a290200370300200341b8016a41186a200341e4006a290200370300200341b8016a41106a200341c8006a41146a290200370300200341b8016a41086a200341c8006a410c6a2902003703002003200329024c3703b80141012102412a21054100210841db94c300210420090d0841002109200c41ff01714101470d092029410874202a722028411874722104410021022025210820262109202721050c090b200341c8006a200141086a41e8001094041a20034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341386a200341c8006a20034198026a10ce02200328023c2105200328023821044100210841012106410121074101210b4101210c410121094101210d4101210e0c430b200141086a280200210c2001280204210d412a210541db94c300210420022d0000450d0441012108410021094100210b0c050b20034198026a41206a200141286a29030037030020034198026a41186a200141206a29030037030020034198026a41106a200141186a29030037030020034198026a41086a200141106a2903003703002003200141086a29030037039802200341c8006a41206a200241206a290200370300200341c8006a41186a200241186a290200370300200341c8006a41106a200241106a290200370300200341c8006a41086a200241086a29020037030020032002290200370348200341186a20034198026a200341c8006a1057200328021c2105200328021821044100210c41012106410121074101210b0c3d0b200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341106a200341c8006a20034198026a10830120032802142105200328021021044100210b41012106410121070c3b0b41db94c30021044100211d412a211e200241ff01710d0b41002102200541ff01714101470d0c20174108742018722016411874722104410021092015211e2014211d201321020c0c0b410121070c380b41012108410021094100210b20022d00014101470d002002410c6a2d000021092002410a6a2f0100210b200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021080b200b41ffff0371410874200941187472200541ff017172210502402008450d004100210e410121060240200c450d00200d10230b410121074101210b4101210c410121094101210d0c3c0b410121060240200c450d00200d10230b4100210e410121074101210b4101210c410121094101210d0c280b410021090b200941ffff0371410874200841187472200541ff017172210502402002450d002020450d340c330b2003201f370390022003200d3a008f022003200e3a008e022003200f3b018c02200320143a008b02200320173a008a02200320183b0188022003201e3a008702200320223a008602200320233b018402200320243a008302200320053600ff01200320043600fb012003202b3a00fa012003202c3b01f80120034198026a200341f8016a10fe02200341b8016a41206a2125200341b9026a212620034198026a4101722127410421244100211e41002117410021020c200b200a422088a72109200aa7210b200220057241ff0171450d0e02402009450d002009410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b4101211141002112200b450d2f0c2e0b200aa72108200220057241ff0171450d0e41b394c300210441282105410121074100210620080d2f0c320b200a422088a72109200aa7210b200220057241ff0171450d0e02402009450d00200941186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b4100211141012112200b0d2c0c2d0b41012107200220057241ff0171450d0e41b394c300210441282105410021060c300b410021020b201d41ffff0371410874201e41ff017172200241187472210520090d262003200a370398032003200b3a0097032003200c3a0096032003200d3b0194032003200e3a0093032003200f3a009203200320063b019003200320073a008f03200320103a008e03200320113b018c03200320123a008b0320032005360087032003200436008303200320193a0082032003201a3b01800320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801200341b8016a411041a886c500410041001001417f460d03200341e0006a4200370300200341c8006a41106a4200370300200341c8006a41086a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d172002411f4d0d1720034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2205200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092005290300370300200c200b29030037030020032003290398023703480c040b410021020b201d41ffff0371410874201e41ff017172200241187472210520090d05200320193a0082032003201a3b0180032003200a370398032003200b3a0097032003200c3a0096032003200d3b0194032003200e3a0093032003200f3a009203200320063b019003200320073a008f03200320103a008e03200320113b018c03200320123a008b032003200536008703200320043600830320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801200341b8016a411041a886c500410041001001417f460d03200341e0006a4200370300200341c8006a41106a4200370300200341d0006a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d162002411f4d0d1620034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2205200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092005290300370300200c200b29030037030020032003290398023703480c040b41db94c3002104412a2105410121074100210620080d280c2b0b200341e0006a4200370300200341c8006a41106a4200370300200341c8006a41086a4200370300200342003703480b024020034180036a200341c8006a4120109604450d0041e8cec3002104413121050c220b200341c8006a410d6a2202200341c0036a410d6a290000370000200341c8006a41086a2204200341c0036a41086a290300370300200320032903c003370348200841ff01714101470d08200341f8016a201c41067610870120032802f8012104200328028002201c413f7122024d0d0b200341c0016a200420024105746a220241136a290000370300200341c5016a200241186a2900003700002003200229000b3703b80120022f0000200241026a2d00004110747221052002280007211b2002280003211c4101210220032802fc01450d1d0c1c0b200341e0006a4200370300200341c8006a41106a4200370300200341d0006a4200370300200342003703480b20034180036a200341c8006a4120109604450d014199cfc3002104412221050b20081024200810230c1e0b200341c8006a200841f0001094041a41002104200341003b019802200341c0006a200341c8006a20034198026a10d20220032802402202450d0520022003280244100f410021020c060b02402009410c6c2202450d00201020026a21042010210203402002280200200241086a28020010032002410c6a22022004470d000b0b02402009450d002009410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b4101211141002112200b450d120c110b41f9c7c30041052010200a422088a71004412a21054101210720080d120c130b0240200941186c2202450d00201020026a21042010210203402002280200200241086a2802002002410c6a280200200241146a2802001004200241186a22022004470d000b0b02402009450d00200941186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b4100211141012112200b0d0f0c100b410810262202450d0c2002200a37000041efc7c300410a2002410810042002102341002106412a21050c120b200341b8016a410d6a2002290000370000200341b8016a41086a2004290300370300200320032903483703b801200841087621050c150b410121020b200320023a004a2003410b3b014841a886c5004100200341c8006a102c200810230c150b4100210220032802fc010d100c110b10ff02000b41d4aac10041331021000b200341dc006a41013602002003410136029c022003418898c400360298022003420137024c200341d497c400360248200320034198026a360258200341c8006a41d0cec3001061000b200341dc006a41013602002003410136029c022003418898c400360298022003420137024c200341d497c400360248200320034198026a360258200341c8006a41949bc3001061000b41b0a4c100104f000b41c4a5c100104f000b41d4aac10041331021000b41d4aac10041331021000b41084101102a000b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000104040b02400240201741014622020d0041a886c50021144100210420170d0141202104200341b8016a21140c010b41202104202521140b41012122410021180240024002400240024020032d0098024101470d0002400240024020020d0020170d014120210e202721184100212241202004470d030c020b4120210e202621184100212241202004460d010c020b4100210e41a886c50021184100212241002004470d010b024020182014460d002004210e2018201420041096040d010b201e2017470d03201e4101742202201e41016a220420042002491b2202ad420486221f422088a70d0a201fa722044100480d0a201e450d012024201e4104742004102722240d020c160b410e10262202450d0b200241066a41002900edcd44370000200241002900e7cd443700002002410e411c10272202450d0c2002201736000e200341e0036a41186a22054200370300200341e0036a41106a22084200370300200341e0036a41086a22094200370300200342003703e00320024112200341e0036a1002200341c0036a41186a2005290300370300200341c0036a41106a2008290300370300200341c0036a41086a2009290300370300200320032903e0033703c00302400240200341c0036a412041a886c500410041001001417f460d00200342203702e4032003200341c0036a3602e00320034180036a200341e0036a10a802200328028003220d450d11200329028403211f0c010b4200211f4104210d0b20021023410021020240201f422088222da72223450d00024020234101460d004100210220232105034002400240200d2005410176220920026a220c410c6c6a22082802002014200420082802082208200820044b1b109604220f450d00417f4101200f4100481b21080c010b4100417f410120082004491b20082004461b21080b2002200c20084101461b2102200520096b220541014b0d000b0b02400240200d2002410c6c6a22052802002014200420052802082205200520044b1b1096042208450d00417f410120084100481b21050c010b20052004460d08417f410120052004491b21050b20022005417f466a21020b024002402004450d00200410262209450d102009201420041094041a2002202da722054b0d0f0c010b410121092002202da722054b0d0e0b0240024002402005201fa7470d00200541016a22082005490d0c2005410174220c20082008200c491bad222e420c7e222f422088a70d0c202fa722084100480d0c2005450d01200d2005410c6c20081027220d0d020c130b201f212e0c010b20081026220d450d110b200d2002410c6c6a2208410c6a2008200520026b410c6c1095041a200820043602082008200436020420082009360200202e42ffffffff0f83222f202d42017c222e42208684212d0240024002400240024020220d00202ea7220f450d02410021020240200f4101460d0041002102200f2104034002400240200d2004410176220820026a2209410c6c6a22052802002018200e200528020822052005200e4b1b109604220c450d00417f4101200c4100481b21050c010b4100417f41012005200e491b2005200e461b21050b2002200920054101461b2102200420086b220441014b0d000b0b200d2002410c6c6a220428020022092018200e200428020822052005200e4b1b10960421082005200e470d0220080d022002200f4f0d192004280204210520042004410c6a200f2002417f736a410c6c1095041a202f201f4280808080708384212d20050d010b201e2017460d020c030b20091023201e2017460d010c020b41f5cdc400412a100f201e2017470d010b201e4101742202201e41016a220420042002491b2202ad420486221f422088a70d0a201fa722044100480d0a02400240201e450d002024201e4104742004102722240d010c140b200410262224450d130b2002211e0b202420174104746a2202200d36020420022017360200200241086a202d370200201741016a22174102490d1b0c030b200410262224450d140b2002211e0b202420174104746a4100360204201741016a22174102490d170b4104211120174104742202450d01202420026a21304110211d410e211b4106213141002115411c21324118211c4200210a41082106411221334201213442202135410c210b412021364174211241012116202421190c180b2019201d6a21180240201928020422220d002018211920182030470d1a0c010b201928020021042019290208211f201b10262202450d0d200220316a20152900edcd44370000200220152900e7cd443700002002201b203210272219450d0e2019200436000e200341e0036a201c6a2202200a370300200341e0036a201d6a2204200a370300200341e0036a20066a2205200a3703002003200a3703e00320192033200341e0036a1002200341c0036a201c6a2002290300370300200341c0036a201d6a2004290300370300200341c0036a20066a2005290300370300200320032903e0033703c00320034180036a20066a220d201536020020032034370380032003201f203588a722233602e0032023200b6c210c200341e0036a20034180036a104102400240024020230d002003280284032102200341c0036a20362003280280032209200d280200100420020d010c020b2022200c6a21142022210403402004280200210e2003200420066a28020022023602e003200341e0036a20034180036a104102400240024002402003280284032208200d28020022056b20024f0d00200520026a22092005490d0b2008201674220f20092009200f491b220f2015480d0b2008450d012003280280032008200f102722090d020c0c0b20032802800321090c020b200f10262209450d0a0b2003200f360284032003200936028003200f21080b200d200520026a220f360200200920056a200e20021094041a2004200b6a22042014470d000b200341c0036a20362009200f10042008450d010b200910230b2019102302402023450d002022210203400240200220116a280200450d00200228020010230b2002200b6a2102200c20126a220c0d000b0b0240201fa7450d00202210230b2018211920182030470d180b0240201e450d00202410230b200341e0026a41186a200341f8016a41186a290300370300200341e0026a41106a200341f8016a41106a290300370300200341e0026a41086a200341f8016a41086a290300370300200320032903f8013703e00220034180036a41386a200341b8016a41386a29030037030020034180036a41306a200341b8016a41306a29030037030020034180036a41286a200341b8016a41286a29030037030020034180036a41206a200341b8016a41206a29030037030020034180036a41186a200341b8016a41186a29030037030020034180036a41106a200341b8016a41106a29030037030020034180036a41086a200341b8016a41086a290300370300200320032903b80137038003411210262202450d10200241106a41002f00c4ad443b0000200241086a41002900bcad44370000200241002900b4ad4437000020024112413210272202450d11200220032903e0023700122002412a6a200341e0026a41186a290300370000200241226a200341e0026a41106a2903003700002002411a6a200341e0026a41086a290300370000200341e0036a41186a22044200370300200341e0036a41106a22054200370300200341e0036a41086a22084200370300200342003703e00320024132200341e0036a1002200341c0036a41186a2004290300370300200341c0036a41106a2005290300370300200341c0036a41086a2008290300370300200320032903e0033703c003412010262204450d122004200329038003370000200441186a20034180036a41186a290300370000200441106a20034180036a41106a290300370000200441086a20034180036a41086a2903003700002004412041c00010272204450d13200420032903a003370020200441386a20034180036a41386a290300370000200441306a20034180036a41306a290300370000200441286a20034180036a41286a290300370000200341c0036a4120200441c00010042004102320021023200341013a00e00320034180046a41086a22024200370300200342003703800441dfbac400410f20034180046a100020034180036a41086a200229030037030020032003290380043703800320034180036a4110200341e0036a410110044100210402402020450d00202110230b0c2d0b02402023450d00201f422088a7410c6c2104200d210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b0240201fa7450d00200d10230b2017450d0141042110202420174104746a213741102138410c210741082139417421132024211a410221020c190b201a220520386a211a024020052802042202450d000240200520076a2802002204450d00200420076c210403400240200220106a280200450d00200228020010230b200220076a2102200420136a22040d000b0b200520396a280200450d00200520106a28020010230b201a2037470d170b0240201e450d00202410230b41d1cdc40021044116210520200d290c2a0b101e000b200f4101102a000b410e4101102a000b411c4101102a000b4180e4c400104f000b20044101102a000b41d4aac10041331021000b20084104102a000b20044104102a000b410e4101102a000b411c4101102a000b41fcc3c200104f000b20044104102a000b41124101102a000b41324101102a000b41204101102a000b41c0004101102a000b410021020c050b410021020c040b410121020c030b410121020c020b410121020c010b410221020c000b0b201010230b412a21054101210702402008417f6a220241044b0d00410021064101210b4101210c410121094101210d4101210e410121084101210f41002104024002400240024020020e05001d020301000b4100210641000d06200aa70d040c060b410021062012450d050240200a422088a72202450d002002410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b200aa70d030c040b4100210641000d04200aa70d020c040b410021062011450d030240200a422088a72202450d00200241186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b200aa70d010c020b0240200a422088a72202450d002002410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b200aa7450d010b201010230b410021060b4101210b4101210c410121094101210d4101210e0b410121084101210f4100210420012802002202410c4d0d150c160b200410230b20020d00410121024115211b41d9cac400211c0c010b200341c8006a410d6a200341b8016a410d6a290000370000200341c8006a41086a200341b8016a41086a290300370300200320032903b801370348410021020b20034198026a41106a200341c8006a41106a29030037030020034198026a41086a2204200341c8006a41086a290300370300200320032903483703980202402002450d00201b2105201c21040c020b200341e0036a410d6a20034198026a410d6a290000370000200341e0036a41086a200429030037030020032003290398023703e00320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b80102400240200341b8016a411041a886c500410041001001417f460d00200341e0006a4200370300200341c8006a41106a4200370300200341d0006a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d042002411f4d0d0420034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2208200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092008290300370300200c200b29030037030020032003290398023703480c010b200341e0006a4200370300200341d8006a4200370300200341d0006a4200370300200342003703480b20034198026a41186a2202200341c8006a41186a29030037030020034198026a41106a2204200341c8006a41106a29030037030020034198026a41086a2209200341c8006a41086a22082903003703002003200329034837039802200341d2006a2009290300370100200341da006a2004290300370100200341e2006a20022903003701002003418b023b0148200320032903980237014a4100210441a886c5004100200341c8006a102c200341c8006a410d6a2209200341e0036a410d6a2900003700002008200341e0036a41086a290300370300200320032903e00337034820034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801412010262202450d03200220053b00002002201b3600072002201c3600032002200329034837000b200241026a20054110763a0000200241136a2008290300370000200241186a2009290000370000200341b8016a4110200241201004200210230b0b4100210f41012106410121074101210b4101210c410121094101210d4101210e4101210820012802002202410c4d0d0f0c100b41d4aac10041331021000b41204101102a000b201010230b41b394c300210441282105410121074100210602402008417f6a220241044b0d004101210b4101210c410121094101210d4101210e410121084101210f024002400240024020020e05000f020301000b200aa70d040c070b2012450d060240200a422088a72202450d002002410c6c21082010210203400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200aa70d030c060b4100210641000d05200aa70d020c050b2011450d040240200a422088a72202450d00200241186c21082010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200841686a22080d000b0b200aa70d010c040b0240200a422088a72202450d002002410c6c21082010210203400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200aa7450d030b201010230c020b202110230b41002107410121060b4101210b0b4101210c0b410121090b4101210d0b4101210e0b410121080b4101210f0b20012802002202410c4b0d010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0d02151515000507040615011503020b2007450d14200141086a280200450d14200128020410230c140b200e450d13200141086a280200450d13200128020410230c130b2006450d12200141086a280200220241044b0d0c024020020e051300130c0b130b200141106a280200450d122001410c6a28020010230c120b2008450d11200141086a2d0000220241054b0d0d024020020e061212000f0d12120b200141106a280200450d112001410c6a28020010230c110b2009450d10200141086a28020022024102460d0320024101470d10200141106a280200450d102001410c6a28020010230c100b200b450d0f200141086a2d00002202410c4b0d0d20024106470d0f200141106a280200450d0f2001410c6a28020010230c0f0b200d450d0e20012d000422024102460d0220024101470d0e200141086a22022802001024200228020010230c0e0b200c450d0d200141086a2d0000417f6a220241074b0d0d024020020e08000e0e0e040e0305000b2001410c6a22022802001024200228020010230c0d0b200141106a280200450d0c2001410c6a28020010230c0c0b2001410c6a22022802001024200228020010230c0b0b2001410c6a22022802001024200228020010230c0a0b2001410c6a22022802001024200228020010230c090b2001410c6a22022802001024200228020010230c080b0240200141146a2802002208450d002001410c6a2802002102200841186c210803400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200841686a22080d000b0b200141106a280200450d072001410c6a28020010230c070b200141106a280200450d062001410c6a28020010230c060b0240200141146a2802002208450d002001410c6a28020021022008410c6c210803400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200141106a280200450d052001410c6a28020010230c050b200141306a280200450d042001412c6a28020010230c040b200141d0006a280200450d03200141cc006a28020010230c030b200141346a280200450d02200141306a28020010230c020b200141106a280200450d012001410c6a28020010230c010b200f450d0020012802044101470d00200141086a22022802001024200228020010230b200020053602042000200436020020034190046a24000ba20b02037f017e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022024101460d00024020024102460d0020024103470d02200141046a280200200141086a2802002202470d05200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0b20012802002002200410272203450d0c0c150b200141046a280200200141086a2802002202470d02200241016a22032002490d1620024101742204200320032004491b22044100480d162002450d0620012802002002200410272203450d070c120b200141046a280200200141086a2802002202470d02200241016a22032002490d1520024101742204200320032004491b22044100480d152002450d0720012802002002200410272203450d080c0f0b200141046a280200200141086a2802002202470d03200241016a22032002490d1420024101742204200320032004491b22044100480d142002450d0a20012802002002200410272203450d0b0c0c0b200128020021030c100b200128020021030c0d0b200128020021030c100b200128020021030c090b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d090b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0b20024101742200200420042000491b22004100480d0b2002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000200041086a290300210502400240024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0920024101742200200320032000491b22004100480d092002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0720024101742200200420042000491b22004100480d072002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a0000200041086a2903002105024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0320024101742200200320032000491b22004100480d032002450d0120012802002002200010272202450d020c040b200128020021020c040b2000102622020d020b20004101102a000b101e000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000bbe0202047f017e230041c0006b22012400200141306a41086a2202420037030020014200370330418d9dc3004115200141306a1000200141086a41086a20022903003703002001200129033037030802400240200141086a411041a886c500410041001001417f460d002001200141086a3602182001411036021c200141003a00302001200141086a4110200141306a41014100100141016a220241014b36022020024102490d0120012d00302102200141306a200141186a102820012802302203450d012001412a6a41026a22042001412d6a41026a2d00003a0000200120012f002d3b012a20012902342105200020023a00002000200537020820002003360204200020012f012a3b0001200041036a20042d00003a0000200141c0006a24000f0b20004100360204200141c0006a24000f0b41d4aac10041331021000bf70605017f017e037f027e017f230041d0006b2201240042002102200141286a41086a220342003703002001420037032841fd98c300410d200141286a1000200141086a41086a20032903003703002001200129032837030841002103024002400240024002400240200141086a411041a886c500410041001001417f460d002001421037021c2001200141086a360218200141286a200141186a10a90220012802282204450d02200129022c2202422088a721032002a721050c010b41042104410021050b200141286a41206a200041206a280200360200200141286a41186a200041186a290200370300200141286a41106a200041106a290200370300200141286a41086a200041086a2902003703002001200029020037032820032005470d0320032002a7470d020240200341016a22002003490d0020034101742205200020002005491bad220642247e2207422088a70d002007a722004100480d00024002402003450d002004200341246c200010272204450d010c040b2000102622040d030b20004104102a000b101e000b41d4aac10041331021000b20024280808080708320068421020b2002422088a721030b2004200341246c22056a22002001290328370200200041206a200141286a41206a280200360200200041186a200141286a41186a290300370200200041106a200141286a41106a290300370200200041086a200141286a41086a22002903003702002001200242ffffffff0f83200341016a2203ad4220868437021c20012004360218200042003703002001420037032841fd98c300410d200141286a1000200141086a41086a2000290300370300200120012903283703082001411036022c2001200141086a360228200141186a200141286a10d6022002a7210802402003450d00200541246a21002004210303400240024020032d0000220541034b0d0002400240024020050e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a21032000415c6a22000d040c050b2003410c6a280200450d02200341086a2802001023200341246a21032000415c6a22000d030c040b2003410c6a280200450d01200341086a2802001023200341246a21032000415c6a22000d020c030b200341086a280200450d00200341046a28020010230b200341246a21032000415c6a22000d000b0b02402008450d00200410230b200141d0006a24000b8803010a7f230041206b22022400200241003602082002420137030020002802002103200220002802082200360210200241106a20021041024002400240024002402000450d00200041246c2104200241086a22052802002100200228020421060340200241106a2003108f03200228021021070240024002400240200620006b200241106a41086a28020022084f0d00200020086a22092000490d062006410174220a20092009200a491b220b4100480d062006450d0120022802002006200b1027220a0d020c070b200020086a21092002280200210a0c020b200b1026220a450d050b2002200b3602042002200a360200200b21060b20052009360200200a20006a200720081094041a02402002280214450d00200710230b200341246a2103200921002004415c6a22040d000b20012802002001280204200a200910042006450d040c030b20022802042100200128020020012802042002280200220a200241086a280200100420000d020c030b101e000b200b4101102a000b200a10230b200241206a24000bec0203027f017e027f230041c0006b2201240002400240411310262202450d002002410f6a41002800a99943360000200241086a41002900a299433700002002410029009a994337000020024113413310272202450d01200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a29000037000042002103200141206a41186a22004200370300200141206a41106a22044200370300200141206a41086a220542003703002001420037032020024133200141206a1002200141186a2000290300370300200141106a2004290300370300200141086a200529030037030020012001290320370300024002402001412041a886c500410041001001417f460d002001420037032020014120200141206a41084100100141016a41084d0d01200129032021030b20021023200141c0006a240020030f0b41d4aac10041331021000b41134101102a000b41334101102a000b800201017f02400240024020002d0000417b6a220141054b0d00024002400240024020010e06000104020403000b200041086a2d00004101470d03200041146a280200450d03200041106a2802001023200041fc006a2802000d040c050b200041046a2d00004103470d0202402000410c6a280200450d00200041086a28020010230b200041186a280200450d02200041146a2802001023200041fc006a2802000d030c040b200041086a280200450d01200041046a2802001023200041fc006a2802000d020c030b200041086a2d00004105490d00200041306a280200450d002000412c6a28020010230b200041fc006a280200450d010b200028027810230b0bec0301027f230041e0006b22032400200341003a0005024002402000413f4b0d00200320004102743a0000410121040c010b02402000418080014f0d00200320004106763a000141022104200341013a0005200320004102744101723a00000c010b024020004180808080044f0d00200341033a0005200320004106763a000120032000410e763a0002200320004116763a0003200320004102744102723a0000410421040c010b200341043a0005200341033a0000200320003a0001200320004108763a0002200320004110763a0003200320004118763a0004410521040b200320043a0005024002402001280200220028020822012002490d0020002802002100200320023602082003200436020c20042002470d012000200320021094041a200341003a0005200341e0006a24000f0b20022001108c01000b2003200341086a36024020032003410c6a360244200341c8006a41146a4100360200200341286a41146a4103360200200341346a4104360200200341106a41146a4103360200200341a886c5003602582003420137024c200341a881c5003602482003410436022c20034203370214200341d480c5003602102003200341c8006a3602382003200341c4006a3602302003200341c0006a3602282003200341286a360220200341106a41e481c5001061000bda0601077f230041106b220224000240024002400240024002400240024002400240024002400240024020002802704101470d00200141046a280200200141086a2802002203470d01200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d0320012802002003200510272204450d040c090b200141046a280200200141086a2802002203470d01200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041f4006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0820044101742203200520052003491b22034100480d082004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a20063600000c020b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00000b2000200110dd0220002802782103200220004180016a280200220036020c2002410c6a2001104102402000450d0020004105742106200141086a2104200141046a21070340024002400240024020072802002205200428020022006b41204f0d00200041206a22082000490d0620054101742200200820082000491b22004100480d062005450d01200128020020052000102722050d020c070b200128020021050c020b200010262205450d050b2001200536020020072000360200200428020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000b0b200241106a24000f0b101e000b20004101102a000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10e2032100200241206a240020000bc80201037f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110cc02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000bfecb0103077f027e027f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a2203410a4b0d00024020030e0b00070405020809060b030a000b200141046a280200200141086a2802002203470d11200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d2320012802002003200510272204450d240c4a0b200141046a280200200141086a2802002203470d0a200341016a22042003490d4b20034101742205200420042005491b22054100480d4b2003450d1620012802002003200510272204450d170c470b200141046a2205280200200141086a22042802002203470d0a200341016a22062003490d4a20034101742207200620062007491b22074100480d4a2003450d1720012802002003200710272206450d180c420b200141046a280200200141086a2802002203470d0a200341016a22042003490d3e20034101742205200420042005491b22054100480d3e2003450d1820012802002003200510272204450d190c3c0b200141046a280200200141086a2802002203470d0a200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d1920012802002003200510272204450d1a0c390b200141046a280200200141086a2802002203470d0a200341016a22042003490d4720034101742205200420042005491b22054100480d472003450d1a20012802002003200510272204450d1b0c360b200141046a280200200141086a2802002203470d0a200341016a22042003490d3b20034101742205200420042005491b22054100480d3b2003450d1b20012802002003200510272204450d1c0c330b200141046a280200200141086a2802002203470d0b200341016a22042003490d4520034101742205200420042005491b22054100480d452003450d1e20012802002003200510272204450d1f0c300b200141046a280200200141086a2802002203470d0b200341016a22042003490d4420034101742205200420042005491b22054100480d442003450d1f20012802002003200510272204450d200c2d0b200141046a2205280200200141086a22032802002204470d0b200441016a22062004490d4320044101742207200620062007491b22074100480d432004450d2020012802002004200710272206450d210c2a0b200141046a280200200141086a2802002203470d0b200341016a22042003490d3720034101742205200420042005491b22054100480d372003450d2120012802002003200510272204450d220c270b200141046a280200200141086a2802002203470d0b200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d2220012802002003200510272204450d230c240b200128020021040c3d0b200128020021060c380b200128020021040c320b200128020021040c2f0b200128020021040c2c0b200128020021040c290b200128020021040c390b200128020021040c250b200128020021040c220b200128020021060c1f0b200128020021040c1c0b200128020021040c190b2005102622040d300b20054101102a000b2007102622060d2a0b20074101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d170b20054101102a000b2005102622040d260b20054101102a000b2005102622040d110b20054101102a000b2005102622040d0d0b20054101102a000b2007102622060d090b20074101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2d20034101742205200420042005491b22054100480d2d2003450d0f20012802002003200510272204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0a20012802002003200510272204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000412c6a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320093700082003200a37000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1b20044101742203200020002003491b22034100480d1b2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1920044101742203200020002003491b22034100480d192004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1720044101742203200520052003491b22034100480d172004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1520044101742203200020002003491b22034100480d152004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a0000200041026a2104200141046a2802002106200528020021030240024002400240024002400240024002400240024020002d00014101470d0020062003470d01200341016a22002003490d1920034101742205200020002005491b22054100480d192003450d0320012802002003200510272200450d040c090b20062003470d01200341016a22002003490d1820034101742205200020002005491b22054100480d182003450d0420012802002003200510272200450d050c060b200128020021000c080b200128020021000c050b2005102622000d050b20054101102a000b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22002003490d1520034101742205200020002005491b22054100480d152003450d0120012802002003200510272200450d020c030b200128020021000c030b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a20042d00003a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a000002400240024002400240200141046a2802002200200528020022036b41204f0d00200341206a22052003490d1320004101742203200520052003491b22034100480d132000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200020036a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a29000037000020012004290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41073a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d0000417f6a220441044b0d000240024002400240024020040e050004020301000b200528020020032802002204470d08200441016a22062004490d2f20044101742207200620062007491b22074100480d2f2004450d1120012802002004200710272206450d120c210b200528020020032802002204470d04200441016a22062004490d2e20044101742207200620062007491b22074100480d2e2004450d0a20012802002004200710272206450d0b0c1e0b200528020020032802002204470d04200441016a22062004490d2d20044101742207200620062007491b22074100480d2d2004450d0b20012802002004200710272206450d0c0c1b0b200528020020032802002204470d04200441016a22062004490d2c20044101742207200620062007491b22074100480d2c2004450d0c20012802002004200710272206450d0d0c180b200528020020032802002204470d05200441016a22062004490d2b20044101742207200620062007491b22074100480d2b2004450d0f20012802002004200710272206450d100c150b200528020020032802002204470d05200441016a22062004490d3520044101742207200620062007491b22074100480d352004450d1020012802002004200710272206450d110c120b200128020021060c1a0b200128020021060c170b200128020021060c140b200128020021060c190b200128020021060c100b200128020021060c0d0b2007102622060d130b20074101102a000b2007102622060d0f0b20074101102a000b2007102622060d0b0b20074101102a000b2007102622060d0f0b20074101102a000b2007102622060d050b20074101102a000b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41003a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1b20064101742204200720072004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a29000037000020042006290000370000200041c8006a28020021070240024002400240024020052802002206200328020022046b41044f0d00200441046a22082004490d1b20064101742204200820082004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441046a360200200620046a20073600000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1b20064101742204200720072004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041256a220641186a290000370000200441106a200641106a290000370000200441086a200641086a29000037000020042006290000370000200041cc006a28020021060240024002400240024020052802002200200328020022046b41044f0d00200441046a22052004490d1b20004101742204200520052004491b22044100480d1b2000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b2003200441046a360200200020046a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41023a00000240024002400240024020052802002205200328020022046b41204f0d00200441206a22062004490d1920054101742204200620062004491b22044100480d192005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b2003200441206a360200200520046a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41043a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1720064101742204200720072004491b22044100480d172006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22052004490d1720044101742206200520052006491b22064100480d172004450d0120012802002004200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a200041256a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41033a00000240024002400240024020052802002205200328020022046b41204f0d00200441206a22062004490d1520054101742204200620062004491b22044100480d152005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b2003200441206a360200200520046a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41053a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1320064101742204200720072004491b22044100480d132006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22052004490d1320044101742206200520052006491b22064100480d132004450d0120012802002004200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a200041256a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41013a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1120064101742204200720072004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a290000370000200420062900003700000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1120064101742204200720072004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041256a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22062004490d1120044101742207200620062007491b22074100480d112004450d0120012802002004200710272206450d020c030b200128020021060c030b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a200041c5006a2d00003a0000200041c8006a28020021070240024002400240024020052802002206200328020022046b41044f0d00200441046a22082004490d1120064101742204200820082004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441046a360200200620046a2007360000200041cc006a28020021060240024002400240024020052802002200200328020022046b41044f0d00200441046a22052004490d1120004101742204200520052004491b22044100480d112000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b2003200441046a360200200020046a2006360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d0b20012802002003200510272204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0620012802002003200510272204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0720012802002003200510272204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0a20012802002003200510272204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d090b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041086a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041086a28020021032002200041106a280200220436020c2002410c6a200110410240024002402004450d0020044105742107200141046a21080340024002400240024020082802002206200528020022046b41204f0d00200441206a220b2004490d1d20064101742204200b200b2004491b22044100480d1d2006450d01200128020020062004102722060d020c060b200128020021060c020b200410262206450d040b2001200636020020082004360200200528020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200041146a280200210320022000411c6a280200220436020c2002410c6a200110412004450d1120044105742106200141086a2100200141046a21070340024002400240024020072802002205200028020022046b41204f0d00200441206a22082004490d1c20054101742204200820082004491b22044100480d1c2005450d01200128020020052004102722050d020c060b200128020021050c020b200410262205450d040b2001200536020020072004360200200028020021040b2000200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200641606a22060d000c120b0b20044101102a000b20044101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00000240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034102460d00024020034101460d0020030d1e200141046a280200200141086a2802002203470d04200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0920012802002003200510272204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0420012802002003200510272204450d050c0c0b200141046a28020020052802002203470d01200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0520012802002003200510272204450d060c090b200128020021040c0b0b200128020021040c080b200128020021040c0b0b2005102622040d070b20054101102a000b2005102622040d030b20054101102a000b2005102622040d050b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002109200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320093700082003200a370000200041e8006a2903002109200041e0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1c20044101742203200020002003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1a20044101742203200520052003491b22034100480d1a2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1820044101742203200520052003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1820044101742203200020002003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22044100480d0b2003450d0120012802002003200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200041046a280200210320022000410c6a280200220036020c2002410c6a200110412000450d0b2003200041286c6a2108200141046a2105024002400340024002400240024020052802002206200428020022006b41204f0d00200041206a22072000490d0d20064101742200200720072000491b22004100480d0d2006450d01200128020020062000102722060d020c050b200128020021060c020b200010262206450d030b2001200636020020052000360200200428020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2903002109024002400240024020052802002206200428020022006b41084f0d00200041086a22072000490d0d20064101742200200720072000491b22004100480d0d2006450d01200128020020062000102722060d020c060b200128020021060c020b200010262206450d040b2001200636020020052000360200200428020021000b2004200041086a360200200620006a20093700002008200341286a2203470d000c0e0b0b20004101102a000b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d0020034102470d01200141046a280200200141086a2802002203470d03200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0720012802002003200510272204450d080c0f0b200141046a28020020052802002203470d01200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0420012802002003200510272204450d050c0c0b200141046a280200200141086a2802002203470d02200341016a22042003490d1e20034101742205200420042005491b22054100480d1e2003450d0720012802002003200510272204450d080c090b200128020021040c0b0b200128020021040c0c0b200128020021040c070b2005102622040d070b20054101102a000b2005102622040d070b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1820044101742203200020002003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1620044101742203200520052003491b22034100480d162004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1420044101742203200520052003491b22034100480d142004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1420044101742203200020002003491b22034100480d142004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041046a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1220044101742203200520052003491b22034100480d122004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341044b0d000240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d08200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d1120012802002003200510272204450d120c210b200141046a280200200141086a2802002203470d04200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0a20012802002003200510272204450d0b0c1e0b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0b20012802002003200510272204450d0c0c1b0b200141046a280200200141086a2802002203470d04200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0c20012802002003200510272204450d0d0c180b200141046a280200200141086a2802002203470d05200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0f20012802002003200510272204450d100c150b200141046a28020020052802002203470d05200341016a22042003490d1e20034101742205200420042005491b22054100480d1e2003450d1020012802002003200510272204450d110c120b200128020021040c1a0b200128020021040c170b200128020021040c140b200128020021040c190b200128020021040c100b200128020021040c0d0b2005102622040d130b20054101102a000b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d0f0b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002109200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d0f20044101742203200020002003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0d20044101742203200520052003491b22034100480d0d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0b20044101742203200520052003491b22034100480d0b2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041296a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0920044101742203200520052003491b22034100480d092004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0720044101742203200520052003491b22034100480d072004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a28020021062002200041346a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002200200528020022046b20034f0d00200420036a22052004490d0720004101742204200520052004491b22044100480d072000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200020046a200620031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310272204450d020c040b200128020021040c040b2003102622040d020b20034101102a000b101e000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341094b0d0002400240024002400240024002400240024020030e0a00060304010708050a02000b200528020020042802002203470d0f200341016a22062003490d4720034101742207200620062007491b22074100480d472003450d1f20012802002003200710272206450d200c3f0b200528020020042802002203470d09200341016a22062003490d4620034101742207200620062007491b22074100480d462003450d1420012802002003200710272206450d150c3c0b200528020020042802002203470d09200341016a22062003490d4520034101742207200620062007491b22074100480d452003450d1520012802002003200710272206450d160c390b200528020020042802002203470d09200341016a22062003490d4420034101742207200620062007491b22074100480d442003450d1620012802002003200710272206450d170c360b200528020020042802002203470d09200341016a22062003490d4320034101742207200620062007491b22074100480d432003450d1720012802002003200710272206450d180c330b200528020020042802002203470d09200341016a22062003490d4220034101742207200620062007491b22074100480d422003450d1820012802002003200710272206450d190c300b200528020020042802002203470d0a200341016a22002003490d4120034101742205200020002005491b22054100480d412003450d1b20012802002003200510272200450d1c0c2d0b200528020020042802002203470d0a200341016a22062003490d4020034101742207200620062007491b22074100480d402003450d1c20012802002003200710272206450d1d0c2a0b200528020020042802002203470d0a200341016a22062003490d3f20034101742207200620062007491b22074100480d3f2003450d1d20012802002003200710272206450d1e0c270b200528020020042802002203470d0a200341016a22062003490d3e20034101742207200620062007491b22074100480d3e2003450d1e20012802002003200710272206450d1f0c240b200528020020042802002203470d0a200341016a22062003490d3d20034101742207200620062007491b22074100480d3d2003450d1f20012802002003200710272206450d200c210b200128020021060c330b200128020021060c300b200128020021060c2d0b200128020021060c2a0b200128020021060c270b200128020021060c300b200128020021000c230b200128020021060c200b200128020021060c1d0b200128020021060c1a0b200128020021060c170b2007102622060d270b20074101102a000b2007102622060d230b20074101102a000b2007102622060d1f0b20074101102a000b2007102622060d1b0b20074101102a000b2007102622060d170b20074101102a000b2007102622060d1f0b20074101102a000b2005102622000d110b20054101102a000b2007102622060d0d0b20074101102a000b2007102622060d090b20074101102a000b2007102622060d050b20074101102a000b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41093a00000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1f20054101742203200620062003491b22034100480d1f2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41003a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1d20064101742203200820082003491b22034100480d1d2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041186a2903002109200041106a290300210a0240024002400240024020052802002200200428020022036b41104f0d00200341106a22052003490d1d20004101742203200520052003491b22034100480d1d2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341106a360200200020036a220120093700082001200a370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1b20064101742203200820082003491b22034100480d1b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240200528020020042802002203470d00200341016a22052003490d1b20034101742206200520052006491b22064100480d1b2003450d0120012802002003200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41063a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1920004101742203200520052003491b22034100480d192000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41083a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d1520064101742203200720072003491b22034100480d152006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1520054101742203200620062003491b22034100480d152005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41043a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1320004101742203200520052003491b22034100480d132000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41033a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1120064101742203200820082003491b22034100480d112006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200528020020042802002203470d03200341016a22002003490d1d20034101742205200020002005491b22054100480d1d2003450d0720012802002003200510272200450d080c0f0b200528020020042802002203470d01200341016a22002003490d1c20034101742205200020002005491b22054100480d1c2003450d0420012802002003200510272200450d050c0c0b200528020020042802002203470d02200341016a22002003490d1b20034101742205200020002005491b22054100480d1b2003450d0720012802002003200510272200450d080c090b200128020021000c0b0b200128020021000c0c0b200128020021000c070b2005102622000d070b20054101102a000b2005102622000d070b20054101102a000b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41003a00000c0a0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41013a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a410a3a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d0f20064101742203200720072003491b22034100480d0f2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d0f20064101742203200720072003491b22034100480d0f2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041296a220641186a290000370000200341106a200641106a290000370000200341086a200641086a29000037000020032006290000370000200041d0006a29030021090240024002400240024020052802002200200428020022036b41084f0d00200341086a22052003490d0f20004101742203200520052003491b22034100480d0f2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341086a360200200020036a2009370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d0d20004101742203200520052003491b22034100480d0d2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41013a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d0b20064101742203200820082003491b22034100480d0b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041286a2903002109200041206a290300210a0240024002400240024020052802002206200428020022036b41104f0d00200341106a22072003490d0b20064101742203200720072003491b22034100480d0b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200620036a220320093700082003200a370000200041106a28020021032002200041186a280200220036020c2002410c6a200110412000450d0020004105742107200141046a210c0340024002400240024020052802002206200428020022006b41204f0d00200041206a22082000490d0b20064101742200200820082000491b22004100480d0b2006450d01200128020020062000102722060d020c060b200128020021060c020b200010262206450d040b20012006360200200c2000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000b0b200241106a24000f0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a28020021042005280200210302400240024002400240024002400240024002400240200041016a2d00004101470d0020042003470d01200341016a22042003490d0d20034101742200200420042000491b22004100480d0d2003450d0320012802002003200010272204450d040c090b20042003470d01200341016a22042003490d0c20034101742200200420042000491b22004100480d0c2003450d0420012802002003200010272204450d050c060b200128020021040c080b200128020021040c050b2000102622040d050b20004101102a000b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a2802002100024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310272204450d020c040b200128020021040c040b2003102622040d020b20034101102a000b101e000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000b130020004105360204200041b89ec3003602000b130020004106360204200041baa3c3003602000bce0101047f230041206b22002400024002400240418595c300411041a886c500410041001001417f460d002000410036021041012101418595c3004110200041106a41044100100141016a41044d0d0220002802102102418595c300411010030c010b410021010b200041106a41086a220342003703002000420037031041a895c3004115200041106a1000200041086a20032903003703002000200029031037030020002002410020011b36021020004110200041106a41041004200041206a24000f0b41d4aac10041331021000b13002000410d360204200041c0a3c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010262206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b41204101102a000b7901027f230041106b2202240020024100360208200242013703000240410110262203450d00200341003a00002002428180808010370204200220033602002002410036020c2002410c6a20021041200041086a200241086a28020036020020002002290300370200200241106a24000f0b41014101102a000b8e1206037f017e057f017e047f027e230041d0016b22012400200141b0016a41086a22024200370300200142003703b00141a895c3004115200141b0016a1000200141f0006a41086a22032002290300370300200120012903b001370370200141f0006a4110100320024200370300200142003703b00141bd95c300411a200141b0016a100020032002290300370300200120012903b001370370200141f0006a41101003200141af98c300410d109201200129030821042001280200210520024200370300200142003703b00141fc9cc3004111200141b0016a100020032002290300370300200120012903b001370370024002400240024002400240024002400240200141f0006a411041a886c500410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d022002411f4d0d0220014190016a41186a2206200141b0016a41186a220229030037030020014190016a41106a2207200141b0016a41106a220329030037030020014190016a41086a2208200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100320022006290300370300200320072903003703002009200829030037030020012001290390013703b001200141106a41186a2002290300370300200141106a41106a2003290300370300200141106a41086a2009290300370300200120012903b0013703100c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141106a41186a4200370300200141106a41106a4200370300200141106a41086a4200370300200142003703100b4200210a200141b0016a41086a22024200370300200142003703b00141fd98c300410d200141b0016a1000200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041a886c500410041001001417f460d0020014210370294012001200141f0006a36029001200141b0016a20014190016a10a90220012802b0012206450d0520012902b401210a200141f0006a411010030c010b410421060b200141b0016a41086a22024200370300200142003703b00141bc98c3004115200141b0016a1000200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041a886c500410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d032002411f4d0d0320014190016a41186a2207200141b0016a41186a220229030037030020014190016a41106a2208200141b0016a41106a220329030037030020014190016a41086a220b200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100320022007290300370300200320082903003703002009200b29030037030020012001290390013703b001200141306a41186a2002290300370300200141306a41106a2003290300370300200141306a41086a2009290300370300200120012903b0013703300c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141306a41186a4200370300200141306a41106a4200370300200141306a41086a4200370300200142003703300b200141f0006a41186a22024200370300200141f0006a41106a22034200370300200141f0006a41086a2209420037030020014200370370200141f0006a1015200141d0006a41186a2002290300370300200141d0006a41106a2003290300370300200141d0006a41086a200929030037030020012001290370370350200141b0016a41186a2207200141106a41186a290300370300200141b0016a41106a2208200141106a41106a290300370300200141b0016a41086a220b200141106a41086a290300370300200120012903103703b00120024200370300200342003703002009420037030020014200370370200141b0016a4120200141f0006a1016450d0620014190016a41186a220c200229030037030020014190016a41106a220d200329030037030020014190016a41086a220e200929030037030020012001290370370390012002200c2903003703002003200d2903003703002009200e29030037030020012001290390013703702007200229030037030020082003290300370300200b2009290300370300200120012903703703b001024002400240200a422088220fa72202200aa7470d00200241016a22032002490d05200fa74101742209200320032009491bad221042247e220f422088a70d05200fa722034100480d052002450d012006200241246c200310272206450d020c070b200a21100c070b2003102622060d050b20034104102a000b41d4aac10041331021000b41d4aac10041331021000b101e000b41d4aac10041331021000b200a422088220fa721020b2006200241246c6a220241003a0000200241196a200141c8016a290300370000200241116a200141c0016a290300370000200241096a200141b8016a290300370000200220012903b001370001200220012f0090013b0021200241236a20014192016a2d00003a0000201042ffffffff0f83200f4220864280808080107c84210a0b2000200129031037001420002004420020051b370300200020012903503700342000412c6a200141106a41186a290300370000200041246a200141106a41106a2903003700002000411c6a200141106a41086a2903003700002000413c6a200141d0006a41086a290300370000200041c4006a200141d0006a41106a290300370000200041cc006a200141d0006a41186a290300370000200041ec006a200141306a41186a290300370000200041e4006a200141306a41106a290300370000200041dc006a200141306a41086a290300370000200020012903303700542000410c6a200a37020020002006360208200141d0016a24000bac0101027f230041206b22002400200041106a41086a2201420037030020004200370310419595c3004113200041106a1000200041086a200129030037030020002000290310370300024002402000411041a886c500410041001001417f460d00200041003a001020004110200041106a41014100100141016a41014d0d0120002d001021012000411010032001450d00200041206a24000f0b41d895c300104f000b41d4aac10041331021000b130020004101360204200041b4bcc3003602000b1300200041093602042000418cc0c3003602000b13002000410436020420004198c0c3003602000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242033700000f0b41084101102a000bb23b07027f027e017f017e2a7f0a7e027f23004190056b22032400418f94c30021040240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710d00200241ff01714102470d00200341f0046a41086a22044200370300200342003703f004419595c3004113200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f470d0020044200370300200342003703f00441a298c300410d200341f0046a100020012004290300370300200320032903f0043703d003200341d0036a411041a886c500410041001001417f460d01200342003703e801024002400240200341d0036a4110200341e8016a41084100100141016a41084d0d0020032903e801500d04200341f0046a41086a22044200370300200342003703f00441a298c300410d200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d003420021050240200341d0036a411041a886c500410041001001417f460d00200342003703e801200341d0036a4110200341e8016a41084100100141016a41084d0d0220032903e80121050b20044200370300200342003703f00441e698c3004117200341f0046a100020012004290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f460d00200342003703e801200341d0036a4110200341e8016a41084100100141016a41084d0d0420032903e80120057c2000560d010c060b420320057c2000580d050b41bc97c300104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41f496c300104f000b200341f0046a41086a22044200370300200342003703f00441a298c300410d200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d003200320003703e801200341d0036a4110200341e8016a41081004200341013a00e80120044200370300200342003703f004419595c3004113200341f0046a100020012004290300370300200320032903f0043703d003200341d0036a4110200341e8016a4101100420014200370300200342003703d00341e698c3004117200341d0036a1000200341e8016a41086a2001290300370300200320032903d0033703e80102400240200341e8016a411041a886c500410041001001417f460d00200342003703d003200341e8016a4110200341d0036a41084100100141016a41084d0d0920032903d00321050c010b420321050b200341d0036a41086a22014200370300200342003703d0034180adc4004112200341d0036a1000200341e8016a41086a22022001290300370300200320032903d0033703e8014100210402400240200341e8016a411041a886c500410041001001417f460d00200342003703d003200341e8016a4110200341d0036a41084100100141016a41084d0d0a20032903d0032106410021070c010b410121070b20014200370300200342003703d0034180adc4004112200341d0036a100020022001290300370300200320032903d0033703e801200320003703d003200341e8016a4110200341d0036a410810042006500d0020070d00427f200520057c220820082005541b22054200510d172000200580220020062005802205580d182000200542017c2206510d00200341d0036a41086a22044200370300200342003703d00341a2adc4004112200341d0036a1000200341e8016a41086a2004290300370300200320032903d0033703e80141002104200341e8016a411041a886c500410041001001417f460d00200342103702bc022003200341e8016a3602b802200341d0036a200341b8026a102820032802d0032209450d1e20032802d403210a024020002005427f857c2200a7417f2000428080808010541b220b450d00200341d8036a280200220c200b4d0d002006a7417f2006428080808010541b210d200341f9036a210e200341d0036a41096a210f200341b8026a4104722110200341e8016a41286a2111200341e8016a41206a2112200341e8016a41246a211320034188046a2114200341d0036a412c6a2115410021160340200341c8016a41186a20092016200d6a200c704105746a220441186a290000370300200341c8016a41106a200441106a290000370300200341c8016a41086a200441086a290000370300200320042900003703c801200341e8016a200341c8016a106b02402012280200223e450d00200341b8026a41086a201141086a290300370300200341b8026a41106a201141106a290300370300200341b8026a41186a201141186a290300370300200341b8026a41206a201141206a280200360200200320112903003703b8022013280200213d200341e0026a41186a2217201041186a290000370300200341e0026a41106a2218201041106a290000370300200341e0026a41086a2219201041086a290000370300200320102900003703e002200341f0046a41086a22224200370300200342003703f0044181f5c0004115200341f0046a1000200341c0036a41086a22232022290300370300200320032903f0043703c0030240024002400240200341c0036a411041a886c500410041001001417f470d0041014100200341e0026a10eb020d020c010b200342103702f4042003200341c0036a3602f004200341d0036a200341f0046a102820032802d0032204450d1620032802d40321012004200341d0036a41086a280200200341e0026a10eb02210202402001450d00200410230b20020d010b411210262204450d16200441106a41002f00a6f54022013b0000200441086a410029009ef540220037000020044100290096f540220537000020044112413210272204450d17200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000200341d0046a41186a221a4200370300200341d0046a41106a221b4200370300200341d0046a41086a221c4200370300200342003703d00420044132200341d0046a1002200341d0036a41186a221d201a290300370300200341d0036a41106a221e201b290300370300200341d0036a41086a221f201c290300370300200320032903d0043703d00302400240200341d0036a412041a886c500410041001001417f460d00200341003602f004200341d0036a4120200341f0046a41044100100141016a41044d0d1220032802f0042120200410234112102622040d010c1a0b4100212020041023411210262204450d190b200441106a20013b0000200441086a20003700002004200537000020044112413210272204450d19200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300201b4200370300201c4200370300200342003703d00420044132200341d0046a1002201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d0032003202041016a22213602f004200341d0036a4120200341f0046a410410042004102320224200370300200342003703f00441a8f5c0004119200341f0046a100020232022290300370300200320032903f0043703c00302400240200341c0036a411041a886c500410041001001417f460d00200341003602d003200341c0036a4110200341d0036a41044100100141016a41044d0d1320032802d00321240c010b410021240b20034180036a41186a2204201729030037030020034180036a41106a2201201829030037030020034180036a41086a22022019290300370300200320032903e002370380034200210820224200370300200342003703f00441af98c300410d200341f0046a100020232022290300370300200320032903f0043703c0030240200341c0036a411041a886c500410041001001417f460d00200342003703d003200341c0036a4110200341d0036a41084100100141016a41084d0d1020032903d00321080b200341a0036a41186a22252004290300370300200341a0036a41106a22262001290300370300200341a0036a41086a2227200229030037030020032003290380033703a00320224200370300200342003703f00441c1f5c0004117200341f0046a100020232022290300370300200320032903f0043703c00302400240024002400240024002400240200341c0036a411041a886c500410041001001417f460d00200342103702c4042003200341c0036a3602c004200341c0016a200341c0046a104a20032802c001450d1020032802c4012228ad42307e2200422088a70d1b2000a72204417f4c0d1b2004450d01200410262229450d282028450d030c020b200341f0046a41186a22042025290300370300200341f0046a41106a2201202629030037030041082129200341f0046a41086a2202200341a0036a41086a290300370300200320032903a0033703f004201d2004290300370300201e2001290300370300200341d0036a41086a2002290300370300200320032903f0043703d0034100212a420021060c040b410821292028450d010b200341c0046a41086a2207280200212a4100212b20032802c404212c20032802c004212d41002102410021042028212e0340201a4200370300201b4200370300201c4200370300200342003703d00420074100202d202c200341d0046a4120202a100122012001417f461b220141202001412049222f1b202a6a2201360200202f0d0d201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d003200342003703d00420074100202d202c200341d0046a410820011001222a202a417f461b222a4108202a4108491b20016a2201360200202a41074d0d0d20032903d0042100200341003602d00420074100202d202c200341d0046a410420011001222a202a417f461b222f4104202f4104491b20016a222a360200202f41034d0d0d200441016a210120032802d004212f200341f0046a41186a2230201d290300370300200341f0046a41106a2231201e2903003703002022201f290300370300200320032903d0033703f00402402004202e470d00202b20012001202b491b222ead42307e2205422088a70d0d2005a722324100480d0d02402004450d00202920022032102722290d010c160b203210262229450d150b202920026a22042000370300200441206a2030290300370300200441186a2031290300370300200441106a2022290300370300200441086a20032903f004370300200441286a202f360200202b41026a212b200241306a21022001210420012028490d000b20290d010c0d0b410021014100212e2029450d0c0b200341f0046a41186a222b2025290300370300200341f0046a41106a222c202629030037030020222027290300370300200320032903a0033703f00402402001ad422086202ead842206422088a7222a4120490d0041302104202a41306c21072029ad42208621054201210020292102034002402002290300202920046a2201290300580d002001ad4220862000842105200121020b200042017c21002007200441306a2204470d000b2002450d22200542ffffffff0f580d22201d202b290300370300201e202c290300370300201f2022290300370300200320032903f0043703d003202a2005a722044d0d252029200441306c6a22042008370300200441206a201d290300370300200441186a201e290300370300200441106a201f290300370300200420032903d003370308200441013602280c030b201d202b290300370300201e202c290300370300201f2022290300370300200320032903f0043703d0032006a7202a470d010b202a4101742204202a41016a220120012004491bad220042307e2205422088a70d082005a722044100480d0802400240202a450d002029202a41306c2004102722290d010c230b200410262229450d220b2006422088a7212a200021060b2029202a41306c6a22042008370300200441206a201d290300370300200441186a201e290300370300200441106a201f290300370300200420032903d00337030820044101360228200642ffffffff0f83202a41016aad4220868421060b20224200370300200342003703f00441c1f5c0004117200341f0046a100020232022290300370300200320032903f0043703c003201f4100360200200342013703d00320032006422088a722043602f004200341f0046a200341d0036a1041024002402004450d00200441306c212c4158201f28020022046b212a2004412c6a210420032802d403210220292101034002400240024002402002202a6a41286a41204f0d00200441546a222b41206a2207202b490d0d2002410174222b20072007202b491b222b4100480d0d2002450d0120032802d0032002202b102722070d020c100b20032802d00321070c020b202b10262207450d0e0b2003202b3602d403200320073602d003202b21020b201f200441746a222d360200200720046a222b416c6a200141206a290000370000202b41646a200141186a290000370000202b415c6a200141106a290000370000202b41546a200141086a2900003700002001290300210002400240024002402002202a6a222b41086a202b4f0d00202d41086a222b202d490d0d2002410174222d202b202b202d491b222b4100480d0d2002450d0120072002202b102722070d020c110b2002212b0c020b202b10262207450d0f0b2003202b3602d403200320073602d0030b201f2004417c6a2202360200200720046a41746a2000370000200141286a280200212d0240024002400240202b202a6a41034b0d00200241046a222f2002490d0d202b4101742202202f202f2002491b22024100480d0d202b450d012007202b2002102722070d020c120b202b21020c020b200210262207450d100b200320023602d403200320073602d0030b200141306a2101201f2004360200200720046a417c6a202d360000202a41546a212a2004412c6a2104202c41506a222c0d000c020b0b20032802d403210220032802d00321070b200341c0036a41102007201f280200100402402002450d00200710230b02402006a7450d00202910230b411210262204450d1a200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d1b200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300201b4200370300201c4200370300200342003703d00420044132200341d0046a1002201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d0030240024002400240024002400240200341d0036a412041a886c500410041001001417f460d00200342203702f4042003200341d0036a3602f004200341b8016a200341f0046a104a20032802b801450d1b20032802bc012101200341a0016a200341f0046a104c20032802a001450d1b20041023410a2104200141094d0d012021410a20246a4d0d030c020b20041023410321010b20212001220420246a4d0d010b200341d0036a200341e0026a106d201f290300210020032903d00321050240200341d0036a41246a2207280200450d00200341d0036a41206a28020010230b20224200370300200342003703f00441fcf5c0004114200341f0046a100020232022290300370300200320032903f0043703c003200341c0036a411041a886c500410041001001417f460d01200341003602d003200341c0036a4110200341d0036a41044100100141016a41044d0d1620032802d00321010c020b200341f0046a41186a2017290300370300200341f0046a41106a201829030037030020222019290300370300200320032903e0023703f004410121040c020b41c0843d21010b200341f0006a20052000428094ebdc034200109704200341e0006a20032903702206200341f0006a41086a29030022084280ec94a37c427f109804200341d0006a200620082001ad22334200109804200341c0006a200329035022062033200520032903607c7e428094ebdc038042ffffffff0f837c2208200341d0006a41086a2903002008200654ad7c2004109904200341c0006a41086a290300210620032903402108200341d0036a200341e0026a106d20034180016a200341e0026a20032903d003223420052008200441ff004b2005200854200020065420002006511b7222041b22352034203554201f29030022362000200620041b22375420362037511b22041b2208201e29030022382038200856201d29030022392036203720041b22065620392006511b22041b22332006203920041b223a10840220034180016a41086a290300210020032903800121050240200329039001223b20337d223c20087c220820034180016a41186a290300203a7d203b203354ad7d20067c2008203c54ad7c223384500d00203420387d223a203620397d2034203854ad7d223684500d00200341d0036a41286a2802002201450d00200341d0036a41206a2802002204200141306c6a21020340200341106a2004290300200441086a2903002008203310980420032003290310200341106a41086a290300203a2036109704200341206a200441106a2003290300200341086a290300108402427f2000200341206a41086a2903007c200520032903207c22062005542201ad7c22052001200520005420052000511b22011b2100427f200620011b2105200441306a22042002470d000b0b200320053703f004200320003703f8042003200341f0046a3602d004200341d0046a10de0102402007280200450d00200341d0036a41206a28020010230b20224200370300200342003703f00441a2adc4004112200341f0046a1000201f2022290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f460d00200342103702d4042003200341d0036a3602d004200341f0046a200341d0046a102820032802f004222d450d252022280200210420032802f40421290c010b4101212d41002104410021290b202d20044105746a212c41002101202d21040240024002400340202c20046b41ff004d0d01200341c8016a2004460d022004200341c8016a41201096042207450d02200441206a2202200341c8016a460d022002200341c8016a4120109604222a450d02200441c0006a2202200341c8016a460d022002200341c8016a41201096042202450d02200441e0006a222b200341c8016a460d0220044180016a2104200120074100476a202a4100476a20024100476a202b200341c8016a412010960422024100476a210120020d000c020b0b2004202c460d010340200341c8016a2004460d012004200341c8016a41201096042202450d01200120024100476a2101202c200441206a2204470d000c020b0b200341013a00d00420224200370300200342003703f00441dfbac400410f200341f0046a1000201f2022290300370300200320032903f0043703d003200341d0036a4110200341d0046a410110040b02402029450d00202d10230b200341f0046a41186a2017290300370300200341f0046a41106a201829030037030020222019290300370300200320032903e0023703f004410221040b20142037370300200341d0036a41306a2035370300201f20043a0000200f20032903f004370000200e20032f00d0043b000020152020360200200f41086a2022290300370000200f41106a200341f0046a41106a290300370000200f41186a200341f0046a41186a290300370000200e41026a200341d0046a41026a2d00003a0000200341043a00d00341a886c5004100200341d0036a102c203d0d010c020b203d450d010b203e10230b201641016a2216200b470d000b0b41002104200a450d00200910230b20034190056a240020040f0b101e000b202e450d00202910230b41d4aac10041331021000b202b4101102a000b202b4101102a000b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b20324108102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b101d000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41fcaec400104f000b41f8afc400104f000b41d8f5c00041131021000b20044108102a000b20044108102a000b41ecf5c0002004202a1029000b41d4aac10041331021000b41d4aac10041331021000bcf0101047f200020014105746a210320002104024002400340200320046b41ff004d0d014101210520042002460d02200420024120109604450d02200441206a22062002460d02200620024120109604450d02200441c0006a22062002460d02200620024120109604450d02200441e0006a22062002460d0220044180016a21042006200241201096040d000c020b0b024020042003460d00200020014105746a210603404101210520022004460d02200420024120109604450d022006200441206a2204470d000b0b41000f0b20050b8e0a01037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00004101470d00200041046a280200220241808004490d01200141046a280200200141086a2802002200470d03200041016a22032000490d1b20004101742204200320032004491b22044100480d1b2000450d0920012802002000200410272203450d0a0c190b200141046a280200200141086a2802002202470d01200241016a22032002490d1a20024101742204200320032004491b22044100480d1a2002450d0420012802002002200410272203450d050c160b200241f001490d02200141046a280200200141086a2802002200470d05200041016a22032000490d1920004101742204200320032004491b22044100480d192000450d09200128020020002004102722030d0a0c120b200128020021030c150b200128020021030c160b200141046a280200200141086a2802002200470d03200041016a22032000490d1620004101742204200320032004491b22044100480d162000450d09200128020020002004102722030d0a0c100b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2004102622030d0f0b20044101102a000b200410262203450d080b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a00000240200141046a2802002203200428020022006b41024f0d00200041026a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d04200128020020032000102722030d050c090b200128020021030c050b200410262203450d060b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b200010262203450d040b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b20044101102a000b20044101102a000b20004101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240024002400240200141046a2802002203200428020022026b41204f0d00200241206a22042002490d0720034101742202200420042002491b22024100480d072003450d0120012802002003200210272203450d020c030b200128020021030c030b2002102622030d010b20024101102a000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a0000024002400240200141046a2802002203200428020022006b41044f0d00200041046a22042000490d0320034101742200200420042000491b22004100480d032003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b101e000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000b9a0b06037f037e037f027e017f027e230041b0016b22012400200141c0006a41086a220242003703002001420037034041becbc300411d200141c0006a1000200141306a41086a2002290300370300200120012903403703300240200141306a411041a886c500410041001001417f460d002001200141306a360200200141103602042001420037034020014100200141306a4110200141c0006a41084100100122022002417f461b2202410820024108491b220336020802400240024002400240024002400240024002400240200241074d0d002001290340210420014200370340200141086a4100200141306a4110200141c0006a41082003100122022002417f461b2202410820024108491b20036a360200200241074d0d0020012903402105200141c0006a200110890220012802402202450d0020012902442106200141003a0040200141086a2203200328020022032001280200220720012802042208200141c0006a41012003100141016a41014b22036a22093602000240024002402003450d0020012d00404101470d004200210a20014200370340200141086a410020072008200141c0006a41082009100122032003417f461b2203410820034108491b20096a360200200341074d0d012001290340210b4201210a0c020b4200210a0b0b200141246a2006370200200141186a200b370300200120023602202001200a370310200120053703082001200437030020042000520d082006422088a7210802400240024002400240200a500d002008ad42287e220a422088a70d06200aa72203417f4c0d062003450d0120031026220c450d072008450d020c0b0b2008ad42287e220a422088a70d05200aa72203417f4c0d052003450d0220031026220c450d072008450d030c080b4108210c20080d090b410021090c090b4108210c20080d050b410021090c050b41d4aac10041331021000b101d000b20034108102a000b20034108102a000b200841286c210741002109200c21030340200241086a290300210a200241106a2903002106200241186a290300210d2002290300210e200341206a200241206a290300370300200341186a200d370300200341106a2006370300200341086a200a3703002003200e370300200341286a2103200941016a2109200241286a2102200741586a22070d000b0b200141d8006a2009360200200141d4006a2008360200200141d0006a200c3602002001200537034820014200370340200141c0006a10ee02200520047c2000510d030c040b200841286c210741002109200c21030340200241086a290300210a200241106a2903002106200241186a290300210d2002290300210e200341206a200241206a290300370300200341186a200d370300200341106a2006370300200341086a200a3703002003200e370300200341286a2103200941016a2109200241286a2102200741586a22070d000b0b200141e0006a2009360200200141dc006a2008360200200141d8006a200c360200200141d0006a20053703002001200b37034820014201370340200141c0006a10ee020b200520047c2000520d010b200141c0006a41086a220242003703002001420037034041dbcbc300411b200141c0006a1000200141306a41086a2209200229030037030020012001290340370330200141103602442001200141306a360240200141206a2203200141c0006a108f02200141cb006a200341086a28000036000020012003290000370043200120012900403703302001200141c7006a29000037003720022001290037370000200141083a00402001200129033037004141a886c5004100200141c0006a102c200242003703002001420037034041becbc300411d200141c0006a10002009200229030037030020012001290340370330200141306a41101003200141b0016a24000f0b200141246a280200450d00200141206a28020010230b200141b0016a24000bfc0d05017f017e037f017e067f230041d0006b220124002001410036023020014201370328024002400240024002400240024002400240024002400240024002400240024002400240024002400240200029030022024201520d00410110262203450d09200141286a41086a22042004280200220541016a3602002001410136022c20012003360228200320056a41013a000020002903082106200128022c2205200428020022036b41084f0d01200341086a22042003490d0f20054101742203200420042003491b22034100480d0f2005450d0320012802282005200310272204450d040c0d0b410110262203450d092001410136022c200141286a41086a22072007280200220441016a36020020012003360228200320046a41003a0000200041106a28020021082001200041186a2802002209360208200141086a200141286a104102402009450d002008200941286c6a210a2008210303400240024002400240200128022c22052007280200220b6b41204f0d00200b41206a2204200b490d142005410174220c20042004200c491b22044100480d142005450d012001280228200520041027220c0d020c0c0b2001280228210c0c020b20041026220c450d0a0b2001200436022c2001200c3602282007280200210b200421050b2007200b41206a2204360200200c200b6a220b41186a200341186a290000370000200b41106a200341106a290000370000200b41086a200341086a290000370000200b2003290000370000200341206a29030021060240200520046b41074b0d00200441086a220b2004490d1120054101742204200b200b2004491b22044100480d11024002402005450d00200c200520041027220c0d010c0c0b20041026220c450d0b0b2001200436022c2001200c360228200728020021040b2007200441086a360200200c20046a2006370000200a200341286a2203470d000b0b20002903082106200128022c2204200728020022036b41084f0d01200341086a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d0420012802282004200310272204450d050c0a0b200128022821040c0c0b200128022821040c090b2003102622040d090b20034101102a000b2003102622040d050b20034101102a000b20044101102a000b20044101102a000b41014101102a000b41014101102a000b2001200336022c20012004360228200141306a28020021030b200141286a41086a200341086a360200200420036a20063700000c070b2001200336022c20012004360228200141306a28020021030b200141286a41086a2207200341086a360200200420036a2006370000200041186a28020021092001200041206a2802002203360208200141086a200141286a104102402003450d002009200341286c6a210a2009210303400240024002400240200128022c22052007280200220b6b41204f0d00200b41206a2204200b490d062005410174220c20042004200c491b22044100480d062005450d012001280228200520041027220c0d020c070b2001280228210c0c020b20041026220c450d050b2001200436022c2001200c3602282007280200210b200421050b2007200b41206a2204360200200c200b6a220b41186a200341186a290000370000200b41106a200341106a290000370000200b41086a200341086a290000370000200b2003290000370000200341206a29030021060240200520046b41074b0d00200441086a220b2004490d0320054101742204200b200b2004491b22044100480d03024002402005450d00200c200520041027220c0d010c070b20041026220c450d060b2001200436022c2001200c360228200728020021040b2007200441086a360200200c20046a2006370000200a200341286a2203470d000b0b200041106a2903002106024002400240200128022c2204200728020022036b41084f0d00200341086a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802282004200310272204450d020c060b200128022821040c060b2003102622040d040b20034101102a000b101e000b20044101102a000b20044101102a000b2001200336022c20012004360228200141306a28020021030b200141286a41086a200341086a360200200420036a20063700002006a721080b200141086a41086a2203200141286a41086a28020036020020012001290328370308200141246a20032802003600002001200129030837001c200141346a200141206a290000370000200141286a41146a2001290208370200200141286a411c6a2003290200370200200141c6a4b9da04360029200141023a00282001200129001937002d200141286a10d5020240024020024200510d002000411c6a280200450d0120091023200141d0006a24000f0b200041146a280200450d00200810230b200141d0006a24000bfb0c03017f017e097f230041306b2204240042002105200441186a41086a220642003703002004420037031841becbc300411d200441186a1000200441086a41086a2207200629030037030020042004290318370308024002400240024002400240024002400240024002400240200441086a411041a886c500410041001001417f460d00200041046a280200450d0120002802001023200441306a24000f0b200642003703002004420037031841af98c300410d200441186a100020072006290300370300200420042903183703080240200441086a411041a886c500410041001001417f460d0020044200370318200441086a4110200441186a41084100100141016a41084d0d05200429031821050b02402002a74101470d00200441186a41086a220642003703002004420037031841f6cbc300411a200441186a1000200441086a41086a2006290300370300200420042903183703080240200441086a411041a886c500410041001001417f460d0020044200370318200441086a4110200441186a41084100100141016a41084d0d0720042903182005580d00200041046a280200450d0220002802001023200441306a24000f0b200441186a41086a220642003703002004420037031841f6cbc300411a200441186a1000200441086a41086a2006290300370300200420042903183703082004200520014201867c370318200441086a4110200441186a410810040b200028020821062000280204210820002802002109200441186a41086a220042003703002004420037031841becbc300411d200441186a1000200441086a41086a2000290300370300200420042903183703082004410036022020044201370318410810262200450d0620044288808080800137021c200420003602182000200537000020004108411010272200450d0720044290808080800237021c20002001370008200420003602182004200636022c2004412c6a200441186a104102402006450d002009200641286c6a210a200441186a41086a220b280200210c200428021c210720092100034002400240024002402007200c6b41204f0d00200c41206a2206200c490d072007410174220d20062006200d491b220e4100480d072007450d0120042802182007200e1027220d0d020c080b200c41206a21062004280218210d0c020b200e1026220d450d060b2004200e36021c2004200d360218200e21070b200b2006360200200d200c6a220c41186a200041186a290000370000200c41106a200041106a290000370000200c41086a200041086a290000370000200c2000290000370000200041206a29030021050240200720066b41074b0d00200641086a220c2006490d042007410174220e200c200c200e491b220c4100480d04024002402007450d00200d2007200c1027220d0d010c080b200c1026220d450d070b2004200c36021c2004200d360218200c21070b200b200641086a220c360200200d20066a2005370000200a200041286a2200470d000b0b200441206a2802002100200428021c2107024002400240024002400240024002400240024002400240024020024201520d0020072000470d01200041016a22062000490d0e20004101742207200620062007491b22074100480d0e2000450d03200428021820002007102722060d040c150b20072000470d01200041016a22062000490d0d20004101742207200620062007491b220d4100480d0d2000450d0520042802182000200d102722060d060c150b200428021821060c030b200428021821062007210d0c050b200710262206450d110b2004200736021c200420063602180b200441186a41086a220b200041016a220c360200200620006a41013a000002402007200c6b41074b0d00200c41086a220d200c490d092007410174220e200d200d200e491b220d4100480d092007450d0420062007200d102722060d050c120b2007210d0c050b200d10262206450d0f0b2004200d36021c200420063602180b200441206a200041016a2207360200200620006a41003a00000c030b200d10262206450d0d0b2004200d36021c200420063602180b200b200041096a22073602002006200c6a20033700000b200441086a41102006200710040240200d450d00200610230b2008450d00200910230b200441306a24000f0b101e000b200e4101102a000b200c4101102a000b41d4aac10041331021000b41d4aac10041331021000b41084101102a000b41104101102a000b20074101102a000b200d4101102a000b200d4101102a000b130020004102360204200041f0ccc3003602000b1300200041023602042000419cfcc4003602000b130020004101360204200041fc92c4003602000b130020004103360204200041d8b0c1003602000b130020004101360204200041c8fac4003602000b130020004103360204200041a0c3c0003602000b13002000410b360204200041bc80c0003602000b130020004104360204200041f4acc1003602000b130020004106360204200041908bc4003602000b130020004101360204200041c0f9c4003602000b13002000410536020420004180e9c3003602000b130020004106360204200041ecc5c2003602000bba2806027f027e037f017e0f7f047e230041e0056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441044b0d0002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141306a2903002105200141286a2903002106200341d4006a41026a200141076a2d00003a0000200341c0016a41086a200141186a290200370300200341c0016a410d6a2001411d6a290000370000200320012f00053b01542003200141106a2902003703c001200141086a28020021072001410c6a280200210820012d000421092002411a6a290100210a200241196a2d0000210b200241186a2d0000210c200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002110200241116a2d00002111200241106a2d000021122002410e6a2f010021132002410d6a2d00002114200241046a2d00002115200241026a2f01002116412a210141db94c300210420022d0000450d054101211741002118410021190c060b41ef94c4002104410e211820022d0000450d1f200241086a2802004104490d1f200241046a28020041ff01710d1f20012802042101411210262202450d10200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272202450d112002200136001220034180046a41186a2204420037030020034180046a41106a2218420037030020034180046a41086a2207420037030020034200370380042002411620034180046a1002200341e0036a41186a2004290300370300200341e0036a41106a2018290300370300200341e0036a41086a200729030037030020032003290380043703e003200341e0036a412041a886c5004100410010012104200210232004417f460d0a20034180046a41086a22024200370300200342003703800441f487c400411220034180046a1000200341e0006a41086a2002290300370300200320032903800437036041002104200341e0006a411041a886c500410041001001417f460d0b200342103702f4042003200341e0006a3602f00420034180046a200341f0046a109202200328028004220b450d1520034188046a28020021042003290284042206422088a722022006a7460d0c200328028404210c0c170b20022d000120022d0000720d02200141186a2903002106200141106a290300210a200141086a2802002104200141206a29030021052001280204210120034180046a41086a22024200370300200342003703800441ee89c400411520034180046a1000200341e0006a41086a20022903003703002003200329038004370360410410262202450d0d20022001360000200341e0006a41102002410410042002102320034180046a41086a22024200370300200342003703800441d289c400411c20034180046a1000200341e0006a41086a22012002290300370300200320032903800437036020032006370388042003200a37038004200341e0006a411020034180046a4110100420024200370300200342003703800441c687c400411420034180046a10002001200229030037030020032003290380043703602003200537038004200341e0006a411020034180046a41081004200242003703002003420037038004418688c400410d20034180046a1000200120022903003703002003200329038004370360410410262202450d0e20022004360000200341e0006a411020024104100420021023410021040c1d0b41ef94c4002104410e211820022d0000450d1d200241086a2802004102490d1d200241046a28020041ff01710d1d20012802042101411210262202450d10200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272202450d112002200136001220034180046a41186a2201420037030020034180046a41106a2204420037030020034180046a41086a2218420037030020034200370380042002411620034180046a1002200341e0036a41186a2001290300370300200341e0036a41106a2004290300370300200341e0036a41086a201829030037030020032003290380043703e003200341e0036a412041a886c500410041001001417f460d07200342203702d4052003200341e0036a3602d00520034180046a200341d0056a10ab032003290380044201520d122003280288042101200341f0046a2003418c046a41dc001094041a200341e0036a4120100320034180036a200341f0046a41dc001094041a200341a0026a20034180036a41dc001094041a20021023200341c0016a200341a0026a41dc001094041a20032001360260200341e0006a410472200341c0016a41dc001094041a200341c0006a200341e0006a41206a2003290370200341f8006a290300109302200329034021062003200341c8006a290300370388042003200637038004200320034180046a3602f004200341f0046a10de01410021040c1c0b20022d000120022d000072450d030b41b394c3002104412821180c1b0b41012117410021184100211920022d00014101470d002002410c6a2d000021182002410a6a2f01002119200241096a2d00002101200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021170b201941ffff0371410874201841187472200141ff017172211820170d192003200a370388052003200b3a0087052003200c3a0086052003200d3b0184052003200e3a0083052003200f3a008205200320103b018005200320113a00ff04200320123a00fe04200320133b01fc04200320143a00fb04200320183600f704200320043600f304200320153a00f204200320163b01f004200341d0056a41026a2202200341d4006a41026a2d00003a000020034180046a41086a2201200341c0016a41086a29030037030020034180046a410d6a2204200341c0016a410d6a290000370000200320032f01543b01d005200320032903c00137038004200941ff01714101470d01200341e0036a200741067610870120032802e003210120032802e8032007413f7122024d0d02200341dc036a41026a200120024105746a220241026a2d00003a000020034188036a200241136a2900003703002003418d036a200241186a290000370000200320022f00003b01dc032003200229000b3703800320022800072108200228000321074101210220032802e403450d150c140b200141086a2903002106200141106a290300210a20034180046a41086a22024200370300200342003703800441aaedc300410c20034180046a1000200341e0006a41086a200229030037030020032003290380043703602003200a370388042003200637038004200341e0006a411020034180046a41101004410021040c170b200341dc036a41026a20022d00003a000020034180036a41086a200129030037030020034180036a410d6a2004290000370000200320032f01d0053b01dc032003200329038004370380030c140b4100210220032802e4030d110c120b20034180036a200341f0046a41dc001094041a200210230b41998ac4002104411921180c140b4104210b410021020b200241016a22182002490d0b20024101742207201820182007491b220cad4202862206422088a70d0b2006a722184100480d0b024002402002450d00200b200241027420181027220b450d010c0b0b20181026220b0d0a0b20184104102a000b20034194046a4101360200200341013602642003418898c4003602602003420137028404200341d497c400360280042003200341e0006a3602900420034180046a41a4eec3001061000b41044101102a000b41044101102a000b41124101102a000b41244101102a000b41124101102a000b41244101102a000b41d4aac10041331021000b41d4aac10041331021000b200421020b200b20024102746a200136020020034180046a41086a22094200370300200342003703800441f487c400411220034180046a1000200341e0006a41086a20092903003703002003200329038004370360200341003602880420034201370380042003200441016a22023602f004200341f0046a20034180046a1041024002402002450d00200441027441046a21194100200928020022026b21012003280284042118200b21040340200428020021080240024002400240201820016a41044f0d00200241046a22072002490d0720184101742217200720072017491b22174100480d072018450d0120032802800420182017102722070d020c080b20032802800421070c020b201710262207450d060b20032017360284042003200736028004201721180b200441046a21042009200241046a2217360200200720026a20083600002001417c6a2101201721022019417c6a22190d000c020b0b20092802002117200328028404211820032802800421070b200341e0006a411020072017100402402018450d00200710230b41002104200c450d06200b10230c060b101e000b20174101102a000b200110230b20020d00410121024115210841d9cac40021070c010b200341e0036a41026a200341dc036a41026a2d00003a000020034180046a41086a20034180036a41086a29030037030020034180046a410d6a20034180036a410d6a290000370000200320032f01dc033b01e003200320032903800337038004410021020b200341dc006a41026a2218200341e0036a41026a2d00003a0000200341e0006a41086a220120034180046a41086a2204290300370300200341e0006a41106a20034180046a41106a290300370300200320032f01e0033b015c200320032903800437036002402002450d0020082118200721040c020b200341d8006a41026a20182d00003a0000200341a0026a41086a2001290300370300200341a0026a410d6a200341e0006a410d6a290000370000200320032f015c3b0158200320032903603703a00220044200370300200342003703800441d289c400411c20034180046a100020012004290300370300200320032903800437036002400240200341e0006a411041a886c500410041001001417f460d0020034200370388042003420037038004200341e0006a411020034180046a4110410010012202417f460d052002410f4d0d0520034188046a290300210a200329038004211a0c010b4200211a4200210a0b20034180046a41086a22024200370300200342003703800441ee89c400411520034180046a1000200341e0006a41086a2002290300370300200320032903800437036002400240200341e0006a411041a886c500410041001001417f460d002003410036028004200341e0006a411020034180046a41044100100141016a41044d0d0420032802800421020c010b410021020b200341286a2006200542c0843d4200109704200341186a2003290328221b200341286a41086a290300221c42c0fb42427f109804200341086a201b201c2002ad221d4200109804200341386a200341f0046a201a2003290308221c201d200620032903187c7e42c0843d8042ffffffff0f837c221b201b201a54200341086a41086a290300201b201c54ad7c221b200a54201b200a511b22021b221a200a201b20021b220a105b02402003280238450d0041b889c4002104411a21180c020b20034180046a41086a22024200370300200342003703800441838ac400411620034180046a1000200341e0006a41086a20022903003703002003200329038004370360410021010240200341e0006a411041a886c500410041001001417f460d002003410036028004200341e0006a411020034180046a41044100100141016a41044d0d0520032802800421010b20034180046a41086a22024200370300200342003703800441838ac400411620034180046a1000200341e0006a41086a2204200229030037030020032003290380043703602003200141016a36028004200341e0006a411020034180046a41041004200341e0006a41186a200341f0046a41186a290300370300200341e0006a41106a200341f0046a41106a2903003703002004200341f0046a41086a29030037030020034180036a41086a200341a0026a41086a29030037030020034180036a410d6a200341a0026a410d6a290000370000200320032903f004370360200320032f01583b01d0052003200341da006a2d00003a00d205200320032903a00237038003411210262202450d05200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272204450d062004200136001220034180046a41186a2202420037030020034180046a41106a2218420037030020034180046a41086a2217420037030020034200370380042004411620034180046a1002200341e0036a41186a2002290300370300200341e0036a41106a2018290300370300200341e0036a41086a201729030037030020032003290380043703e003412010262202450d0720022003290360370000200241186a200341e0006a41186a290300370000200241106a200341e0006a41106a290300370000200241086a200341e0006a41086a2903003700002002412041c00010272202450d0820022006370020200241286a2005370000200241c00041800110272202450d092002201a370050200220032f01d0053b00302002200836003720022007360033200220032903800337003b200241d8006a200a370000200241326a20032d00d2053a0000200241c3006a20034180036a41086a290300370000200241c8006a2003418d036a290000370000200341e0036a4120200241e000100420021023200410232003418c046a20013602004100210420034180046a41086a41003a0000200341093a00800441a886c500410020034180046a102c0b0b2000201836020420002004360200200341e0056a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41244101102a000b41204101102a000b41c0004101102a000b4180014101102a000bc15004047f017e117f027e230041d0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022044101460d00024020044102460d0020044103470d0f200141216a2d00002105200141246a2802002106200341186a41186a200141196a290000370300200341186a41106a200141116a290000370300200341186a41086a200141096a290000370300200320012900013703182002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f0100211341db94c3002114412a211520022d0000450d024101211641002117410021180c030b200141086a2802002116200141046a28020021052002411a6a2901002107200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f01002106412a211541db94c300211420022d0000450d034101211741002118410021080c040b200141046a2802002117024020022d00000d0020022d00014101470d00200241196a2d00002114200241186a2d00002115200241166a2f01002116200241156a2d00002118200241146a2d00002108200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002106200241026a2f0100210520032002411a6a290100370370200320143a006f200320153a006e200320163b016c200320183a006b200320083a006a200320093b01682003200a3a00672003200b3a00662003200c3b01642003200d3a0063200320063a005a200320053b015820032010200f410874200e411874727236005f2003201320124108747220114118747236005b200341d8006a10b803450d0941002115200341003602e003200342013703d8032017200341d8036a103920032802dc03211420032802e003211620032802d8032102200341d8026a41186a22184200370300200341d8026a41106a22084200370300200341d8026a41086a22094200370300200342003703d80220022016200341d8026a1002200341c8016a41186a2018290300370300200341c8016a41106a22182008290300370300200341c8016a41086a2009290300370300200320032903d8023703c80102402014450d00200210230b200341d8036a201741f0001094041a200341d8026a410d6a200341d8006a41086a290300370000200341d8026a41156a200341d8006a41106a290300370000200341d8026a411d6a200341d8006a41186a29030037000041012116200341013a00dc02200341013a00d802200320032903583700dd022003200341d8036a200341d8026a10d202200341fd036a2003280200453a0000200341d8036a410d6a200341c8016a41086a290300370000200341d8036a41156a2018290300370000200341d8036a411d6a200341c8016a41186a290300370000200341053a00dc03200341073a00d803200320032903c8013700dd0341a886c5004100200341d8036a102c20171023410021140c2d0b41db94c3002114412a21020c2b0b41012116410021174100211820022d00014101470d002002410c6a2d000021182002410a6a2f01002117200241096a2d00002115200241066a2f0100410874200241056a2d000072200241086a2d0000411874722114410021160b201741ffff0371410874201541ff017172201841187472210220160d1420032007370350200320083a004f200320093a004e2003200a3b014c2003200b3a004b2003200c3a004a2003200d3b01482003200e3a00472003200f3a0046200320103b0144200320113a00432003200236003f2003201436003b200320123a003a200320133b0138200341386a10b803450d02200341d8036a200341186a10b60320032802e0032209450d05200341f0036a280200210b200341ec036a280200210a4110210220032802e40321184182aac4002114200620032802d803220f470d13200341f4036a280200210820032802dc03210e2009200341d8036a41106a280200220c4105746a211620092102410021150340201620026b41ff004d0d09200341386a2002460d0a20152002200341386a412010960422144100476a21152014450d0a200241206a2214200341386a460d0a20152014200341386a412010960422144100476a21152014450d0a200241c0006a2214200341386a460d0a20152014200341386a412010960422144100476a21152014450d0a200241e0006a2214200341386a460d0a20024180016a210220152014200341386a412010960422144100476a211520140d000c0a0b0b41012117410021184100210820022d00014101470d002002410c6a2d000021182002410a6a2f01002108200241096a2d00002115200241066a2f0100410874200241056a2d000072200241086a2d0000411874722114410021170b200841ffff0371410874201841187472201541ff017172210220170d0220032007370350200320093a004f2003200a3a004e2003200b3b014c2003200c3a004b2003200d3a004a2003200e3b01482003200f3a0047200320103a0046200320113b0144200320123a00432003200236003f2003201436003b200320133a003a200320063b0138200341386a10b803450d01200341003602e003200342013703d8032016200341d8036a103920032802dc03211420032802e003211520032802d8032102200341d8026a41186a22174200370300200341d8026a41106a22184200370300200341d8026a41086a22084200370300200342003703d80220022015200341d8026a1002200341d8006a41186a22152017290300370300200341d8006a41106a22172018290300370300200341d8006a41086a22182008290300370300200320032903d80237035802402014450d00200210230b200341d8036a41186a2015290300370300200341d8036a41106a2017290300370300200341d8036a41086a2018290300370300200320032903583703d803411910262202450d0a200241186a41002d00bea9443a0000200241106a41002900b6a944370000200241086a41002900aea944370000200241002900a6a94437000020024119413910272202450d0b200220032903d803370019200241316a200341d8036a41186a290300370000200241296a200341d8036a41106a290300370000200241216a200341d8036a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22174200370300200342003703d80220024139200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2017290300370300200320032903d8023703b802200341b8026a412041a886c5004100410010012114200210232014417f460d054187a9c4002114411f21020c020b41eea9c4002114411421020c110b41f0a8c4002114411721020b201610242016102341012115410021160c250b41dba9c4002114411321020c0e0b41f0a8c4002114411721020c220b200341d8036a41086a22024200370300200342003703d8030240200541014b0d004195b7c1004115200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d802410021020240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a10890220032802d8032214450d0a20032902dc032207422088a721022007a7450d00201410230b200341d8036a201641f0001094041a200341e4026a2002360200200341d8026a41086a4101360200200341003a00dc02200341013a00d802200341086a200341d8036a200341d8026a10d202200341fd036a2003280208453a0000200341e5036a200341d8006a41086a290300370000200341ed036a200341e8006a290300370000200341f5036a200341f0006a290300370000200341043a00dc03200341073a00d803200320032903583700dd0341a886c5004100200341d8036a102c0c1a0b41bfa9c400411c200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d8024100210c0240200341d8026a411041a886c500410041001001417f460d00200341003602d803200341d8026a4110200341d8036a41044100100141016a41044d0d0720032802d803210c0b200341d8036a41086a22024200370300200342003703d80341bfa9c400411c200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d80202400240200341d8026a411041a886c500410041001001417f460d00200341003602d803200341d8026a4110200341d8036a41044100100141016a41044d0d0920032802d80341016a21020c010b410121020b42002107200341d8036a41086a22144200370300200342003703d80341bfa9c400411c200341d8036a1000200341d8026a41086a22152014290300370300200320032903d8033703d802200320023602d803200341d8026a4110200341d8036a4104100420144200370300200342003703d8034188a8c4004118200341d8036a100020152014290300370300200320032903d8033703d8024100210202400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a102820032802d803220b450d0b20032902dc032107200341d8036a41186a200341d8006a41186a290300370300200341d8036a41106a200341d8006a41106a290300370300200341d8036a41086a200341d8006a41086a290300370300200320032903583703d803200341d8036a21142007422088a722022007a7460d010c1a0b200341d8036a41186a200341d8006a41186a290300370300200341d8036a41106a200341d8006a41106a2903003703002014200341d8006a41086a290300370300200320032903583703d8034101210b200341d8036a21140b200241016a22152002490d1a20024101742217201520152017491bad2219420586221a422088a70d1a201aa722154100480d1a024002402002450d00200b200241057420151027220b450d010c190b20151026220b0d180b20154101102a000b20022016460d012009200c4105746a21160340200341386a2002460d0120152002200341386a412010960422144100476a21152014450d014100210d2016200241206a2202470d000c0a0b0b4101210d0c080b4100210d0c070b200341ec036a4101360200200341013602dc022003418898c4003602d802200342013702dc03200341d497c4003602d8032003200341d8026a3602e803200341d8036a41c498c4001061000b41194101102a000b41394101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b200a20084105746a2117200a21024100211402400240024002400240024002400340201720026b41ff004d0d01200341386a2002460d0220142002200341386a412010960422164100476a21142016450d02200241206a2216200341386a460d0220142016200341386a412010960422164100476a21142016450d02200241c0006a2216200341386a460d0220142016200341386a412010960422164100476a21142016450d02200241e0006a2216200341386a460d0220024180016a210220142016200341386a412010960422164100476a211420160d000c020b0b20022017460d020340200341386a2002460d0120142002200341386a412010960422164100476a21142016450d01410021162017200241206a2202470d000c020b0b410121160b200541ff0171450d010c020b41002116200541ff01710d010b20160d01200341d8036a41186a2214200341386a41186a290300370300200341d8036a41106a2216200341386a41106a290300370300200341d8036a41086a2217200341386a41086a290300370300200320032903383703d80302400240024002400240200b2008470d00200b41016a2202200b490d16200b4101742210200220022010491b2211ad4205862207422088a70d162007a722024100480d16200b450d01200a200b41057420021027220a0d020c030b200b21110c010b20021026220a450d010b200a20084105746a220220032903d803370000200241186a2014290300370000200241106a2016290300370000200241086a2017290300370000200841016a21080240200d450d00200c20154d0d022009200c417f6a220c4105746a22022900002107200229000821192002290010211a200920154105746a221441186a200241186a2900003700002014201a37001020142019370008201420073700000b201821102011210b0c060b20024101102a000b41a8aac4002015200c1029000b200d0d00200341d8036a41186a2215200341386a41186a290300370300200341d8036a41106a2217200341386a41106a290300370300200341d8036a41086a220d200341386a41086a290300370300200320032903383703d8030240024002402018200c470d00201841016a22022018490d1320184101742210200220022010491b2210ad4205862207422088a70d132007a722024100480d132018450d01200920184105742002102722090d020c070b201821100c010b200210262209450d050b2009200c4105746a220220032903d803370000200241186a2015290300370000200241106a2017290300370000200241086a200d290300370000200c41016a210c2016450d03200820144d0d05200a2008417f6a22084105746a22022900002107200229000821192002290010211a200a20144105746a221441186a200241186a2900003700002014201a37001020142019370008201420073700000c030b4192aac4002114411621020b02402018450d00200910230b200b450d00200a10230b41012116410121150c150b200341fd036a2003290318370000200341e5036a200341386a41086a290300370000200341d8036a41156a200341386a41106a290300370000200341f5036a200341386a41186a29030037000020034185046a200341186a41086a2903003700002003418d046a200341186a41106a29030037000020034195046a200341186a41186a290300370000200341013a00dc03200341073a00d803200320032903383700dd03200341a4046a2008360200200341a0046a200c3602002003419d046a20053a00004100210241a886c5004100200341d8036a102c200341d8036a41086a22144200370300200342003703d8034195b7c1004115200341d8036a1000200341d8026a41086a2014290300370300200320032903d8033703d8020240024002400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a10890220032802d8032214450d0120032902dc032207422088a721022007a7450d00201410230b0240200c200e4f0d004100200220086b2214201420024b1b200e490d00200341f4036a2008360200200341f0036a200b360200200341e8036a200c360200200341e4036a20103602002003200a3602ec03200320093602e0032003200e3602dc032003200f3602d803411510262202450d022002410d6a41002900ada844370000200241086a41002900a8a844370000200241002900a0a84437000020024115413510272202450d03200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22164200370300200342003703d80220024135200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2016290300370300200320032903d8023703b802200341203602dc022003200341b8026a3602d802200341d8036a200341d8026a10ad03200210232010450d0c0c0b0b02400240200c200e490d00200341e5036a200341186a41086a290300370000200341ed036a200341186a41106a290300370000200341f5036a200341186a41186a290300370000200341023a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c411910262214450d07201441186a41002d00bea9443a0000201441106a41002900b6a944370000201441086a41002900aea944370000201441002900a6a94437000020144119413910272214450d0820142003290318370019201441316a200341186a41186a290300370000201441296a200341186a41106a290300370000201441216a200341186a41086a290300370000200341d8026a41186a22154200370300200341d8026a41106a22164200370300200341d8026a41086a22174200370300200342003703d80220144139200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2016290300370300200341b8026a41086a2017290300370300200320032903d8023703b802410e21150240200341b8026a412041a886c500410041001001417f460d00200342203702cc032003200341b8026a3602c803200341d8036a200341c8036a102f20032802d8032215410e460d0a200341d8026a200341d8036a41047241ec001094041a200341b8026a412010030b200341c8016a200341d8026a41ec001094041a2015410e470d0120141023411521144115102622020d0a0c0b0b200341e5036a200341206a290300370000200341ed036a200341286a290300370000200341f5036a200341306a290300370000200341033a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c41152114411510262202450d0a0c090b200341d8006a200341c8016a41ec001094041a20141023200320153602d803200341d8036a410472200341d8006a41ec001094041a200341e4026a2002360200200341d8026a41086a200e360200200341003a00dc02200341013a00d802200341106a200341d8036a200341d8026a10d202200341fd036a2003280210453a0000200341e5036a200341186a41086a290300370000200341ed036a200341286a290300370000200341f5036a200341306a290300370000200341043a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c411521144115102622020d080c090b41d4aac10041331021000b41154101102a000b41354101102a000b20024101102a000b41a8aac400201420081029000b41194101102a000b41394101102a000b41d4aac10041331021000b2002410d6a41002900ada844370000200241086a41002900a8a844370000200241002900a0a8443700000240024020022014413510272202450d00200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a29030037000042002107200341d8026a41186a22154200370300200341d8026a41106a22164200370300200341d8026a41086a22144200370300200342003703d80220024135200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2016290300370300200341b8026a41086a2014290300370300200320032903d8023703b802200341b8026a4120100320021023200341d8036a41086a22024200370300200342003703d8034188a8c4004118200341d8036a100020142002290300370300200320032903d8033703d80202400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a102820032802d803220d450d0320032902dc0321070c010b4101210d0b4100210802400240024002402007422088a72216450d0041002117410021084100211402400340024002402008450d00200d20144105746a2102200d201420176a4105746a21150340201420164f0d06200341186a2002460d022002200341186a4120109604450d02201720146a221820164f0d0720152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000200241206a2102201541206a21152016201441016a2214470d000c050b0b200d20144105746a21020340201420164f0d05200341186a2002460d012002200341186a4120109604450d01200241206a21022016201441016a2214470d000c030b0b2017417f6a2117200841016a2108201441016a22142016470d000c020b0b410021080b200341d8036a41086a22024200370300200342003703d8034188a8c4004118200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d802200341003602e003200342013703d8032003201620086b22143602c801200341c8016a200341d8036a1041024002402014450d00201641057420084105746b21184100200228020022146b211620032802d803210820032802dc032117200d210203400240201720166a411f4b0d00201441206a22152014490d0f2017410174220c20152015200c491b22154100480d0f024002402017450d00200820172015102722080d010c080b201510262208450d070b201521170b200820146a22152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000201641606a2116201441206a2114200241206a2102201841606a22180d000b200341e0036a2014360200200320173602dc03200320083602d8030c010b2002280200211420032802dc03211720032802d80321080b200341d8026a411020082014100402402017450d00200810230b02402007a7450d00200d10230b20100d060c070b41b4c4c200201420161029000b4194c5c200201820161029000b20154101102a000b41354101102a000b41d4aac10041331021000b20144101102a000b200910230b0240200b450d00200a10230b4100211441012116410121150c0b0b2007422088a72102201921070b200b200241057422176a22152014290000370000201541186a201441186a290000370000201541106a201441106a290000370000201541086a201441086a290000370000200341d8036a41086a22144200370300200342003703d8034188a8c4004118200341d8036a1000200341d8026a41086a2014290300370300200320032903d8033703d802200341003602e003200342013703d8032003200241016a22023602c801200341c8016a200341d8036a1041024002402002450d00201741206a21084100201428020022146b211720032802d803210920032802dc032118200b210203400240201820176a411f4b0d00201441206a22152014490d052018410174220a20152015200a491b22154100480d05024002402018450d00200920182015102722090d010c080b201510262209450d070b201521180b200920146a22152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000201741606a2117201441206a2114200241206a2102200841606a22080d000b200341e0036a2014360200200320183602dc03200320093602d8030c010b2014280200211420032802dc03211820032802d80321090b200341d8026a411020092014100402402018450d00200910230b02402007a7450d00200b10230b200341c8016a41186a200341d8006a41186a290300370300200341c8016a41106a200341d8006a41106a290300370300200341c8016a41086a200341d8006a41086a290300370300200320032903583703c801200341d8036a201641f0001094041a411910262202450d03200241186a41002d00bea9443a0000200241106a41002900b6a944370000200241086a41002900aea944370000200241002900a6a94437000020024119413910272202450d04200220032903c801370019200241316a200341c8016a41186a290300370000200241296a200341c8016a41106a290300370000200241216a200341c8016a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22174200370300200342003703d80220024139200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2017290300370300200320032903d8023703b802200341003602e002200342013703d802200341d8036a200341d8026a103920032802dc022114200341b8026a412020032802d802221520032802e002100402402014450d00201510230b20021023200341d8036a1024412010262202450d0520022003290338370000200241186a200341386a41186a290300370000200241106a200341386a41106a290300370000200241086a200341386a41086a290300370000200341c8016a41186a200341d8006a41186a290300370300200341c8016a41106a200341d8006a41106a290300370300200341c8016a41086a200341d8006a41086a290300370300200320032903583703c801200341f4036a4100360200200341e4036a428180808010370200200342013702ec03200320023602e003200320053602dc032003200c3602d803411510262214450d062014410d6a41002900ada844370000201441086a41002900a8a844370000201441002900a0a84437000020144115413510272214450d07201420032903c8013700152014412d6a200341c8016a41186a290300370000201441256a200341c8016a41106a2903003700002014411d6a200341c8016a41086a290300370000200341d8026a41186a22154200370300200341d8026a41106a22174200370300200341d8026a41086a22184200370300200342003703d80220144135200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2017290300370300200341b8026a41086a2018290300370300200320032903d8023703b802200341203602dc022003200341b8026a3602d802200341d8036a200341d8026a10ad032014102320021023200341d8036a410d6a200341386a41086a290300370000200341ed036a200341386a41106a290300370000200341d8036a411d6a200341386a41186a290300370000200341d8036a41256a2003290358370000200341d8036a412d6a200341d8006a41086a290300370000200341d8036a41356a200341d8006a41106a29030037000020034195046a200341d8006a41186a290300370000200341003a00dc03200341073a00d803200320032903383700dd03200341a4046a2005360200200341a0046a200c36020041a886c5004100200341d8036a102c0b201610234100211641012115410021140c080b101e000b20154101102a000b41194101102a000b41394101102a000b41204101102a000b41154101102a000b41354101102a000b201710242017102341002115410121160b02400240200441037122044101460d0020044102470d012016450d01200141086a28020022011024200110230c010b2015450d00200141046a28020022011024200110230b2000200236020420002014360200200341d0046a24000bfc09010b7f230041a0026b2202240002400240411210262203450d00200341106a41002f00c4ad443b0000200341086a41002900bcad44370000200341002900b4ad4437000020034112413210272203450d01200320012900003700122003412a6a200141186a290000370000200341226a200141106a2900003700002003411a6a200141086a290000370000200241e0006a41186a22014200370300200241e0006a41106a22044200370300200241e0006a41086a220542003703002002420037036020034132200241e0006a1002200241c0006a41186a2001290300370300200241c0006a41106a2004290300370300200241c0006a41086a200529030037030020022002290360370340024002400240200241c0006a412041a886c500410041001001417f460d0020014200370300200241f0006a4200370300200241e8006a420037030020024200370360200241c0006a4120200241e0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241e0006a41186a2204290300370300200241106a2205200241e0006a41106a2206290300370300200241086a2207200241e0006a41086a22082903003703002002200229036037030020024180026a41186a2209200129030037030020024180026a41106a2201200529030037030020024180026a41086a220520072903003703002002200229030037038002200241c0016a41186a2009290300370300200241c0016a41106a2001290300370300200241c0016a41086a200529030037030020022002290380023703c00120044200370300200642003703002008420037030020024200370360200241c0006a4120200241e0006a4120412010012201417f460d022001411f4d0d02200241186a2201200241e0006a41186a290300370300200241106a2204200241e0006a41106a290300370300200241086a2205200241e0006a41086a2903003703002002200229036037030020024180026a41186a2206200129030037030020024180026a41106a2207200429030037030020024180026a41086a220820052903003703002002200229030037038002200241e0016a41186a22092006290300370300200241e0016a41106a22062007290300370300200241e0016a41086a2207200829030037030020022002290380023703e00120024180016a41186a2208200241c0016a41186a29030037030020024180016a41106a220a200241c0016a41106a29030037030020024180016a41086a220b200241c0016a41086a29030037030020024180016a41286a220c200729030037030020024180016a41306a2207200629030037030020024180016a41386a22062009290300370300200220022903c00137038001200220022903e0013703a001200241386a22092006290300370300200241306a22062007290300370300200241286a2207200c290300370300200241206a220c20022903a001370300200120082903003703002004200a2903003703002005200b2903003703002002200229038001370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a2001290300370000200041216a200c290300370000200041296a2007290300370000200041316a2006290300370000200041396a20092903003700000c010b200041003a00000b20031023200241a0026a24000f0b41d4aac10041331021000b41124101102a000b41324101102a000b4d01017f230041206b22002400200041146a41013602002000410136021c2000418898c40036021820004201370204200041d497c4003602002000200041186a360210200041b498c4001061000b130020004100360204200041a886c5003602000b13002000410f360204200041a7e4c3003602000b130020004104360204200041d4dec3003602000b130020004101360204200041d4ddc3003602000b130020004104360204200041cdddc3003602000b130020004101360204200041b8dcc3003602000b13002000410236020420004194d8c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010262206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b41204101102a000bb00901097f230041106b2202240020024100360208200242013703002002410436020c2002410c6a200210410240024002400240024002400240024020022802042203200228020822046b41044f0d00200441046a22052004490d0520034101742206200520052006491b22064100480d052003450d0120022802002003200610272203450d020c030b200441046a2105200228020021030c030b2006102622030d010b20064101102a000b20022006360204200220033602000b200241086a22062005360200200320046a41eede91ab063600002002410e36020c2002410c6a200210410240024002400240024020022802042203200628020022066b410e4f0d002006410e6a22052006490d0520034101742204200520052004491b22074100480d052003450d0120022802002003200710272204450d020c030b2006410e6a2105200228020021040c030b2007102622040d010b20074101102a000b2002200736020420022004360200200721030b200241086a22072005360200200420066a220641066a41002900bce543370000200641002900b6e5433700000240200320056b41034b0d00200541046a22062005490d0120034101742208200620062008491b22064100480d010240024002402003450d0020042003200610272204450d010c020b2006102622040d010b20064101102a000b20022006360204200220043602000b2007200541046a360200200420056a410a360000024020022802042203200728020022056b41034b0d00200541046a22062005490d0120034101742207200620062007491b22064100480d010240024002402003450d0020042003200610272204450d010c020b2006102622040d010b20064101102a000b20022006360204200220043602000b200241086a2203200541046a360200200420056a41df003600000240024002400240024020022802042205200328020022046b41044f0d00200441046a22032004490d0520054101742206200320032006491b22034100480d052005450d0120022802002005200310272205450d020c030b200228020021050c030b2003102622050d010b20034101102a000b20022003360204200220053602000b200241086a2208200441046a360200200520046a41df003600002002410736020c2002410c6a200210412008280200210641c4e5c30021072002280204210503400240024002400240200520066b41084f0d00200641086a22042006490d0520054101742203200420042003491b22094100480d052005450d01200228020020052009102722030d020c060b200641086a2104200228020021030c020b200910262203450d040b2002200936020420022003360200200921050b20082004360200200320066a2007290000370000200741086a28020021090240200520046b41034b0d00200441046a22062004490d022005410174220a20062006200a491b22064100480d02024002402005450d00200320052006102722030d010c060b200610262203450d050b2002200636020420022003360200200621050b2008200441046a2206360200200320046a20093600002007410c6a22074198e6c300470d000b200241106a24002006ad4220862003ad840f0b101e000b20094101102a000b20064101102a000bad1d03037f027e077f23004180096b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c20024188076a200241086a108f0120024198076a2802002101200228029407210320022802900721042002290388072105200241f8036a2002419c076a41e4001094041a0240024002400240024002400240024002400240024002400240024002402004450d00200241f8006a200241f8036a41e4001094041a20024188076a200241086a10aa0202402002280288072200450d00200229028c072106200241146a200241f8006a41e4001094041a20024188016a200136020020024184016a20033602002002200436028001200220053703782002418c016a200241146a41e4001094042101200241f4016a2006370200200220003602f001200241f8006a108a0320022903782205500d0620024188076a2005427f7c10970220024188076a200141201096040d06200241f0016a28020021004104210741002108410021090240200241f8016a280200220141f8016c41f801490d002001410c6c220a10262207450d0e200121090b02402001450d00200141f8016c210a200141037441786a2104200721010340200220003602f80320024188076a200241f8036a108b03200141086a20024188076a41086a28020036020020012002290388073702002001410c6a2101200041f8016a2100200a41887e6a220a0d000b200441037641016a21080b4104210b4100210a4100210c02402008410c6c2201410c490d002001410c6e220c41037422004100480d0f20001026220b450d100b0240200720016a22032007460d004100210a200b210120072100034020002802002104200141046a200041086a28020036020020012004360200200141086a2101200a41016a210a2000410c6a22002003470d000b0b20024188076a200b200a108c030240200c450d00200b10230b02402008450d002008410c6c21002007210103400240200141046a280200450d00200128020010230b2001410c6a2101200041746a22000d000b0b02402009450d00200710230b0240200241cc016a220120024188076a4120109604450d0041defdc400410e100f20014120101720024188076a412010170b200120024188076a41201096040d0a200241f4016a2802002108200241f8006a41f8006a2802002107200241f8006a4180016a280200210a20024180026a200241f8006a41f8001094041a2007200a41f8016c6a21002002290380022106200721010240200a450d00200241f8036a41f8006a210420024188076a41086a210320072101034020024198066a200141f0001094041a200141f0006a2903002105200241f8026a200141f8006a4180011094041a20054203510d04200241f8036a20024198066a41f0001094041a200241f8036a41f0006a20053703002004200241f8026a4180011094041a2002200241f8036a3602f00520024188076a200241f0056a108b032003280200210a0240200228028c07450d0020022802880710230b20024188076a200241f8036a41f8011094041a2002410036028006200241f0056a20024188076a200a20024180066a108d0320022802f0054101460d07024020022802f405220a450d00200a200241f0056a41086a280200100f0b200141f8016a22012000470d000b200021010b20012000470d030c040b02402001450d00200141246c21002004210103400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b2003450d00200410230b2002419c076a4101360200200241013602fc032002419ce6c3003602f8032002420137028c07200241a4e6c300360288072002200241f8036a3602980720024188076a41ace6c3001061000b200141f8016a22012000460d010b20024190086a210a20024188076a41f8006a21040340200241f8026a200141f0001094041a200141f0006a290300210520024188076a200141f8006a4180011094041a20054203510d0120024198066a200241f8026a41f0001094041a200241f8036a20024188076a4180011094041a20024188076a20024198066a41f0001094041a20024188076a41f0006a20053703002004200241f8036a4180011094041a200a1024200141f8016a22012000470d000b0b02402008450d00200710230b10e00220024188076a41086a22014200370300200242003703880741f5ccc200411120024188076a1000200241f8036a41086a200129030037030020022002290388073703f803200241f8036a411010032006108e03200610ed0210910110e50220024188076a10e402200220024180026a41106a2802002209360290062002280288022103200220024188076a41106a28020022013602940620092001470d06024002402009450d0020022802900721074100210a410021080340024002402003200a6a22012d000022042007200a6a22002d0000470d0002400240024002402004417f6a220b41034b0d000240200b0e0400040203000b024020032007460d00200141016a280000200041016a280000470d050b200141106a280200220b200041106a280200470d04200141086a280200220c200041086a280200220d460d05200c200d200b1096040d040c050b20032007460d04200141016a200041016a41201096040d030c040b024020032007460d00200141016a280000200041016a280000470d030b200141106a280200220b200041106a280200470d02200141086a280200220c200041086a280200220d460d03200c200d200b1096040d020c030b2001410c6a280200220b2000410c6a280200470d01200141046a280200220c200041046a280200220d460d02200c200d200b1096040d010c020b024020032007460d00200141016a280000200041016a280000470d010b200141106a280200220b200041106a280200470d00200141086a280200220c200041086a280200220d460d01200c200d200b109604450d010b41b4eec3004114100f200241f8036a2001108f0320022802f803220b200241f8036a41086a22042802001017024020022802fc03450d00200b10230b200241f8036a2000108f0320022802f803220b20042802001017024020022802fc03450d00200b10230b20012d000020002d00002204470d030b024002400240024002402004417f6a220441034b0d00024020040e0400040203000b024020032007460d00200141016a280000200041016a280000470d080b200141106a2802002204200041106a280200470d07200141086a2802002201200041086a2802002200460d04200120002004109604450d040c070b20032007460d03200141016a200041016a4120109604450d030c060b024020032007460d00200141016a280000200041016a280000470d060b200141106a2802002204200041106a280200470d05200141086a2802002201200041086a2802002200460d02200120002004109604450d020c050b2001410c6a28020022042000410c6a280200470d04200141046a2802002201200041046a2802002200460d01200120002004109604450d010c040b024020032007460d00200141016a280000200041016a280000470d040b200141106a2802002204200041106a280200470d03200141086a2802002201200041086a2802002200460d002001200020041096040d030b200a41246a210a200841016a22082009490d000b0b024020024180026a41346a220120024188076a41346a22004120109604450d0041defdc400410e100f2001412010172000412010170b2001200041201096040d08024020024198076a2802002200450d0020024188076a41086a2802002101200041246c210003400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b024020024194076a280200450d0020024190076a28020010230b024020024190026a2802002200450d0020024180026a41086a2802002101200041246c210003400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b02402002418c026a280200450d0020024188026a28020010230b20024180096a240042010f0b41dcc6c400104f000b20022802f4052201450d0120014103460d0220014104460d0341acc6c400104f000b41b4c5c400104f000b41fcc5c400104f000b41e4c5c400104f000b4194c6c400104f000b41ccc5c400104f000b200220024190066a36028006200220024194066a3602f005200241f8036a41146a4100360200200241f8026a41146a410336020020024184036a410436020020024198066a41146a4103360200200241a886c50036028804200242013702fc03200241c4c6c4003602f803200241043602fc022002420337029c06200241d480c500360298062002200241f8036a360288032002200241f0056a36028003200220024180066a3602f8022002200241f8026a3602a80620024198066a41ccc6c4001061000b41f4c6c400104f000b200a4104102a000b101e000b20004104102a000be3780b0c7f017e017f017e067f037e0b7f0b7e017f027e177f230041800a6b22012400200141003602c003200142043703b803024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041106a28020041246c2202450d0020002802082103410421044100210541002106410021070340024020032d00004101470d00200341106a2802002208417f4c0d04200341016a2800002109024002402008450d00200341086a280200210a20081026220b450d07200b200a20081094041a0c010b4101210b0b200141f0086a41086a220c200141b0056a41086a290200370300200120012902b0053703f008024020072006470d0002400240024020052006470d00200541016a220a2005490d1120054101742206200a200a2006491b2206ad42247e220d422088a70d11200da7220a4100480d112005450d012004200541246c200a102722040d020c0a0b200521060c020b200a10262204450d080b200120063602bc03200120043602b803200621050b2004200741246c6a220a2008360210200a200836020c200a200b360208200a2009360001200a41013a0000200a20012903f008370214200a411c6a200c290300370200200141b8036a41086a200741016a22073602000b200341246a21032002415c6a22020d000c020b0b4104210441002105410021070b200141003602f008418595c3004110200141f0086a41041004200141e0066a41086a22034200370300200142003703e00641af98c300410d200141e0066a1000200141d0076a41086a220a2003290300370300200120012903e0063703d00720012000290300220d3703f008200141d0076a4110200141f0086a4108100420034200370300200142003703e00641fd98c300410d200141e0066a1000200a2003290300370300200120012903e0063703d007200141103602f4082001200141d0076a3602f008200141b8036a200141f0086a10d60220034200370300200142003703e00641fc9cc3004111200141e0066a1000200a2003290300370300200120012903e0063703d007200141d0076a4110200041146a220a41201004411010262203450d03200341086a410029009299433700002003410029008a994337000020034110412010272203450d042003200d427f7c370010200141f0086a41186a22084200370300200141f0086a41106a22024200370300200141f0086a41086a220b4200370300200142003703f00820034118200141f0086a1002200141e8036a41186a2008290300370300200141e8036a41106a2002290300370300200141e8036a41086a200b290300370300200120012903f0083703e803200141e8036a4120200a4120100420031023200141e0066a41086a22034200370300200142003703e00641bc98c3004115200141e0066a1000200141d0076a41086a2003290300370300200120012903e0063703d007200141d0076a4110200041d4006a41201004200141f0086a10d4020240024002400240024020012802f4082203450d00200120033602880420012c00f008210220012802f808210e200141fc086a280200220a41d0004b0d02200e21080c010b200141013602880441002108410021024100210a0b20014188096a2000412c6a29000037030020014180096a200041246a290000370300200141f8086a2000411c6a290000370300200120002900143703f0080240200a2008470d00200841016a22032008490d0d2008410174220a20032003200a491b220ead420586220d422088a70d0d200da7220a4100480d0d2008450d022001280288042008410574200a10272203450d030c0a0b20012802880421032008210e0c0a0b200141f0086a41186a220b2000412c6a290000370300200141f0086a41106a2206200041246a290000370300200141f0086a41086a22092000411c6a290000370300200120002900143703f008200a20024d0d07200320024105746a220820012903f008370000200841186a200b290300370000200841106a2006290300370000200841086a2009290300370000200241187441808080086a41187541d1006f21020c0a0b200a102622030d070b200a4101102a000b101d000b20084101102a000b200a4104102a000b41104101102a000b41204101102a000b41a49dc3002002200a1029000b20012003360288042008210a0b2003200a4105746a220820012903f008370000200841186a200141f0086a41186a290300370000200841106a200141f0086a41106a290300370000200841086a200141f0086a41086a290300370000200a41016a210a0b200141e0066a41086a22084200370300200142003703e006418d9dc3004115200141e0066a1000200141d0076a41086a2008290300370300200120012903e0063703d007200141003602f808200142013703f008024002400240024002400240024002400240024002400240410110262208450d00200820023a000020014281808080103702f408200120083602f0082001200a3602b005200141b0056a200141f0086a104102400240024002400240200a450d00200a41057421064100200141f0086a41086a280200220a6b210220012802f008210920012802f408210b03400240200b20026a411f4b0d00200a41206a2208200a490d13200b410174220c20082008200c491b22084100480d1302400240200b450d002009200b2008102722090d010c060b200810262209450d050b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141f8086a200a3602002001200b3602f408200120093602f0080c010b200141f8086a280200210a20012802f408210b20012802f00821090b200141d0076a41102009200a10040240200b450d00200910230b0240200e450d0020012802880410230b200141e0066a41086a22034200370300200142003703e00641b49dc300410d200141e0066a1000200141d0076a41086a220a2003290300370300200120012903e0063703d007200141d0076a4110100320034200370300200142003703e00641c19dc3004111200141e0066a1000200a2003290300370300200120012903e0063703d007200141d0076a4110100341121026220a450d04200a41106a41002f00e29d433b0000200a41086a41002900da9d43370000200a41002900d29d43370000200141f0086a41186a22034200370300200141f0086a41106a22084200370300200141f0086a41086a22024200370300200142003703f008200a4112200141f0086a1002200141c8036a41186a220b2003290300370300200141c8036a41106a2008290300370300200141c8036a41086a2002290300370300200120012903f0083703c803412010262203450d05200320012903c803370000200341186a200b290300370000200341106a200141c8036a41106a290300370000200341086a200141c8036a41086a290300370000200a1023200341201018200310232000290300210f200141a8036a41d198c3004115109201024020012802a8034101470d0020012903b003210d200141e0066a41086a22034200370300200142003703e00641e698c3004117200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008200141f0086a411041a886c500410041001001417f470d00200141e0066a41086a22034200370300200142003703e00641e698c3004117200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f0082001200d3703b005200141f0086a4110200141b0056a410810040b200f423c824200520d09200141e0066a41086a22034200370300200142003703e00641c5cac4004114200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410021100240200141f0086a411041a886c500410041001001417f460d00200141003602b005200141f0086a4110200141b0056a41044100100141016a41044d0d0320012802b00521100b200141e0066a41086a22034200370300200142003703e00641dfbac400410f200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410221030240200141f0086a411041a886c500410041001001417f460d00200141003a00b005200141f0086a4110200141b0056a41014100100141016a41014d0d0720012d00b0052103200141f0086a411010030b200141f0076a20101075024002400240024020012802f007220e450d00200141f0076a41086a280200210020012802f4072111200141e0066a41086a22034200370300200142003703e00641a2adc4004112200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008200141003602b805200142013703b005200120003602880420014188046a200141b0056a10412000450d01200041057421064100200141b0056a41086a280200220a6b210220012802b005210920012802b405210b200e210303400240200b20026a411f4b0d00200a41206a2208200a490d15200b410174220c20082008200c491b22084100480d1502400240200b450d002009200b2008102722090d010c090b200810262209450d080b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141b8056a200a3602002001200b3602b405200120093602b0050c020b200341ff01714102472003712112200141e0066a41086a22034200370300200142003703e00641a2adc4004112200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f00841002111200141f0086a411041a886c500410041001001417f460d022001421037028c042001200141f0086a36028804200141b0056a20014188046a102820012802b005220e450d0a200141b8056a280200210020012802b40521110c0b0b200141b0056a41086a280200210a20012802b405210b20012802b00521090b200141f0086a41102009200a10040240200b450d00200910230b410121120c090b4101210e410021000c080b20084101102a000b20084101102a000b41d4aac10041331021000b41014101102a000b41124101102a000b41204101102a000b41d4aac10041331021000b41d4aac10041331021000b200141e0066a41086a22034200370300200142003703e00641c5cac4004114200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410121132001201041016a22033602b005200141f0086a4110200141b0056a41041004200120033602f408200141033a00f0084100210241a886c5004100200141f0086a102c0240024002400240024002400240024002400240024002400240024002400240024002400240024020004105742203450d0020034105752210ad42e0007e220d422088a70d1a200da7220a4100480d1a200a10262213450d03200e20036a200e470d010c020b41002110200e20036a200e460d010b2000410574210b200141f0086a41206a2103200141b0056a41017221084100210220132106200e210a0340200141f0076a41186a2209200a41186a290000370300200141f0076a41106a220c200a41106a290000370300200141f0076a41086a2200200a41086a2900003703002001200a2900003703f007200141b0056a200141f0076a10fe020240024020012d00b0054101470d0020014188046a41386a200841386a29000037030020014188046a41306a200841306a29000037030020014188046a41286a200841286a29000037030020014188046a41206a200841206a29000037030020014188046a41186a200841186a29000037030020014188046a41106a200841106a29000037030020014188046a41086a200841086a29000037030020012008290000370388040c010b20014188046a41386a420037030020014188046a41306a420037030020014188046a41286a420037030020014188046a41206a420037030020014188046a41186a420037030020014188046a41106a420037030020014188046a41086a420037030020014200370388040b200a41206a210a2003200129038804370000200141f0086a41186a2009290300370300200141f0086a41106a200c290300370300200141f0086a41086a2000290300370300200341086a20014188046a41086a290300370000200341106a20014188046a41106a290300370000200341186a20014188046a41186a290300370000200341206a20014188046a41206a290300370000200341286a20014188046a41286a290300370000200341306a20014188046a41306a290300370000200341386a20014188046a41386a290300370000200120012903f0073703f008200241016a21022006200141f0086a41e00010940441e0006a2106200b41606a220b0d000b0b02402011450d00200e10230b2012450d0f4108210e410021084100211102402013200241e0006c6a220320136b221441e000490d00201441e0006e221141286c220a4100480d18200a1026220e450d030b0240201320034622150d00200241e0006c210b201341206a210a41002108200e21030340200141f0086a41186a200a41186a2900002216370300200141f0086a41106a200a41106a2900002217370300200141f0086a41086a200a41086a2900002218370300200a290000210d200141e8036a41086a22062018370300200141e8036a41106a22092017370300200141e8036a41186a220c20163703002001200d3703e8032001200d3703f008200141c8036a41186a2200200c290300370300200141c8036a41106a220c2009290300370300200141c8036a41086a22092006290300370300200120012903e8033703c803200341186a2000290300370200200341106a200c290300370200200341086a2009290300370200200320012903c803370200200341206a4201370300200341286a2103200a41e0006a210a200841016a2108200b41a07f6a220b0d000b0b4108210c200141d0076a41086a22034200370300200142003703d00741dbcbc300411b200141d0076a100020014188046a41086a2003290300370300200120012903d0073703880441002100024020014188046a411041a886c500410041001001417f460d00200142103702b405200120014188046a3602b005200141f0086a200141b0056a10890220012802f008220c450d0220012802f40821002008200141f8086a280200470d050c040b20084100460d030c040b200a4101102a000b41d4aac10041331021000b200a4108102a000b200e200c460d01417f210b200e2103200c210a0340200b41016a220b20084f0d022003200a41201096040d01200a41206a2106200341206a2109200341286a2103200a41286a210a20092903002006290300510d000b0b200141d0076a41086a22034200370300200142003703d00741aec8c3004117200141d0076a100020014188046a41086a2003290300370300200120012903d0073703880420014188046a411041a886c500410041001001417f460d01200142003703f00820014188046a4110200141f0086a41084100100141016a41084d0d0520012903f008210d200142003703f00820014188046a4110200141f0086a41084108100141016a41084d0d0520012903f008211620014188046a41101003200120083602f808200120113602f4082001200e3602f008200141f0086a200d4201201610ef0220000d020c030b02402000450d00200c10230b2011450d02200e102320120d030c090b200120083602f808200120113602f4082001200e3602f008200141f0086a42004200200d10ef022000450d010b200c10230b2012450d060b4101210e41002108410021120240201441e000490d00201441e0006e221241057422031026220e450d030b024020150d00200241e0006c2102201341c0006a210341002108200e210a0340200141f0086a41186a200341186a2900002216370300200141f0086a41106a200341106a2900002217370300200141f0086a41086a200341086a29000022183703002003290000210d200141e8036a41086a220b2018370300200141e8036a41106a22062017370300200141e8036a41186a220920163703002001200d3703e8032001200d3703f008200141c8036a41186a220c2009290300370300200141c8036a41106a22092006290300370300200141c8036a41086a2206200b290300370300200120012903e8033703c803200a41186a200c290300370000200a41106a2009290300370000200a41086a2006290300370000200a20012903c803370000200341e0006a2103200841016a2108200a41206a210a200241a07f6a22020d000b0b200141d0076a41086a22034200370300200142003703d0074192adc4004110200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e0060240200141e0066a411041a886c500410041001001417f460d00200142103702b4052001200141e0066a3602b005200141f0086a200141b0056a102820012802f0082211450d0220012802f40821142008200141f8086a280200470d050c040b410121114100211420084100460d030c040b41d4aac10041331021000b41d4aac10041331021000b20034101102a000b0240200e2011460d002008450d0041002102200e21032011210a03402003200a41201096040d02200341206a2103200a41206a210a200241016a22022008490d000b0b02402014450d00201110230b2012450d01200e102320100d020c030b200141d0076a41086a22034200370300200142003703d0074192adc4004110200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e006200141003602f808200142013703f008200120083602b005200141b0056a200141f0086a1041024002402008450d00200841057421094100200141f0086a41086a280200220a6b210b20012802f008210c20012802f4082106200e2103034002402006200b6a411f4b0d00200a41206a2202200a490d0c20064101742200200220022000491b22024100480d0c024002402006450d00200c200620021027220c0d010c090b20021026220c450d080b200221060b200c200a6a22022003290000370000200241186a200341186a290000370000200241106a200341106a290000370000200241086a200341086a290000370000200b41606a210b200a41206a210a200341206a2103200941606a22090d000b200141f8086a200a360200200120063602f4082001200c3602f0080c010b200141f0086a41086a280200210a20012802f408210620012802f008210c0b200141e0066a4110200c200a100402402006450d00200c10230b200141003602f808200142013703f008410110262203450d06200341003a000020014281808080103702f408200120033602f008200120083602b005200141b0056a200141f0086a104102402008450d00200841057421064100200141f0086a41086a280200220a6b210220012802f008210920012802f408210b200e210303400240200b20026a411f4b0d00200a41206a2208200a490d0b200b410174220c20082008200c491b22084100480d0b02400240200b450d002009200b2008102722090d010c090b200810262209450d080b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141f8086a200a3602002001200b3602f408200120093602f0080b20014188046a41086a2203200141f0086a41086a280200360200200120012903f00837038804200141bb056a200328020036000020012001290388043700b30502402012450d00200e10230b200141fc086a200141b7056a290000370000200141e1eac98b063600f108200141023a00f008200120012900b0053700f508200141f0086a10d5022014450d00201110230b2010450d010b201310230b0240200f4280e20e82500d00200141e0066a21190c050b200141d0076a41086a22034200370300200142003703d00741f186c000411f200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e0060240200141e0066a411041a886c500410041001001417f460d00200141003a00f008200141e0066a4110200141f0086a41014100100141016a41014d0d0320012d00f0082103200141e0066a411010032003450d00200141e0066a2119200f101f450d05200f102e1a0c050b200141e0066a2119200f102e450d04200f101f1a0c040b20024101102a000b20084101102a000b41d4aac10041331021000b41014101102a000b200141d0076a41086a22034200370300200142003703d007419087c0004113200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e006410021030240024002400240024002400240024002402019411041a886c500410041001001417f460d00200141003602f008200141e0066a4110200141f0086a41044100100141016a41044d0d0120012802f00821030b200141d0076a41086a220a4200370300200142003703d00741a387c0004119200141d0076a1000200141e0066a41086a200a290300370300200120012903d0073703e0064100210a02402019411041a886c500410041001001417f460d00200141003602f008200141e0066a4110200141f0086a41044100100141016a41044d0d0220012802f008210a0b02400240024002402003200a4f0d00200141fc086a210b200141f8086a210802400340200141f0086a2003103820082802002202410e470d01200341016a2203200a490d000c020b0b20012903f008210d20014188046a200b41fc001094041a200141f0076a20014188046a41fc001094041a20014180096a220820023602002001200d3703f808200120033602f00820014184096a200141f0076a41fc00109404210b0240200d200f520d00200141e0066a41086a2208200141f0086a41086a290300370300200120012903f0083703e006200141b0056a200b41fc001094041a20014188046a41086a220b2008290300370300200120012903e00637038804200141f0086a200141b0056a41fc001094041a4190011026221a450d07201a200129038804370300201a2002360210201a41086a200b290300370300201a41146a200141f0086a41fc001094041a200341016a2203200a4f0d03200141f0086a41106a2109200141f0086a41146a210c200141fc086a2100200141f0086a41086a21024101211b410121080340200141f0086a2003103802402002280200220b410e470d00200341016a2203200a490d010c040b20012903f008210d20014188046a200041fc001094041a200141f0076a20014188046a41fc001094041a2009200b3602002002200d370300200120033602f008200c200141f0076a41fc001094042106200d200f520d05200141e0066a41086a220e2002290300370300200120012903f0083703e006200141b0056a200641fc001094041a200141d0076a41086a2213200e290300370300200120012903e0063703d007200141f0086a200141b0056a41fc001094041a0240201b2008470d00201b41016a2206201b490d0f201b410174220e20062006200e491b2206ad4290017e220d422088a70d0f200da7220e4100480d0f02400240201b450d00201a201b4190016c200e1027221a0d010c0c0b200e1026221a450d0b0b2006211b0b201a20084190016c6a220620012903d007370300200641086a2013290300370300200641106a200b360200200641146a200141f0086a41fc001094041a200841016a2108200341016a2203200a490d000c030b0b200810240b4100211b4108211a410021080b419001211c201a20084190016c6a211d2008450d060c070b4101211b419001211c201a41014190016c6a211d41010d060c050b20091024419001211c201a20084190016c6a211d20080d050c040b41d4aac10041331021000b41d4aac10041331021000b4190014108102a000b200e4108102a000b201a2223201d460d020c010b20014188046a41086a211e200141f0086a41086a210e200141f0086a410472210320014188046a410c6a211f20014188046a41f8006a2120200141f9086a212120014188056a2122201a212302400340202341106a280200210a2023290208210d20232802002102200141f0086a202341146a41fc001094041a2023201c6a2123200a410e460d01200141f0076a200141f0086a41fc001094041a201e200a3602002001200d37038804201f200141f0076a41fc001094041a200141b0056a2002103020012802b0052109024002400240200141b0056a41086a2213280200220a450d00200a410574210b420021242009210a4200212542002126420021274200212842002129034020014198036a200a103420014198036a41086a2903002116200129039803210d2003200a290000370000200341086a200a41086a290000370000200341106a200a41106a290000370000200341186a200a41186a290000370000200120023602f00820014190036a200141f0086a103120012d00900341017121080240024020012d0091032206450d00200141f0026a201642002006ad2217420010980420014180036a200d420020174200109804200141e0026a42004200200d4200109804427f20014180036a41086a290300221720012903f00220012903e0027c7c221820012903f80220012903e8028442005220182017547222061b2117427f20012903800320061b21180c010b200141d0026a200d2016420a420010970420012903d0022218210d200141d0026a41086a290300221721160b200a41206a210a4200201720081b20277c4200201820081b222a20267c2226202a54ad7c21272017420020081b20297c2018420020081b221720287c2228201754ad7c2129201620257c200d20247c2224200d54ad7c2125200b41606a220b0d000b20012802b405450d020c010b42002128420021294200212642002127420021244200212520012802b405450d010b200910230b200141b0056a2002103020012802b00521100240024002402013280200220a450d00200a410574210b420021182010210a4200212b4200212a4200212c4200212d4200212e03402003200a290000370000200341086a200a41086a2208290000370000200341106a200a41106a2206290000370000200341186a200a41186a2209290000370000200120023602f008200141c8026a200141f0086a103120012d00c802210c20012d00c9022100200141f0086a41186a2009290000370300200141f0086a41106a2006290000370300200e20082900003703002001200a2900003703f008200141a8026a2002200141f0086a200041101032200141a8026a41186a290300202b7c20012903b802220d20187c2218200d54ad7c212b4200200141a8026a41086a290300220d200c41017122081b202c7c420020012903a802221620081b2217202a7c222a201754ad7c212c200d420020081b202e7c2016420020081b220d202d7c222d200d54ad7c212e200a41206a210a200b41606a220b0d000b20012802b405450d020c010b4200212d4200212e4200212a4200212c420021184200212b20012802b405450d010b201010230b42002116200141d0076a41086a222f4200370300200142003703d00741ecb5c1004116200141d0076a1000200141e0066a41086a2214202f290300370300200120012903d0073703e006024002402019411041a886c500410041001001417f460d00200142003703f808200142003703f008200141e0066a4110200141f0086a411041001001220a417f460d09200a410f4d0d09200e290300210d20012903f00821160c010b4200210d0b024002400240201820247c2217420288202b20257c2017201854ad7c2218423e868422242017852018420288222520188584500d002024202584500d004100210a0240034020014198026a20172018200a41046a41fe0071109a04200a41026a210a200129039802222420178520014198026a41086a290300222520188584500d0120242025844200520d000b0b20014188026a20172018200a41fe0071109a0420012903880220014188026a41086a29030084212442002125200a450d012024420052ad21240340200141e8016a201720184100200a417e6a22082008200a4b1b220a41ff0071109a04200141f8016a20244201862230420184222b20254201862024423f88842225202b20251098042030202b20012903f80120012903e80156200141f8016a41086a2903002224200141e8016a41086a29030022315620242031511b1b2124200a0d000c030b0b420021252017201884420052ad21240c010b2024420052ad21240b0240024002400240024002402016420288200d423e86842217201685200d4202882218200d8584500d002017201884500d004100210a02400340200141d8016a2016200d200a41046a41fe0071109a04200a41026a210a20012903d8012217201685200141d8016a41086a2903002218200d8584500d0120172018844200520d000b0b200141c8016a2016200d200a41fe0071109a0420012903c801200141c8016a41086a29030084211742002118200a450d012017420052ad21170340200141a8016a2016200d4100200a417e6a22082008200a4b1b220a41ff0071109a04200141b8016a20174201862230420184222b20184201862017423f88842218202b20181098042030202b20012903b80120012903a80156200141b8016a41086a2903002217200141a8016a41086a29030022315620172031511b1b2117200a0d000b202420258450450d020c030b420021182016200d84420052ad2117202420258450450d010c020b2017420052ad21172024202584500d010b202c20277c202a20267c2216202a54ad7c212b202e20297c202d20287c220d202d54ad7c212a20222d0000220a4102460d010240200a4101470d000340202521252024212620172018844200510d0a20014188016a200d202a2026202510970420014198016a2016202b2017201810970441012115200129039801222720012903880122285420014198016a41086a290300222420014188016a41086a290300222d542024202d51220a1b0d042028202754202d202454200a1b0d02200141f8006a2027202420172018109804200141e8006a2028202d20262025109804200d200129036822247d222d202a200141e8006a41086a2903007d200d202454ad7d222784500d02202b200141f8006a41086a2903007d212820162001290378220d54210a2016200d7d21242017210d2018212a202d211720272118202621162025212b20242028200aad7d22258450450d000c040b0b0340200141d8006a2016202b202420251097042017222620182227844200510d0a200141d8006a41086a290300211720012903582118200141c8006a200d202a2026202710970441012115201820012903482228542017200141c8006a41086a290300222d542017202d51220a1b0d032028201854202d201754200a1b0d01200141386a2018201720242025109804200141286a2028202d20262027109804200d200129032822177d2218202a200141286a41086a2903007d200d201754ad7d222d84500d01202b200141386a41086a2903007d212820162001290338220d54210a2016200d7d21172024210d2025212a20182124202d2125202621162027212b20172028200aad7d22188450450d000c030b0b410021150c010b200d201656202a202b56202a202b511b21150b200141f0086a2002103020012802f408213220012802f00821330240200e280200220a450d00200a41057421342033210a0340200141c8036a41186a2208200a41186a2209290000370300200141c8036a41106a220b200a41106a220c290000370300200141c8036a41086a2206200a41086a22002900003703002001200a2900003703c803200141d0076a41186a22352009290000370300200141d0076a41106a2236200c290000370300202f2000290000370300200a290000210d200141e8036a41086a22102006290300370300200141e8036a41106a2212200b290300370300200141e8036a41186a221120082903003703002001200d3703d007200120012903c8033703e803200a290000210d200341186a22372009290000370000200341106a2238200c290000370000200341086a223920002900003700002003200d370000200120023602f008200141206a200141f0086a1031410221090240201520012d0020410171220c45734101470d0020012d0021213a200141b0056a41186a2011290300370300200141b0056a41106a201229030037030020132010290300370300200120012903e8033703b005200c21090b200141e0066a41186a2200200141b0056a41186a223b290300370300200141e0066a41106a223c200141b0056a41106a223d29030037030020142013290300370300200120012903b0053703e006024020094102470d00200a41206a210a203441606a22340d010c020b0b200141c0066a41186a223e2000290300370300200141c0066a41106a223f203c290300370300200141c0066a41086a22402014290300370300200120012903e0063703c00620014190056a41186a2241203e29030037030020014190056a41106a2242203f29030037030020014190056a41086a22432040290300370300200120012903c00637039005200141f0086a41186a22442041290300370300200141f0086a41106a22452042290300370300200e2043290300370300200142e4cab5fbb6ccdcb0e3003703b80620012001290390053703f008200141b8066a200141f0086a203a41187441187541027441a8f9c4006a3502004280e90f7e200f7c106320344120460d00203441406a21464100210c03402008200a200c6a220941386a2234290000370300200b200941306a223a2900003703002006200941286a22472900003703002001200941206a22092900003703c803203520342900003703002036203a290000370300202f20472900003703002009290000210d201020062903003703002012200b290300370300201120082903003703002001200d3703d007200120012903c8033703e803200120023602f0082009290000210d20472900002116203a29000021172037203429000037000020382017370000203920163700002003200d370000200141186a200141f0086a1031410221090240201520012d0018410171223445734101470d0020012d00192148203b2011290300370300203d201229030037030020132010290300370300200120012903e8033703b005203421090b2000203b290300370300203c203d29030037030020142013290300370300200120012903b0053703e0060240024020094102470d002046200c470d010c030b203e2000290300370300203f203c29030037030020402014290300370300200120012903e0063703c0062041203e2903003703002042203f29030037030020432040290300370300200120012903c006370390052044204129030037030020452042290300370300200e2043290300370300200142e4cab5fbb6ccdcb0e3003703b80620012001290390053703f008200141b8066a200141f0086a204841187441187541027441a8f9c4006a3502004280e90f7e200f7c10632046200c460d020b200c41206a210c0c000b0b02402032450d00203310230b2002103502400240024002400240024002402015450d00200141f0086a410c6a220a2002360200200e41043a0000200141053a00f00841a886c5004100200141f0086a102c2020290300220d4200510d01200141b0056a20014188046a4188011094041a200141c0066a200d200f7c220d1036200141f0086a200141b0056a4188011094041a200141e0066a200e41f0001094041a20012802c4062206200141c0066a41086a2208280200220a470d02200a41016a220b200a490d0b200a4101742206200b200b2006491b2206ad42f8007e2216422088a70d0b2016a722094100480d0b200a450d0320012802c006200a41f8006c20091027220b0d040c110b200141f0086a410c6a2002360200200e41053a0000200141053a00f00841a886c5004100200141f0086a102c202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a41041004201e10242023201d470d060c050b200141f0086a201e41f0001094041a200141003b01b005200141106a200141f0086a200141b0056a10d20220012802102108200a200236020020212008453a0000200e41073a0000200141053a00f00841a886c5004100200141f0086a102c202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a410410042023201d470d050c040b20012802c006210b0c020b20091026220b450d0d0b200120063602c4062001200b3602c0060b200b200a41f8006c22006a200141e0066a41f00010940421092008200a41016a220c360200200941f0006a200236020041171026220a450d09200a410f6a41002900cb8740370000200a41086a41002900c48740370000200a41002900bc8740370000200a4117412e1027220a450d0a200a200d370017200141f0086a41186a22084200370300200141f0086a41106a22094200370300200e4200370300200142003703f008200a411f200141f0086a1002200141d0076a41186a2008290300370300200141d0076a41106a2009290300370300202f200e290300370300200120012903f0083703d007200141203602f4082001200141d0076a3602f008200141c0066a200141f0086a105c200a10230240200c450d00200041f8006a2108200b210a03400240200a280200410e460d00200a10240b200a41f8006a210a200841887f6a22080d000b0b02402006450d00200b10230b202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a410410042023201d470d010b0b201d21230b2023201d460d010b200141f0086a41106a210a200141f0086a41146a210b0340200141e0066a41086a2208202341086a290300370300200120232903003703e006202341106a2802002103200141f0086a202341146a41fc001094041a2003410e460d0120014188046a41086a22022008290300370300200120012903e00637038804200141b0056a200141f0086a41fc001094041a200a2003360200200141f0086a41086a200229030037030020012001290388043703f008200b200141b0056a41fc001094041a200a102420234190016a2223201d470d000b0b0240201b450d00201a10230b411710262203450d072003410f6a41002900cb8740370000200341086a41002900c48740370000200341002900bc874037000020034117412e10272203450d082003200f370017200141f0086a41186a220a4200370300200141f0086a41106a22084200370300200141f0086a41086a22024200370300200142003703f0082003411f200141f0086a1002200141d0076a41186a200a290300370300200141d0076a41106a2008290300370300200141d0076a41086a2002290300370300200120012903f0083703d00702400240200141d0076a412041a886c500410041001001417f460d00200142203702b4052001200141d0076a3602b005200141f0086a200141b0056a103720012802f008220e450d0b20012902f408210d200141d0076a41201003200d422088a7210a200da721130c010b410021134108210e4100210a0b20031023200e200a41f8006c22036a210202400240024002402003450d00200341887f6a2108200141f0086a4104722106200141fc086a2109200141f9086a210c200141f8086a2100200e210303402003280200210a200141b0056a200341046a41ec001094041a200a410f460d02200141f0086a200141b0056a41ec001094041a024002400240200a410e470d0020080d010c020b200341f0006a280200210b20014188046a200141f0086a41ec001094041a2001200a3602f008200620014188046a41ec001094041a200141003b01b005200141086a200141f0086a200141b0056a10d2022001280208210a2009200b360200200c200a453a0000200041073a0000200141053a00f00841a886c5004100200141f0086a102c2008450d010b200341f8006a2103200841887f6a21080c010b0b200222032002470d020c030b200e22032002470d010c020b200341f8006a22032002460d010b200141f0086a410472210803402003280200210a200141f0086a200341046a41f4001094041a200a410f460d01200141b0056a200141f0086a41f4001094041a2001200a3602f0082008200141b0056a41f4001094041a0240200a410e460d00200141f0086a10240b200341f8006a22032002470d000b0b02402013450d00200e10230b200f10880202402007450d00200741246c210a2004210303400240024020032d0000220841034b0d0002400240024020080e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a2103200a415c6a220a0d040c050b2003410c6a280200450d02200341086a2802001023200341246a2103200a415c6a220a0d030c040b2003410c6a280200450d01200341086a2802001023200341246a2103200a415c6a220a0d020c030b200341086a280200450d00200341046a28020010230b200341246a2103200a415c6a220a0d000b0b02402005450d00200410230b200141800a6a24000f0b101e000b418c95c400104f000b418c95c400104f000b41d4aac10041331021000b41174101102a000b412e4101102a000b20094108102a000b41174101102a000b412e4101102a000b41d4aac10041331021000bf31103057f027e087f230041206b22022400024002400240024002400240024002400240024002400240024041fa0110262203450d00200242fa0137020420022003360200200341003b0000410221042002410236020820022802002105200228020421060240200128020022032903704202520d0041022101024020064102470d0020054102410410272205450d032002410436020420022005360200200241086a28020021010b200520016a41013a0000200241086a2205200528020041016a3602000c060b024020064102470d0020054102410410272205450d032002410436020420022005360200200241086a28020021040b200520046a4181013a0000200241086a2205200528020041016a360200200341086a200210ec0202400240024020022802042201200528020022056b41c0004f0d00200541c0006a22062005490d0920014101742205200620062005491b22054100480d092001450d0120022802002001200510272201450d020c060b200228020021010c060b2005102622010d040b20054101102a000b41fa014101102a000b41044101102a000b41044101102a000b2002200536020420022001360200200241086a28020021050b200241086a2206200541c0006a360200200120056a220541086a200341346a290000370000200541106a2003413c6a290000370000200541186a200341c4006a290000370000200541206a200341cc006a290000370000200541286a200341d4006a290000370000200541306a200341dc006a290000370000200541386a200341e4006a2900003700002005200329002c3700002003200210980202400240024002400240024002400240024002400240200341f0006a2903004201520d0020032903782207420c882208420120084201561b22084200510d0620034180016a290300200880210820022802042201200241086a28020022056b41024f0d01200541026a22062005490d0c20014101742205200620062005491b22054100480d0c2001450d0420022802002001200510272201450d050c090b0240200228020420062802002205470d00200541016a22012005490d0c20054101742206200120012006491b22064100480d0c2005450d0220022802002005200610272201450d030c070b200228020021010c070b200228020021010c080b2006102622010d040b20064101102a000b2005102622010d040b20054101102a000b41b099c300104f000b2002200636020420022001360200200241086a28020021050b200241086a200541016a360200200120056a41003a00000c020b2002200536020420022001360200200241086a28020021050b200241086a200541026a360200200120056a2008a741047420077aa7417f6a22054101200541014b1b2205410f2005410f491b723b00000b20034188016a20021039200241086a22032802002105200241003602182002420137031020022005417e6a36021c2002411c6a200241106a1041024002400240024002402003280200220541014d0d002002280218210620022802102104200228021421092003410036020020022802002103024002400240024002400240024002402005417e6a220a450d004102210b2006450d12200320042d00003a00004101210c200241086a2201200128020041016a36020020064101460d12200420066a210d200320042d00013a00012001200128020041016a3602004102210b200441026a21014100210e2006417e6a2203450d052002280204220b20056b20034f0d01200520036a220c2005490d0d200b4101742205200c200c2005491b220c4100480d0d200b450d022002280200200b200c102722050d030c0a0b0240024002402002280204220520064f0d0020054101742201200620062001491b22014100480d0f2005450d0120032005200110272203450d020c110b4100210b2006450d120c110b2001102622030d0f0b20014101102a000b200228020021050c020b200c10262205450d070b2002200c360204200220053602000b200520066a200541026a200a1095041a02402006200241086a220b280200220c460d002002280200200c6a210520062103034020034102460d03200520012d00003a0000200b200b28020041016a360200200541016a2105200141016a2101200c2003417f6a2203470d000b200d20016b2203450d030b20034100480d0820031026220c450d042006210b2003210e0b200d2001460d060c050b2006210b200a0d0b0c0c0b4101210c2006210b200d2001470d030c040b41cce3c400104f000b20034101102a000b200c4101102a000b200c20012d00003a00004101210f0240200141016a2203200d460d00200c41016a2105200620016b21010340200520032d00003a0000200541016a2105200d200341016a2203470d000b200420016a220f450d010b200c200f6a210d024002400240024020022802042203200b200a6a22056b200f4f0d002005200f6a22012005490d0520034101742205200120012005491b22054100480d052003450d01200228020020032005102722030d020c060b200228020021030c020b200510262203450d040b20022005360204200220033602000b2003200f200b6a22106a2003200b6a200a1095041a02402010200241086a22012802002203460d00200228020020036a2105200f200b6a20036b2106200c21030340200d2003460d01200520032d00003a00002001200128020041016a360200200341016a2103200541016a21052006417f6a22060d000b0b2010210b0b0240200e450d00200c10230b200a450d060c050b101e000b20054101102a000b2002200136020420022003360200200241086a280200210b0b2003200b6a220520042d00003a0000024020064101470d00200b41016a210b0c010b2006417f6a2101200441016a2103200541016a21050340200520032d00003a0000200541016a2105200341016a21032001417f6a22010d000b200b20066a210b0b200241086a200b3602004102210b200a450d010b0240200b200241086a22052802002203460d002002280200220120036a2001200b6a200a1095041a0b20052003200a6a3602000b02402009450d00200410230b20002002290300370200200041086a200241086a280200360200200241206a24000bcb03010b7f230041206b22032400024002402002450d0020024102742204102622050d0120044104102a000b410421050b0240024002400240200120024103746a22062001460d0020024103742107200141046a210420052108034020082004280200360200200441086a2104200841046a2108200741786a22070d000b200641786a20016b41037641016a21094101210a4100210b4100210403402001280200210c0240024002400240200b20046b200141046a28020022084f0d00200420086a22072004490d07200b410174220d20072007200d491b220d4100480d07200b450d01200a200b200d1027220a0d020c080b200820046a21070c020b200d1026220a450d060b200d210b0b200a20046a200c20081094041a20072104200141086a22012006470d000c020b0b4101210a410021094100210b0b200341186a22044200370300200341106a22014200370300200341086a2208420037030020034200370300200a2005200920031019200041186a2004290300370000200041106a2001290300370000200041086a2008290300370000200020032903003700000240200b450d00200a10230b02402002450d00200510230b200341206a24000f0b101e000b200d4101102a000bd41805017f017e037f017e067f230041c0066b22042400200441e8036a200141f8011094041a200441c0026a200441e8036a10960202400240024020042802c0024101470d00200041086a20042902c4023702002000420137020020032802002200450d020c010b200441c0026a41086a2903002105200441a8016a200441d0026a4198011094041a20042005370308200441086a41086a200441a8016a419801109404210602400240024020042802382201410d460d0020014102460d010c020b2004413c6a2802000d01200441fc036a4101360200200441013602c4022004418898c4003602c002200442013702ec03200441d497c4003602e8032004200441c0026a3602f803200441e8036a41d0cec3001061000b10ff02000b200441a8016a41086a22014200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a2001290300370300200420042903a8013703e80341002101024002400240024002400240024002400240024002400240024002400240200441e8036a411041a886c500410041001001417f460d00200441003602c002200441e8036a4110200441c0026a41044100100141016a41044d0d0120042802c00221010b41042107200120026a41818080024f0d0d410021080240200441106a410020042903084201511b2201450d002001450d00024002400240200110d702220520012903202209520d0041032107200120021086020d11411310262207450d0d2007410f6a41002800a99943360000200741086a41002900a299433700002007410029009a994337000020074113413310272207450d0e200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441e8036a41186a220a4200370300200441e8036a41106a220b4200370300200441e8036a41086a220c4200370300200442003703e80320074133200441e8036a1002200441c0026a41186a200a290300370300200441c0026a41106a200b290300370300200441c0026a41086a200c290300370300200420042903e8033703c002200441c0026a412041a886c500410041001001417f460d01200442003703e803200441c0026a4120200441e8036a41084100100141016a41084d0d0820042903e80342017c2105200710234113210a4113102622070d020c0f0b4101410220092005541b21070c100b42012105200710234113210a411310262207450d0d0b2007410f6a41002800a99943360000200741086a41002900a299433700002007410029009a99433700002007200a413310272207450d0d200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441e8036a41186a22014200370300200441e8036a41106a220a4200370300200441e8036a41086a220b4200370300200442003703e80320074133200441e8036a1002200441c0026a41186a2001290300370300200441c0026a41106a200a290300370300200441c0026a41086a200b290300370300200420042903e8033703c002200420053703e803200441c0026a4120200441e8036a41081004200710230b024020032802002207450d00200341086a28020021012003280204210d4100210b0240418595c300411041a886c500410041001001417f460d00200441003602e803418595c3004110200441e8036a41044100100141016a41044d0d0520042802e803210b0b411410262208450d06200841106a41002800ef9643360000200841086a41002900e79643370000200841002900df96433700002008411441281027220a450d07200a200b360014200441e8036a41186a22084200370300200441e8036a41106a220b4200370300200441e8036a41086a220c4200370300200442003703e803200a4118200441e8036a1002200441c0026a41186a2008290300370300200441c0026a41106a200b290300370300200441c0026a41086a200c290300370300200420042903e8033703c002200441003602f003200442013703e803200420013602a801200441a8016a200441e8036a1041024002400240024020042802ec03220c20042802f003220b6b20014f0d00200b20016a2208200b490d0c200c410174220e20082008200e491b220e4100480d0c200c450d0120042802e803200c200e102722080d020c0d0b20042802e80321080c020b200e10262208450d0b0b2004200e3602ec03200420083602e803200e210c0b2008200b6a200720011094041a200441c0026a41202008200b20016a10040240200c450d00200810230b200a102341012108200d450d00200710230b20042903082105200441e8036a200441306a41f8001094041a200441c0026a200441e8036a41086a41f0001094041a200441a8016a41186a220a200641186a290300370300200441a8016a41106a220b200641106a290300370300200441a8016a41086a220c200641086a290300370300200420062903003703a80141002101024020054201520d0020044180066a41186a200a29030037030020044180066a41106a200b29030037030020044180066a41086a200c290300370300200420042903a80137038006410121010b200441a8016a200441c0026a41f0001094041a200441a0066a41186a220620044180066a41186a220a290300370300200441a0066a41106a220b20044180066a41106a220c290300370300200441a0066a41086a220d20044180066a41086a220e29030037030020042004290380063703a006200441c0026a200441a8016a41f0001094041a200441e0056a41186a220f2006290300370300200441e0056a41106a2206200b290300370300200441e0056a41086a220b200d290300370300200420042903a0063703e005200441e8036a200441c0026a41f0001094041a200a200f290300370300200c2006290300370300200e200b290300370300200420042903e005370380064102210602402001450d00200441a0066a41186a20044180066a41186a290300370300200441a0066a41106a20044180066a41106a290300370300200441a0066a41086a20044180066a41086a29030037030020042004290380063703a006410121060b200441b2016a200441a0066a41086a290300370100200441ba016a200441a0066a41106a290300370100200441a8016a411a6a200441b8066a290300370100200420063a00a901200441003a00a801200420042903a0063701aa012004200441e8036a200441a8016a10d202200428020421062004200428020022014100473a00e903200441003a00e80341a886c5004100200441e8036a102c02400240418595c300411041a886c500410041001001417f460d00200441003602e803418595c3004110200441e8036a41044100100141016a41044d0d0320042802e80341016a210a0c010b4101210a0b200441a8016a41086a220b4200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a200b290300370300200420042903a8013703e80302400240200441e8036a411041a886c500410041001001417f460d00200441003602a801200441e8036a4110200441a8016a41044100100141016a41044d0d0420042802a801210b0c010b4100210b0b2004200a3602e803418595c3004110200441e8036a41041004200441a8016a41086a220a4200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a200a290300370300200420042903a8013703e8032004417f2002200b6a220a200a2002491b3602a801200441e8036a4110200441a8016a410410040240024002402001450d0002402006411b470d0020014188abc400460d0220014188abc400411b109604450d020b200041086a2006360200200041046a200136020020004100360200200745200872450d020c120b20004100360204200041086a200636020020004100360200200745200872450d010c110b200041046a4104360200200041013602002007452008720d100b200341046a280200450d0f200710230c0f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41284101102a000b101e000b200e4101102a000b41134101102a000b41334101102a000b200a4101102a000b41334101102a000b2000410136020020002007360204200441386a102420032802002200450d010b200341046a280200450d0020001023200441c0066a24000f0b200441c0066a24000bda1508027f027e027f017e0c7f017e027f017e230041c0036b22012400200141b0026a41086a22024200370300200142003703b00241c687c4004114200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368024002400240024002400240024002400240024002400240200141e8006a411041a886c500410041001001417f460d00200142003703b002200141e8006a4110200141b0026a41084100100141016a41084d0d0220012903b00222034200510d054200210420002003824200510d010c0b0b4200210420004201824200520d0a0b200141b0026a41086a22022004370300200120043703b00241aaedc300410c200141b0026a1000200141e8006a41086a22052002290300370300200120012903b00237036802400240200141e8006a411041a886c500410041001001417f460d00200142003703b802200142003703b002200141e8006a4110200141b0026a4110410010012206417f460d062006410f4d0d06200141b8026a290300210020012903b00221040c010b420021000b2001200437034020012000370348200141c8026a2000370300200141b0026a41106a2004370300200241013a0000200141093a00b00241a886c5004100200141b0026a102c200141003a005742002107200142003703602001420037035820024200370300200142003703b00241f487c4004112200141b0026a100020052002290300370300200120012903b00237036802400240200141e8006a411041a886c500410041001001417f460d00200142103702d4012001200141e8006a3602d001200141b0026a200141d0016a10920220012802b0022208450d0820012902b40221070c010b410421080b410021090240024002402007422088a72205450d00200141b0026a41096a210a20014190026a210b200141d0016a41206a210c200141e8006a41086a210d200141e8026a210e200141e0026a210f200141dc026a2110410021114100210941002102024003400240024002402009450d00200820024102746a21062008200220116a4102746a21120340200220054f0d07200141e8006a2006280200221310aa0320012903684201520d02200141d0016a200d41e0001094041a2001290340221420012903d001220354200141c0006a41086a2903002200200141d0016a41086a29030022045420002004511b450d03200141013a0057201120026a221320054f0d0a20122006280200360200200641046a2106201241046a21122005200241016a2202470d000c060b0b200820024102746a21060340200220054f0d06200141e8006a2006280200221310aa0320012903684201520d01200141d0016a200d41e0001094041a2001290340221420012903d00122035a200141c0006a41086a2903002200200141d0016a41086a29030022045a20002004511b0d02200141013a0057200641046a21062005200241016a2202470d000c040b0b2011417f6a2111200941016a2109200241016a22022005470d010c030b200241016a21022001201420037d3703402001200020047d2014200354ad7d370348411210262206450d0c200641106a41002f00c6ed433b0000200641086a41002900beed43370000200641002900b6ed4337000020064112412410272206450d0d20062013360012200141b0026a41186a22154200370300200141b0026a41106a22164200370300200141b0026a41086a22124200370300200142003703b00220064116200141b0026a1002200141a0036a41186a2015290300370300200141a0036a41106a2016290300370300200141a0036a41086a2012290300370300200120012903b0023703a003200141a0036a4120100320061023200c200141d0016a41106a290300200141d0016a41186a290300102b200141306a200b20032004108202200141d8006a41086a2206427f20062903002200200141306a41086a2903007c2001290358221420012903307c22172014542206ad7c22142006201420005420142000511b22061b3703002001427f201720061b370358200e2004370300200f2003370300201241023a000020102013360200200a200b290000370000200a41086a200b41086a290000370000200a41106a200b41106a290000370000200a41186a200b41186a290000370000200141093a00b00241a886c5004100200141b0026a102c2011417f6a2111200941016a210920022005470d000c020b0b410021090b200141b0026a41086a220b4200370300200142003703b00241f487c4004112200141b0026a1000200141e8006a41086a200b290300370300200120012903b002370368200141003602b802200142013703b0022001200520096b22023602d001200141d0016a200141b0026a1041024002402002450d00200541027420094102746b210d200b280200210220012802b4022112200821060340200628020021110240024002400240201220026b41044f0d00200241046a22052002490d0820124101742213200520052013491b22094100480d082012450d0120012802b00220122009102722130d020c0b0b200241046a210520012802b00221130c020b200910262213450d090b200120093602b402200120133602b002200921120b200641046a2106200b2005360200201320026a201136000020052102200d417c6a220d0d000c020b0b200b280200210520012802b402211220012802b00221130b200141e8006a411020132005100402402012450d00201310230b02402007a7450d00200810230b200129035821042001200141d8006a41086a2903003703b802200120043703b0022001200141b0026a360268200141e8006a107b024020012d00570d00200141b0026a41086a22024200370300200142003703b002418688c400410d200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368410021020240200141e8006a411041a886c500410041001001417f460d00200141003602b002200141e8006a4110200141b0026a41044100100141016a41044d0d0920012802b00221020b200141206a20012903402204200141c0006a41086a2205290300220042c0843d4200109704200141106a20012903202203200141206a41086a290300221442c0fb42427f1098042001200320142002ad22074200109804200520002000200141086a29030020012903002214200420012903107c20077e42c0843d8042ffffffff0f837c2203201454ad7c22142003200456201420005620142000511b22021b22147d20042004200320021b220054ad7d3703002001200420007d370340200141c8026a2014370300200141c0026a2000370300200141b0026a41086a41033a0000200141093a00b00241a886c5004100200141b0026a102c0b20012903402104200141c8026a200141c0006a41086a2205290300370300200141b0026a41106a2004370300200141b0026a41086a220241043a0000200141093a00b00241a886c5004100200141b0026a102c200529030021042001290340210020024200370300200142003703b00241aaedc300410c200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368200120043703b802200120003703b002200141e8006a4110200141b0026a41101004200141c0036a24000f0b41b4c4c200200220051029000b101e000b41d4aac10041331021000b4194c5c200201320051029000b20094101102a000b41dc87c400104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41244101102a000b200141c0036a24000be20f01057f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220341034b0d00024020030e0400040203000b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41063a000020022802042205200428020022036b41044f0d07200341046a22042003490d2220054101742203200420042003491b22034100480d222005450d0f20022802002005200310272204450d100c200b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41023a000020022802042205200428020022036b41204f0d03200341206a22042003490d2120054101742203200420042003491b22034100480d212005450d0820022802002005200310272204450d090c1d0b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41053a000020022802042205200428020022036b41044f0d03200341046a22042003490d2020054101742203200420042003491b22034100480d202005450d0920022802002005200310272204450d0a0c1a0b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41003a0000200141046a280200210620022001410c6a280200220136020c2002410c6a2002104120022802042205200428020022036b20014f0d03200320016a22042003490d1f20054101742203200420042003491b22034100480d1f2005450d0a20022802002005200310272204450d0b0c170b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41043a000020022802042205200428020022036b41044f0d04200341046a22042003490d1e20054101742203200420042003491b22034100480d1e2005450d0d20022802002005200310272204450d0e0c140b200228020021040c1a0b200228020021040c170b200228020021040c140b200228020021040c190b200228020021040c100b2003102622040d140b20034101102a000b2003102622040d100b20034101102a000b2003102622040d0c0b20034101102a000b2003102622040d100b20034101102a000b2003102622040d060b20034101102a000b41014101102a000b41014101102a000b41014101102a000b41014101102a000b41014101102a000b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a200210410240024002400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0d20044101742203200520052003491b22034100480d0d2004450d0120022802002004200310272204450d020c030b200228020021040c030b2003102622040d010b20034101102a000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c0b0b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c090b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a200210410240024002400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0920044101742203200520052003491b22034100480d092004450d0120022802002004200310272204450d020c030b200228020021040c030b2003102622040d010b20034101102a000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c070b2002200336020420022004360200200241086a28020021030b200241086a200341206a360200200420036a220341086a200141096a290000370000200341106a200141116a290000370000200341186a200141196a290000370000200320012900013700000c050b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a2002104102400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d0120022802002004200310272204450d020c040b200228020021040c040b2003102622040d020b20034101102a000b101e000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0b200020022201290200370200200041086a200141086a280200360200200241106a24000bac0301027f23004180026b22022400024002402001450d00200220003602000c010b200241a886c5003602000b2002200136020420024180016a2002108f010240200228028801450d00200241086a20024180016a41f8001094041a200241086a108a030240200241186a2802002200450d0020022802102101200041246c210003400240024020012d0000220341034b0d0002400240024020030e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200241146a280200450d00200241106a28020010230b20024180026a240042010f0b2002411c6a4101360200200241013602fc01200241a8e7c3003602f8012002420137020c200241a4e6c3003602082002200241f8016a360218200241086a41ace6c3001061000bdc0d01087f230041206b22022400200241003602182002420137031002400240024002400240024002400240410410262203450d0020024104360214200241186a22042004280200220541046a36020020022003360210200320056a41edcad18b06360000024002400240200228021420042802002203470d00200341016a22042003490d0620034101742205200420042005491b22044100480d062003450d0120022802102003200410272205450d020c040b200228021021050c040b2004102622050d020b20044101102a000b41044101102a000b2002200436021420022005360210200241186a28020021030b200241186a2204200341016a360200200520036a41053a0000410f200241106a1092034100210302400340200341c0cfc3006a280200200341c4cfc3006a280200200241106a10930302400240024002400240024002400240024002400240024002400240024002400240200341c8cfc3006a2802004101470d00200341cccfc3006a280200200341d0cfc3006a280200200241106a109303200341d4cfc3006a22062802004102460d010c020b2002200341cccfc3006a28020011010020022802002002280204200241106a109303200341d4cfc3006a22062802004102470d010b02400240024002400240200228021420042802002205470d00200541016a22062005490d1620054101742207200620062007491b22074100480d162005450d01200228021020052007102722060d020c040b200228021021060c020b200710262206450d020b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341e4cfc3006a22062802004102470d020c030b20074101102a000b0240024002400240200228021420042802002205470d00200541016a22072005490d1420054101742208200720072008491b22084100480d142005450d01200228021020052008102722070d020c0d0b200228021021070c020b200810262207450d0b0b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109403200341e4cfc3006a22062802004102460d010b0240200228021420042802002205470d00200541016a22072005490d1020054101742208200720072008491b22084100480d102005450d02200228021020052008102722070d030c0a0b200228021021070c030b0240200228021420042802002205470d00200541016a22062005490d0f20054101742207200620062007491b22074100480d0f2005450d04200228021020052007102722060d050c0a0b200228021021060c050b200810262207450d070b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109503200341f4cfc3006a22062802004102460d030c080b200710262206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341f4cfc3006a22062802004102470d050b0240024002400240200228021420042802002205470d00200541016a22062005490d0b20054101742207200620062007491b22074100480d0b2005450d01200228021020052007102722060d020c070b200228021021060c020b200710262206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c8006a220341b808470d050c060b20084101102a000b20084101102a000b20074101102a000b20074101102a000b0240024002400240200228021420042802002205470d00200541016a22072005490d0620054101742208200720072008491b22084100480d062005450d01200228021020052008102722070d020c070b200228021021070c020b200810262207450d050b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109603200341c8006a220341b808470d000b0b200241186a2802002103200228021421072002280210210620024100360218200242013703102002200336020c2002410c6a200241106a104102400240024020022802142205200228021822046b20034f0d00200420036a22082004490d0320054101742209200820082009491b22084100480d032005450d0120022802102005200810272205450d020c050b2002280210220520046a200620031094041a200420036a21032007450d060c050b2008102622050d030b20084101102a000b101e000b20084101102a000b2002200836021420022005360210200520046a200620031094041a200420036a21032007450d010b200610230b200241206a24002003ad4220862005ad840b910701037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000413f4b0d00200141046a280200200141086a2802002202470d01200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0520012802002002200410272203450d060c170b2000418080014f0d01200141046a2802002203200141086a28020022026b41024f0d02200241026a22042002490d1020034101742202200420042002491b22024100480d102003450d0820012802002003200210272203450d090c140b200128020021030c160b20004180808080044f0d01200141046a2802002203200141086a28020022026b41044f0d04200241046a22042002490d0e20034101742202200420042002491b22024100480d0e2003450d08200128020020032002102722030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102722030d0a0c0e0b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2002102622030d0b0b20024101102a000b200210262203450d060b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b200410262203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00000240024002400240200141046a2802002203200428020022026b41044f0d00200241046a22042002490d0420034101742202200420042002491b22024100480d042003450d01200128020020032002102722030d020c070b200128020021030c020b200210262203450d050b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b101e000b20024101102a000b20044101102a000b20024101102a000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000bc60801037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0520022802002003200510272204450d060c160b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1820044101742203200520052003491b22034100480d182004450d0820022802002004200310272204450d090c130b200228020021040c150b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d08200228020020042003102722040d090c0e0b200228020021040c110b200241046a280200200241086a2802002203470d03200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d09200228020020032005102722040d0a0c0d0b2005102622040d100b20054101102a000b200228020021040c050b200228020021040c070b2003102622040d0a0b20034101102a000b200310262204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c0a0b200510262204450d030b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0c20044101742203200520052003491b22034100480d0c2004450d01200228020020042003102722040d020c060b200228020021040c020b200310262204450d040b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c070b20034101102a000b20054101102a000b20034101102a000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000c020b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000b024002400240200241046a2802002204200241086a28020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d0120022802002004200310272204450d020c040b200228020021040c040b2003102622040d020b20034101102a000b101e000b20022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a200020011094041a0bf70901097f230041206b22022400024002400240024002400240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d01200041d8006c2104410021050340200320056a220041046a280200200041086a2802002001109303200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041d4006a2d00004101470d0020072009470d01200941016a22072009490d0d2009410174220a20072007200a491b220a4100480d0d2009450d0320012802002009200a102722070d040c0e0b20072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0520012802002009200a102722070d060c0e0b200128020021070c030b200128020021070c050b200a10262207450d0a0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10262207450d080b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110f20302400240200041346a2802004101470d00200041386a280200200041c0006a28020020011093030c010b200241106a200041386a2802002000413c6a28020028020c11000020022802102209200241106a41086a28020020011093032002280214450d00200910230b200041c8006a28020021090240200041c4006a2802004101470d002009200041d0006a280200200110f3032004200541d8006a2205470d010c030b2009200041cc006a280200200110f3032004200541d8006a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d00200041d8006c2104410021050340200320056a220041046a280200200041086a2802002001109303200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041d4006a2d00004101470d0020072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0320012802002009200a102722070d040c0f0b20072009470d01200941016a22072009490d0b2009410174220a20072007200a491b220a4100480d0b2009450d0520012802002009200a102722070d060c0f0b200128020021070c030b200128020021070c050b200a10262207450d0b0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10262207450d090b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110f20302400240200041346a2802004101470d00200041386a280200200041c0006a28020020011093030c010b200241106a200041386a2802002000413c6a28020028020c11000020022802102209200241106a41086a28020020011093032002280214450d00200910230b200041c8006a28020021090240200041c4006a2802004101470d002009200041d0006a280200200110f3032004200541d8006a2205470d010c020b2009200041cc006a280200200110f3032004200541d8006a2205470d000b0b200241206a24000f0b101e000b200a4101102a000b200a4101102a000b200a4101102a000b200a4101102a000bf40201057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d012000412c6c2104410021050340200320056a220041046a280200200041086a28020020011093032000410c6a200110f403200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c030b2006200041246a280200200110f30320042005412c6a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d002000412c6c2104410021050340200320056a220041046a280200200041086a28020020011093032000410c6a200110f403200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c020b2006200041246a280200200110f30320042005412c6a2205470d000b0b200241106a24000bda0301057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d012000412c6c2104410021050340200320056a220041046a280200200041086a2802002001109303200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110f3030c010b2006200041146a280200200110f3030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c030b2006200041246a280200200110f30320042005412c6a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d002000412c6c2104410021050340200320056a220041046a280200200041086a2802002001109303200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110f3030c010b2006200041146a280200200110f3030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c020b2006200041246a280200200110f30320042005412c6a2205470d000b0b200241106a24000be00301017f230041a0066b22022400024002402001450d00200220003602000c010b200241a886c5003602000b2002200136020420024198046a20021094020240024002400240024002402002290388054203510d00200241086a20024198046a41f8011094041a20024180026a200241086a41f8011094041a200220024180026a36029804200241f8036a20024198046a108b03200228028004210120024198046a20024180026a41f8011094041a20024198066a200228028004360200200220022903f8033703900620024188046a20024198046a200120024190066a108d03024002402002280288044101470d004280828898f01f200228028c04410374ad88a7210041011026210141010d010c050b200228028c0441004721004101102621014100450d040b2001450d01200141013a000020014101410210272201450d020c040b20024194026a41013602002002410136020c200241c0e7c3003602082002420137028402200241a4e6c300360280022002200241086a3602900220024180026a41ace6c3001061000b41014101102a000b41024101102a000b2001450d01200141003a0000200141014102102722010d0041024101102a000b200120003a0001200241a0066a24002001ad428080808020840f0b41014101102a000b831403037f017e0a7f230041c0016b2202240010e00220024180016a41086a22034200370300200242003703800141af98c300410d20024180016a1000200241086a41086a2204200329030037030020022002290380013703084200210502400240024002400240024002400240200241086a411041a886c500410041001001417f460d00200242003703a001200241086a4110200241a0016a41084100100141016a41084d0d0120022903a00121050b20034200370300200242003703800141f5ccc200411120024180016a1000200420032903003703002002200229038001370308200241086a411010032005108e03200510ed0210910110e50220034200370300200242003703800141a895c300411520024180016a100020024190016a41086a200329030037030020022002290380013703900120024190016a411041a886c500410041001001417f460d0141002106200241003602084104210741012108024020024190016a4110200241086a41044100100141016a41044d0d0020022802082209450d032009ad420c7e2205422088a70d042005a722034100480d040240200310262207450d00200721044100210a03400240024002400240024002400240411410262203450d00200341106a41002800ef9643360000200341086a41002900e79643370000200341002900df96433700002003411441281027220b450d01200b200a360014200241086a41186a22034200370300200241086a41106a220c4200370300200241086a41086a2206420037030020024200370308200b4118200241086a1002200241a0016a41186a2003290300370300200241a0016a41106a200c290300370300200241a0016a41086a2006290300370300200220022903083703a001200241a0016a412041a886c500410041001001417f460d052002422037020c2002200241a0016a3602082002200241086a104a02402002280200450d0020022802042203417f4c0d03024002402003450d00200310ac01220c450d0620062006280200220d200341002002280208200228020c200c2003200d1001220d200d417f461b220d200d20034b1b220d6a360200200d2003470d010c070b4101210c2002280208200228020c41014100200628020010011a41002003460d060b2003450d00200c10230b41d4aac10041331021000b41144101102a000b41284101102a000b101d000b20034101102a000b200241a0016a41201003200c0d010b4101210c410021030b200b1023200441086a2003360200200441046a20033602002004200c3602002004410c6a21042009200a41016a220a470d000b41002108200921060c040b20034104102a000b41d4aac10041331021000b41d4aac10041331021000b4100210641012108410421070b410421094100210b4100210d02400240024002402006410c6c2203410c490d002003410c6e220d41037422044100480d04200410262209450d010b0240200720036a220a2007460d004100210b200921032007210403402004280200210c200341046a200441086a2802003602002003200c360200200341086a2103200b41016a210b2004410c6a2204200a470d000b0b200241a0016a2009200b108c030240200d450d00200910230b02402006450d002006410c6c21042007210303400240200341046a280200450d00200328020010230b2003410c6a2103200441746a22040d000b0b024020080d00200710230b200241086a41186a200241a0016a41186a290300370300200241086a41106a200241a0016a41106a290300370300200241086a41086a200241a0016a41086a290300370300200220022903a00137030820024180016a41086a22034200370300200242003703800141bc98c300411520024180016a100020024190016a41086a220b200329030037030020022002290380013703900120024190016a4110200241086a41201004200241086a10e402200241003602980120024201370390010240412010262203450d00200242a080808080043702940120022003360290012003200229021c370000200341086a200241246a290200370000200341106a2002412c6a290200370000200341186a200241346a290200370000200241086a20024190016a1098020240024002402002280294012204200b280200220c6b41204f0d00200c41206a2203200c490d072004410174220b20032003200b491b220a4100480d072004450d012002280290012004200a1027220b450d020c050b200c41206a2103200228029001210b0c050b200a1026220b0d030b200a4101102a000b41204101102a000b20044104102a000b2002200a360294012002200b36029001200a21040b20024190016a41086a220a2003360200200b200c6a220c41086a200241c4006a290200370000200c41106a200241cc006a290200370000200c41186a200241d4006a290200370000200c200229023c3700000240200420036b411f4b0d00200341206a220c2003490d0120044101742206200c200c2006491b220c4100480d010240024002402004450d00200b2004200c1027220b450d010c020b200c1026220b0d010b200c4101102a000b2002200c360294012002200b360290010b200a200341206a360200200b20036a220341186a200241f4006a290200370000200341106a200241ec006a290200370000200341086a200241e4006a2902003700002003200229025c3700002002280210210e2002200241086a41106a280200220f3602a001200241a0016a20024190016a10410240200f450d00200f41246c210d20024190016a41086a22082802002103200228029401210a200e210b0340200241a0016a200b108f0320022802a00121060240024002400240200a20036b200241a0016a41086a280200220c4f0d002003200c6a22042003490d06200a4101742209200420042009491b22074100480d06200a450d01200228029001200a2007102722090d020c070b2003200c6a210420022802900121090c020b200710262209450d050b200220073602940120022009360290012007210a0b20082004360200200920036a2006200c1094041a024020022802a401450d00200610230b200b41246a210b20042103200d415c6a220d0d000b0240200f450d00200f41246c210b200e210303400240024020032d0000220c41034b0d00024002400240200c0e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a2103200b415c6a220b0d040c050b2003410c6a280200450d02200341086a2802001023200341246a2103200b415c6a220b0d030c040b2003410c6a280200450d01200341086a2802001023200341246a2103200b415c6a220b0d020c030b200341086a280200450d00200341046a28020010230b200341246a2103200b415c6a220b0d000b0b200241146a280200450d040c030b20024198016a28020021042002280290012109200241146a2802000d020c030b101e000b20074101102a000b200e10230b200241c0016a24002004ad4220862009ad840bba0d03017f037e0a7f23004180026b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c20024190016a200241086a10ab010240024002402002280290012201450d0020022002290294013702142002200136021020024190016a200241106a109a032002280290014101460d0120024190016a41086a2201290300210320014200370300200242003703900141a298c300410d20024190016a1000200241206a41086a22002001290300370300200220022903900137032042002104024002400240200241206a411041a886c500410041001001417f460d002002420037039001200241206a411020024190016a41084100100141016a41084d0d0120022903900121040b20014200370300200242003703900141e698c300411720024190016a100020002001290300370300200220022903900137032002400240200241206a411041a886c500410041001001417f460d002002420037039001200241206a411020024190016a41084100100141016a41084d0d03200229039001210541f801210141f80110262206450d010c060b4203210541f801210141f801102622060d050b20014108102a000b41d4aac10041331021000b41d4aac10041331021000b200241a4016a410136020020024101360224200241d8e7c3003602202002420137029401200241a4e6c300360290012002200241206a3602a00120024190016a41ace6c3001061000b41c99bc300412820022802940120024198016a28020010c902000b200620024190016a41f000109404220742023703702007410136028801200720022903800137037820074180016a20024180016a41086a29030037030020072003200520047c220420042003541b3703900120074198016a200241206a41e0001094041a200241106a210120022802142108024002400240024003402001280200220941086a210a20092f0106220b4103742100417f210102400240024003402000450d01200141016a2101417f410141fec7c300200a4108109604220c4100481b4100200c1b220c450d03200041786a2100200a41086a210a200c4101460d000b20080d010c040b200b21012008450d030b2008417f6a2108200920014102746a41e4016a21010c010b0b200941e0006a2001410c6c6a2200450d002000280208210120002802002100200242003703900120024190016a20002001410820014108491b1094041a200141074d0d01200229039001210320024190016a41086a2201420037030020024200370390014198a4c100411520024190016a1000200241206a41086a200129030037030020022002290390013703204100210102400240200241206a411041a886c500410041001001417f460d0020024210370284012002200241206a3602800120024190016a20024180016a109301200228029001220a450d0420024198016a280200210120022802940121090c010b4108210a410021090b4100210002402001417f6a220c20014b0d00200c20014f0d00200a200c4103746a2201450d00200129030020035221000b02402009450d00200a10230b024002402000450d00200741f80141f00310272206450d05200641f8016a20024190016a41f0001094041a200642023703e8022006200337038803200641093602800320062002290380013703f002200641f8026a20024188016a29030037030020064190036a200241206a41e0001094041a4102210d0c010b4101210d0b20022802102002280214200228021810ae0120024100360228200242013703202002200d36029001200d41f8016c210e20024190016a200241206a1041200228022421092002280228210120024190016a41086a210f4100210a02400240034020022006200a6a3602800120024190016a20024180016a108b03200228029001210c0240024002400240200920016b200f28020022074f0d00200120076a22002001490d0520094101742208200020002008491b220b4100480d052009450d0120022802202009200b102722080d020c060b200120076a2100200228022021080c020b200b10262208450d040b2002200b36022420022008360220200b21090b200241206a41086a2000360200200820016a200c20071094041a0240200228029401450d00200c10230b20002101200e200a41f8016a220a470d000b200d41f8016c210a410021010340200620016a4188016a1024200a200141f8016a2201470d000b2006102320024180026a24002000ad4220862008ad840f0b101e000b200b4101102a000b41c8a6c100412b4186c8c300412810c902000b41c8a6c100412b4188f8c400412910c902000b41d4aac10041331021000b41f0034108102a000bae0201077f230041106b2202240020012802042103024002400240024003402001280200220541086a210620052f010622044103742101410021070240024003402001450d0141cdf8c400200641081096042208450d02200141786a2101200741016a2107200641086a21062008417f4a0d000b2007417f6a21040b2003450d022003417f6a2103200520044102746a41e4016a21010c010b0b200541e0006a2007410c6c6a2206450d00200628020821012006280200210620024200370308200241086a20062001410820014108491b1094041a200141074d0d01200041086a2002290308370300410021010c030b200041fef8c400360204200041086a41283602000c010b200041d5f8c400360204200041086a41293602000b410121010b20002001360200200241106a24000bb42515057f017e087f017e077f017e0c7f017e027f027e017f017e017f037e037f037e077f027e027f037e157f230041b0026b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241c0006a200241086a108f0102400240024002400240024020022802482203450d00200241d0006a2802002104200228024c2105200241c0006a200241086a10aa02024020022802402206450d0020022902442107200241c0006a200241086a10ab0120022802402201450d03200220022902443702142002200136021041012108200241013b012c2002420037022441f098c4002109200241f098c4003602202007422088a7220a450d0241f801210b2006200a41f8016c6a210c4108210d200241206a41086a210e41f000210f42022110410121114117211241e698c30021134100211441a886c500211541102116417f2117427f2118410321194102211a41e401211b4180f8c400211c410c211d41e000211e4107211f418801212041782121410d2122200241206a410d6a212341f098c400212442f4d2b59bc7ae98b830212541dc012126200241d4006a21274201212842818080801021294109212a42898080809001212b41a298c300212c423c212d428080808070212e4225212f20062130410021310c050b02402004450d00200441246c21012003214903400240024020492d0000220041034b0d0002400240024020000e0404000102040b2049410c6a280200450d03204941086a2802001023204941246a21492001415c6a22010d040c050b2049410c6a280200450d02204941086a2802001023204941246a21492001415c6a22010d030c040b2049410c6a280200450d01204941086a2802001023204941246a21492001415c6a22010d020c030b204941086a280200450d00204941046a28020010230b204941246a21492001415c6a22010d000b0b2005450d00200310230b200241d4006a4101360200200241013602a402200241f4e7c3003602a00220024201370244200241a4e6c3003602402002200241a0026a360250200241c0006a41ace6c3001061000b4100214041002147410021480c010b200241d4006a4101360200200241013602a402200241f4e7c3003602a00220024201370244200241a4e6c3003602402002200241a0026a360250200241c0006a41ace6c3001061000b410021010c010b410121010b037e024002400240024002400240024002400240024002400240024002400240024020010e020001010b20022802102002280214200228021810ae0102402004450d00200441246c21012003214903400240024020492d0000220041034b0d0002400240024020000e0404000102040b2049410c6a280200450d03204941086a2802001023204941246a21492001415c6a22010d040c050b2049410c6a280200450d02204941086a2802001023204941246a21492001415c6a22010d030c040b2049410c6a280200450d01204941086a2802001023204941246a21492001415c6a22010d020c030b204941086a280200450d00204941046a28020010230b204941246a21492001415c6a22010d000b0b02402005450d00200310230b2007a721000240200a450d00200a41f8016c210120064188016a2149034020491024204941f8016a2149200141887e6a22010d000b0b02402000450d00200610230b2002410036024820024201370340024002400240410110262249450d00200242818080801037024420022049360240204920083a000020494101410210272249450d01200242828080802037024420022049360240204920403a00012049410241061027224a450d0220024286808080e0003702442002204a360240204a20473600022009214902402048450d002048210120092149034020492802e40121492001417f6a22010d000b0b02402047450d004100214b4106214c417f214d4101214e410c214f41e00021504103215141082152410721534102215441e8012155410621564100215720472158410121310c0b0b4280808080e00021070c040b41014101102a000b41024101102a000b41064101102a000b0240024020310e020001010b2030200f6a2903002010520d0e20302802880122322011470d0a2030290390012133200241c0006a200d6a220142003703002002420037034020132012200241c0006a1000200241a0026a200d6a2001290300370300200220022903403703a00202400240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d04200229034021340c010b420321340b2018203420347c223520352034541b22344200510d05200241106a2136200228021421370c090b024002400240205720492f01064f0d0020492057204f6c6a20506a2101204920572051746a20526a21002057204e6a2157204c20566b20534d0d010c020b41012101024020492f01042200204928020022492f0106490d004101210103402001204e6a210120492f01042200204928020022492f01064f0d000b0b20492000204f6c6a213c204920002051746a2131204920002054746a20556a280200214902402001204e460d00204e20016b2101034020492802e40121492001204e6a22010d000b0b203c20506a2101203120526a210041002157204c20566b20534b0d010b205620526a223c2056490d0d204c204e742231203c203c2031491b223c204b480d0d02400240204c450d00204a204c203c1027224a0d010c050b203c1026224a450d040b2002203c3602442002204a3602400b200241c0006a20526a223c205620526a360200204a20566a2000290000370000200128020021312002200128020822013602a002200241a0026a200241c0006a104102400240024002402002280244224c203c28020022006b20014f0d00200020016a224a2000490d10204c204e742256204a204a2056491b2256204b480d10204c450d012002280240204c20561027224a0d020c070b2002280240214a0c020b20561026224a450d050b200220563602442002204a3602402056214c0b203c200020016a2256360200204a20006a203120011094041a2058204d6a22580d052056ad42208621070b20092048204710ae01200241b0026a24002007204aad840f0b41d4aac10041331021000b203c4101102a000b20564101102a000b41c8adc400104f000b410121310c010b410121010c070b410121010c060b4100213a0c010b410121010c010b410221010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000108080b2039201e6a203b201d6c6a2200450d09200028020821012000280200210020024200370340200241c0006a20002001200d2001200d491b1094041a2001201f4d0d0120332034802002290340223d520d02203020206a2802002132410121010c210b20322011470d072030290390012135200241c0006a200241106a109a030240024020022802402011470d00200241c0006a200d6a350200213e2002280244213f4101214020232d00000d060c010b200241c0006a200d6a220129030021414200213e2001420037030020024200370340202c2022200241c0006a1000200241a0026a200d6a22002001290300370300200220022903403703a0020240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d042002290340213e0b200142003703002002420037034020132012200241c0006a100020002001290300370300200220022903403703a002024002400240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d072002290340214220352041202d7c580d020c010b4203214220352041202d7c580d010b2043202e83202f84213e41a49bc300213f4101214020232d0000450d010c060b4100214020352042203e7c223e5a0d0820232d00000d050b024002402040450d0020022802202002280224200e28020010ae012002420037022420022024360220200220253703a0020c010b20022802202144200220253703a00220442024460d00200228022421450c1b0b201b10262244450d0541002145204441003b0106204441003602002044200d6a200241c0006a20261094041a20024100360224200220443602200c190b203d4280808080708342298421354188f8c40021090c080b41c8aec4002109413121472002412d6a2d0000450d080c090b41d4aac10041331021000b41d4aac10041331021000b4194e5c300412241b6e4c300413110c902000b41e4014104102a000b02400240203a0e020001010b20362802002239200d6a210020392f0106223820197421014100213b024003402001450d01201c2000200d109604223c450d17200120216a2101203b20116a213b2000200d6a2100203c20174a0d000b203b20176a21380b2037450d02203720176a213720392038201a746a201b6a21364100213a0c160b2044200d6a210020442f010622462019742101417f213c02400240024003402001450d01200241a0026a2000200d1096042138200120216a2101203c20116a213c2000200d6a21002017201120382014481b201420381b22382011460d000b2038450d0d20450d010c020b2046213c2045450d010b204520176a21452044203c201a746a201b6a28020021444101213a0c170b20272025370200200241c0006a20166a200e360200200241c0006a201d6a203c360200200241c0006a200d6a200241206a3602002002204436024420022014360240200241a0026a200d6a22002014360200200220283703a0022011102621010240024002400240024002402040450d002001450d11200120113a0000200220293702a402200220013602a0022002203ea72201360230200241306a200241a0026a104120022802a40222382000280200223c6b20014f0d01203c20016a2232203c490d2020382011742246203220322046491b22322014480d202038450d0220022802a00220382032102722380d030c120b2001450d12200120143a0000200220293702a402200220013602a00220012011202a10272201450d132001203e3700012002202b3702a402200220013602a0020c040b20022802a00221380c020b203210262238450d0f0b200220323602a402200220383602a0020b2000203c20016a3602002038203c6a203f20011094041a0b200241306a200d6a2000280200360200200220022903a002370330200241c0006a200241306a10ad01202320403a0000200241206a201d6a20143a0000203e214320400d050b2030200b6a2230200c470d100c1a0b203d42808080807083421c84213541b1f8c40021090b2035a721472002412d6a2d00000d010b20022802202002280224200241206a41086a28020010ae0120024200370224200241f098c400360220200242e1eac98bb68edbb7f4003703a00241e40110262201450d0c200141003b010620014100360200200141086a200241c0006a41dc011094041a200241003602242002200136022020012f01062238410374214041002100417f213c034020402000460d03200120006a2148200041086a2100203c41016a213c417f4101200241a0026a204841086a410810960422484100481b410020481b22484101460d000b2048450d0b0c030b4194e5c300412241b6e4c300413110c902000b200241286a28020021470c020b2038213c0b200242e1eac98bb68edbb7f4003702542002200e3602502002203c36024c20022001360244200241003602402002200241206a360248200241003602a802200242013703a00220022047360230200241306a200241a0026a1041024002400240024020022802a402220020022802a80222016b20474f0d00200120476a223c2001490d1620004101742248203c203c2048491b223c4100480d162000450d0120022802a0022000203c10272200450d050c020b20022802a00221000c020b203c10262200450d030b2002203c3602a402200220003602a0020b200241a0026a41086a223c200120476a360200200020016a200920471094041a200241306a41086a203c280200360200200220022903a002370330200241c0006a200241306a10ad012002412c6a4180023b0100200241206a41086a2802002147410121400b200228022421482002280220210941002108410021010c130b203c4101102a000b4194e5c300412241e7e4c300412d10c902000b41014101102a000b20324101102a000b41014101102a000b41094101102a000b4194e5c300412241e7e4c300412d10c902000b41e4014104102a000b41002131410121010c0a0b4101213a0c040b4101213a0c040b410021010c040b410221010c030b410221010c020b410221010c010b410221010c000b0b101e000b2002412d6a2d000021402002412c6a2d00002108200241286a28020021472002280224214820022802202109410021010c000b0b7901027f230041206b22022400200241a886c500410010e3010240412010262203450d0020032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241206a24002003ad42808080808004840f0b41204101102a000bbe1503057f027e077f230041c0086b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241c8066a200241086a1094020240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022903b8074203510d00200241106a200241c8066a41f8011094041a20024188026a200241106a41f8011094041a200220024188026a3602a005200241c8066a200241a0056a108b0320022802d0062101024020022802cc06450d0020022802c80610230b200241c8066a20024188026a41f8011094041a200241a0056a200241c8066a1096020240024002400240024002400240024020022802a0054101470d0020022802a405210120022802a8052200411a460d0120004115470d024102210341f6012104200141d9cac400460d10200141d9cac40041151096040d020c100b20024180046a200241a0056a41086a41a0011094041a4100210320024180046a41086a2205410020022903800442015122061b210002402006450d002000450d03410321040240200520011086020d00200510d702210741012104200041206a290300220820075a0d080b200241b0046a1024200241003602d006200242013703c8060c120b2000450d0441ec0121040c030b41002104200141eecac400460d0441002103200141eecac400411a109604450d0e0b4100210341810121040c0d0b41f60121040b0c0a0b200241a0056a200241a8046a41f8001094041a200241c8066a200241a8056a41f0001094041a41002104200241003a00b807200241c8066a1024410021030c0b0b410021030c090b410c1026220f450d01412010262200450d0220002005290000370000200041186a200541186a290000370000200041106a200541106a290000370000200041086a200541086a2900003700002000412041c00010272200450d0320002008370020200f42c08080808005370204200f200036020002400240200720085a0d00410c1026220b450d06412010262200450d0720002005290000370000200041186a200541186a290000370000200041106a200541106a290000370000200041086a200541086a2900003700002000412041c00010272200450d0820002008427f7c370020200b42c08080808005370204200b2000360200410121090c010b410021094104210b0b2001ad210741012104410121030c070b2002419c026a4101360200200241013602142002418ce8c3003602102002420137028c02200241a4e6c300360288022002200241106a3602980220024188026a41ace6c3001061000b410c4104102a000b41204101102a000b41c0004101102a000b410c4104102a000b41204101102a000b41c0004101102a000b200241b0046a10240c010b0b200241003602d006200242013703c80620034101460d0120034102470d00410110262201450d0c200241013602cc06200241d0066a22002000280200220641016a360200200220013602c806200120066a41023a000020022802cc0620002802002201470d04200141016a22002001490d1020014101742206200020002006491b22064100480d102001450d0920022802c8062001200610272200450d0a0c150b410110262201450d0a200241013602cc06200241d0066a22002000280200220641016a360200200220013602c806200120066a41003a000020022802cc0620002802002201470d01200141016a22002001490d0f20014101742206200020002006491b22064100480d0f2001450d0420022802c8062001200610272200450d050c120b410110262201450d0b200241c8066a41086a22002000280200220641016a360200200241013602cc06200220013602c806200120066a41013a000020022802cc062206200028020022016b41084f0d01200141086a22002001490d0e20064101742201200020002001491b22014100480d0e2006450d0520022802c8062006200110272200450d060c0c0b20022802c80621000c110b20022802c80621000c0b0b20022802c80621000c110b2006102622000d0d0b20064101102a000b2001102622000d060b20014101102a000b2006102622000d0b0b20064101102a000b41014101102a000b41014101102a000b41014101102a000b200220013602cc06200220003602c806200241d0066a28020021010b200241c8066a41086a2205200141086a360200200020016a2007370000200220093602880220024188026a200241c8066a104102400240024002402009450d00200b2009410c6c6a210a200b210603402006280200210c2002200641086a28020022013602880220024188026a200241c8066a1041024002400240024020022802cc06220d200528020022006b20014f0d00200020016a220e2000490d09200d4101742200200e200e2000491b22004100480d09200d450d0120022802c806200d20001027220d0d020c060b20022802c806210d0c020b20001026220d450d040b200220003602cc062002200d3602c806200528020021000b2005200020016a360200200d20006a200c20011094041a2006410c6a2206200a470d000b0b200241013602880220024188026a200241c8066a1041200f280200210d2002200f28020822013602880220024188026a200241c8066a104102400240024020022802cc062206200528020022006b20014f0d00200020016a22052000490d0620064101742200200520052000491b22004100480d062006450d0120022802c8062006200010272206450d020c040b20022802c80621060c040b2000102622060d020b20004101102a000b20004101102a000b200220003602cc06200220063602c806200241d0066a28020021000b200241c8066a41086a2205200020016a360200200620006a200d20011094041a0240024002400240024020022802cc062200200528020022016b41084f0d00200141086a22062001490d0520004101742201200620062001491b22014100480d052000450d0120022802c8062000200110272200450d020c030b20022802c80621000c030b2001102622000d010b20014101102a000b200220013602cc06200220003602c806200241d0066a28020021010b200241c8066a41086a2206200141086a360200200020016a427f37000002400240024020022802cc0620062802002201470d00200141016a22002001490d0320014101742206200020002006491b22064100480d032001450d0120022802c8062001200610272200450d020c040b20022802c80621000c040b2006102622000d020b20064101102a000b101e000b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a2206200141016a360200200020016a20043a00002006280200210620022802c806210520034101470d0502402009450d002009410c6c2100200b210103400240200141046a280200450d00200128020010230b2001410c6a2101200041746a22000d000b2009450d00200b10230b0240200f41046a280200450d00200f28020010230b200f10230c050b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a200141016a360200200020016a20043a00000c020b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a200141016a360200200020016a20043a00000b200241d0066a280200210620022802c80621050b200241c0086a24002006ad4220862005ad840b6101017f230041206b220224000240200141074d0d00200241206a240042010f0b200241146a41013602002002410136021c200241a8e8c30036021820024201370204200241a4e6c3003602002002200241186a360210200241ace6c3001061000baa0a05027f027e027f017e067f230041d0006b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241206a200241086a1090010240024002400240024002400240024020022802202203450d00200220022902242204370214200220033602102002410136024820024198e6c30036024c200241206a200241106a200241c8006a10a0030240024002400240200229032022054202520d0041002100410021060c010b200241386a2802002101200241346a28020021072002290328210820054201520d010240200228023c450d00200110230b41002100410021060b0c010b200241306a280200220021060b2002410036022820024201370320410110262109024002400240024002402006450d002009450d06200242818080801037022420022009360220200941013a000020022001360248200241c8006a200241206a10412001450d012000200141286c6a210a200241206a41086a220b2802002100200228022421092006210103400240024002400240200920006b41204f0d00200041206a220c2000490d0e2009410174220d200c200c200d491b220e4100480d0e2009450d0120022802202009200e1027220d0d020c080b200041206a210c2002280220210d0c020b200e1026220d450d060b2002200e3602242002200d360220200e21090b200b200c360200200d20006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a29000037000020002001290000370000200141206a290300210502400240024002402009200c6b41084f0d00200c41086a2200200c490d0e2009410174220e20002000200e491b220e4100480d0e2009450d01200d2009200e1027220d0d020c090b200c41086a21000c020b200e1026220d450d070b2002200e3602242002200d360220200e21090b200b2000360200200d200c6a2005370000200a200141286a2201470d000b41082101200920006b41084f0d020c080b2009450d06200242818080801037022420022009360220200941003a000042808080801021050c0b0b4108210120022802242209200241286a28020022006b4108490d060b200228022021090c080b200e4101102a000b200e4101102a000b200241346a410136020020024101360214200241c0e8c30036021020024201370224200241a4e6c3003602202002200241106a360230200241206a41ace6c3001061000b41014101102a000b41014101102a000b200020016a22012000490d002009410174220c20012001200c491b22014100480d00024002402009450d0020022802202009200110272209450d010c030b2001102622090d020b20014101102a000b101e000b20022001360224200220093602200b200241206a41086a200041086a2201360200200920006a20083700002001ad42208621052006450d002007450d00200610230b2004a7210d02402004422088a72201450d00200141246c21002003210103400240024020012d0000220c41034b0d00024002400240200c0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200d450d00200310230b200241d0006a240020052009ad840be10803067f017e017f230041e0006b220324002003200236021020032001280200220236020820032002200128020841246c22016a220436020c2003200341086a41086a3602140240024002400240024002402001419001490d00200341386a41086a210103402003200241246a360208200341386a200341146a200210a503200341186a41086a2202200141086a2204290300370300200341186a41106a2205200141106a2206290300370300200341186a41186a2207200141186a220829030037030020032001290300370318200329033822094202520d0220032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d0320032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d0420032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d05200328020c2204200328020822026b418f014b0d000b0b0240024020022004460d00200341386a41086a210103402003200241246a360208200341386a200341146a200210a503200341186a41086a200141086a290300370300200341186a41106a200141106a290300370300200341186a41186a200141186a29030037030020032001290300370318200329033822094202520d0220032802082202200328020c470d000b0b20004202370300200341e0006a24000f0b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c040b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c030b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c020b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c010b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380b2000200937030020002003290338370308200041106a200341c0006a290300370300200041186a200341386a41106a290300370300200041206a200341386a41186a290300370300200341e0006a24000bd50a05027f027e047f017e067f230041d0006b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241206a200241086a10900102400240024002400240024002400240024020022802202203450d00200220022902242204370214200220033602102002410136024820024198e6c30036024c200241206a200241106a200241c8006a10a00302400240200229032022054202520d0041002101410021060c010b200241c0006a2802002100200241386a2802002101200241306a2802002107200228023c2108200228023421092002290328210a024020054201520d00200121060c010b02402009450d002007102341002101410021060c010b4100210141002106410021090b200241003602282002420137032041011026210b024002400240024002402006450d00200b450d0620024281808080103702242002200b360220200b41013a0000200b410141091027220c450d072002428980808090013702242002200c360220200c200a37000120022000360248200241c8006a200241206a10412000450d012001200041286c6a210d200241206a41086a220e280200210f2002280224210c03400240024002400240200c200f6b41204f0d00200f41206a2200200f490d0f200c410174220b20002000200b491b22104100480d0f200c450d012002280220200c20101027220b0d020c080b200f41206a21002002280220210b0c020b20101026220b450d060b200220103602242002200b3602202010210c0b200e2000360200200b200f6a220f41186a200141186a290000370000200f41106a200141106a290000370000200f41086a200141086a290000370000200f2001290000370000200141206a290300210a0240200c20006b41074b0d00200041086a220f2000490d0c200c4101742210200f200f2010491b220f4100480d0c02400240200c450d00200b200c200f1027220b0d010c080b200f1026220b450d070b2002200f3602242002200b360220200f210c0b200e200041086a220f360200200b20006a200a370000200d200141286a2201470d000b41082101200c200f6b41084f0d020c090b200b450d074101210f200241013602242002200b360220200b41003a00000c0c0b410821012002280224220c200241286a280200220f6b4108490d070b2002280220210b0c090b20104101102a000b200f4101102a000b200241346a410136020020024101360214200241e0e8c30036021020024201370224200241a4e6c3003602202002200241106a360230200241206a41ace6c3001061000b41014101102a000b41094101102a000b41014101102a000b200f20016a2201200f490d00200c4101742200200120012000491b22014100480d0002400240200c450d002002280220200c20011027220b450d010c030b20011026220b0d020b20014101102a000b101e000b200220013602242002200b3602200b200b200f6a2009ad4220862007ad84370000200f41086a210f2008450d00200610230b2004a7210e02402004422088a72201450d00200141246c21002003210103400240024020012d0000220c41034b0d00024002400240200c0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200e450d00200310230b200241d0006a2400200fad422086200bad840baa05020b7f017e230041306b2202240041082103200241206a41086a220442003703002002420037032041dbcbc300411b200241206a1000200241086a20042903003703002002200229032037030041002104024002400240024002402002411041a886c500410041001001417f460d002002421037021420022002360210200241206a200241106a10890220022802202203450d02200241286a2802002104200228022421050c010b410021050b2002410036022820024201370320200220043602002002200241206a104102400240024002402004450d002003200441286c6a2106200241206a41086a22072802002108200228022421092003210403400240024002400240200920086b41204f0d00200841206a220a2008490d062009410174220b200a200a200b491b220c4100480d062009450d0120022802202009200c1027220b0d020c070b200841206a210a2002280220210b0c020b200c1026220b450d050b2002200c3602242002200b360220200c21090b2007200a360200200b20086a220841186a200441186a290000370000200841106a200441106a290000370000200841086a200441086a29000037000020082004290000370000200441206a290300210d02400240024002402009200a6b41084f0d00200a41086a2208200a490d062009410174220c20082008200c491b220c4100480d062009450d01200b2009200c1027220b0d020c080b200a41086a21080c020b200c1026220b450d060b2002200c3602242002200b360220200c21090b20072008360200200b200a6a200d3700002006200441286a2204470d000b2005450d060c050b200241286a28020021082002280220210b20050d040c050b101e000b200c4101102a000b200c4101102a000b41d4aac10041331021000b200310230b200241306a24002008ad422086200bad840be90104027f017e017f017e230041206b22022400200241106a41086a220342003703002002420037031041e698c3004117200241106a1000200241086a20032903003703002002200229031037030002400240024002402002411041a886c500410041001001417f460d002002420037031020024110200241106a41084100100141016a41084d0d022002290310210441082105410810262203450d010c030b42032104410821054108102622030d020b20054101102a000b41d4aac10041331021000b2003427f200420047c220620062004541b370000200241206a24002003ad42808080808001840b940403017f017e087f230041306b2202240042002103200241206a41086a22044200370300200242003703204192adc4004110200241206a1000200241086a200429030037030020022002290320370300024002400240024002402002411041a886c500410041001001417f460d002002421037021420022002360210200241206a200241106a102820022802202205450d02200229022421030c010b410121050b200241003602282002420137032020022003422088a722043602002002200241206a10410240024002402004450d0020044105742106200241206a41086a280200210720022802202108200228022421092005210403400240024002400240200920076b41204f0d00200741206a220a2007490d062009410174220b200a200a200b491b220b4100480d062009450d0120082009200b102722080d020c070b200741206a210a0c020b200b10262208450d050b200b21090b200820076a22072004290000370000200741186a200441186a290000370000200741106a200441106a290000370000200741086a200441086a290000370000200a2107200441206a2104200641606a22060d000b200241286a200a36020020022009360224200220083602202003a7450d050c040b200241286a280200210a200228022021082003a70d030c040b101e000b200b4101102a000b41d4aac10041331021000b200510230b200241306a2400200aad4220862008ad840be20602047f027e230041206b220324002001280200280200220128020421042001280200210102400240024002400240024002400240024020022d0000417f6a220541034b0d00024020050e0400040203000b200241086a210641012105200241016a210220014101470d050c040b200241016a21024100210520014101460d030c040b200241086a2106200241016a21024103210520014101470d030c020b41042105200241046a210220014101470d020c010b200241086a2106200241016a21024102210520014101470d010b20054102470d0220022004460d0120022800002004280000470d020c010b0240024020014102460d0020014103470d012002210620054104460d020c030b20054103470d0220022004460d0120022800002004280000470d020c010b20054101470d0120022004460d0020022800002004280000470d010b2006280200210120032006280208220236020c20032001360208200341003a0010200341106a2001200241004722051094041a20022005490d012003200220056b220636020c2003200120056a22013602082002450d00024002400240024020032d001022024101460d0020020d04200341106a200341086a10a70220032802102205450d04200329021421074200210820034200370310200341106a20032802082206200328020c2202410820024108491b22011094041a2003200220016b36020c2003200620016a3602082007a72101200241074d0d022007422088a72102200329031021070c010b20034200370310200341106a20012006410820064108491b22021094041a2003200620026b36020c2003200120026a360208200641074d0d0320032903102107200341106a200341086a10a70220032802102202450d032003290214210820034200370310200341106a20032802082206200328020c2201410820014108491b22051094041a2003200120056b36020c2003200620056a3602082008a72106200141074d0d022008422088a721042003280214210120032802102105420121080b2000200636021c200020013602142000200737030820002008370300200041206a2004360200200041186a2002360200200041106a2005360200200341206a24000f0b2001450d01200510230c010b2006450d00200210230b20004202370300200341206a24000f0b200520021048000b130020004105360204200041c8f0c3003602000b130020004108360204200041c1fbc3003602000b130020004108360204200041ccfbc3003602000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242013700000f0b41084101102a000b870301047f23004180026b22022400024002400240411210262203450d00200341106a41002f00c6ed433b0000200341086a41002900beed43370000200341002900b6ed4337000020034112412410272203450d012003200136001220024198016a41186a2201420037030020024198016a41106a2204420037030020024198016a41086a2205420037030020024200370398012003411620024198016a1002200241e8006a41186a2001290300370300200241e8006a41106a2004290300370300200241e8006a41086a2005290300370300200220022903980137036802400240200241e8006a412041a886c500410041001001417f460d002002422037028c012002200241e8006a3602880120024198016a20024188016a10ab032002290398014201520d04200241086a20024198016a41086a41e0001094041a20004201370300200041086a200241086a41e0001094041a0c010b200042003703000b2003102320024180026a24000f0b41124101102a000b41244101102a000b41d4aac10041331021000bf20904067f027e027f027e230041e0016b22022400200241c0016a41186a22034200370300200241c0016a41106a22044200370300200241c0016a41086a22054200370300200242003703c0012001410020012802002001280204200241c0016a41202001280208100122062006417f461b2206412020064120491b20012802086a220736020802400240024002402006411f4d0d00200241a0016a41186a22062003290300370300200241a0016a41106a22032004290300370300200241a0016a41086a22042005290300370300200220022903c0013703a00120024180016a41186a2205200629030037030020024180016a41106a2206200329030037030020024180016a41086a22032004290300370300200220022903a00137038001200241c0006a41186a2005290300370300200241c0006a41106a2006290300370300200241c0006a41086a20032903003703002002200229038001370340200242003703c801200242003703c001200141086a220341002001280200200141046a2204280200200241c0016a41102007100122062006417f461b2206411020064110491b20032802006a22033602002006410f4d0d01200241c0016a41086a2207290300210820022903c0012109200241c0016a41186a220a4200370300200241c0016a41106a220b420037030020074200370300200242003703c001200141086a2205410020012802002004280200200241c0016a41202003100122062006417f461b2206412020064120491b20052802006a22033602002006411f4d0d02200241a0016a41186a2206200a290300370300200241a0016a41106a2204200b290300370300200241a0016a41086a220a2007290300370300200220022903c0013703a00120024180016a41186a2207200629030037030020024180016a41106a2206200429030037030020024180016a41086a2204200a290300370300200220022903a00137038001200241e0006a41186a2007290300370300200241e0006a41106a2006290300370300200241e0006a41086a20042903003703002002200229038001370360200242003703c801200242003703c001200541002001280200200141046a280200200241c0016a41102003100122012001417f461b2201411020014110491b20052802006a3602002001410f4d0d03200241c0016a41086a290300210c20022903c001210d200241206a41186a2201200241c0006a41186a290300370300200241206a41106a2206200241c0006a41106a290300370300200241206a41086a2203200241c0006a41086a290300370300200241086a2204200241e0006a41086a290300370300200241106a2205200241e0006a41106a290300370300200241186a2207200241e0006a41186a2903003703002002200229034037032020022002290360370300200041206a200c370300200041186a200d370300200041106a200837030020002009370308200041286a2002290320370300200041306a2003290300370300200041386a2006290300370300200041c0006a2001290300370300200041c8006a2002290300370300200041d0006a2004290300370300200041d8006a2005290300370300200041e0006a200729030037030020004201370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000bcf0202027f017e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d0120044101200110cc02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b20004180011048000b20004180011048000ba90601097f230041106b220224002002410036020820024201370300200028020021030240024002400240410410262204450d0020024284808080c00037020420022004360200200420033600002000280204210320044104410810272204450d012002428880808080013702042004200336000420022004360200200028020821042002200041106a280200220336020c2002410c6a2002104102400240024002402003450d0020034105742105200241086a220628020021032002280204210703400240024002400240200720036b41204f0d00200341206a22082003490d0620074101742209200820082009491b220a4100480d062007450d0120022802002007200a102722090d020c070b200341206a2108200228020021090c020b200a10262209450d050b2002200a36020420022009360200200a21070b20062008360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002003200429000037000020082103200441206a2104200541606a22050d000b0b2000280214210420022000411c6a280200220336020c2002410c6a2002104102402003450d00200341057421054100200241086a220628020022036b21082002280204210703400240024002400240200720086a41204f0d00200341206a22092003490d062007410174220a20092009200a491b220a4100480d062007450d0120022802002007200a102722090d020c080b200228020021090c020b200a10262209450d060b2002200a36020420022009360200200a21070b2006200341206a220a360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a29000037000020032004290000370000200841606a2108200a2103200441206a2104200541606a22050d000b200128020020012802042009200a10042007450d070c060b200228020421042001280200200128020420022802002209200241086a280200100420040d050c060b101e000b200a4101102a000b200a4101102a000b41044101102a000b41084101102a000b200910230b200241106a24000b130020004103360204200041849ac4003602000b13002000410e36020420004198a0c4003602000b130020004104360204200041a8a0c4003602000b3101017f0240410110262202450d00200042818080801037020420002002360200200241003a00000f0b41014101102a000b130020004100360204200041a886c5003602000b130020004107360204200041b2a5c4003602000b130020004102360204200041bca5c4003602000bda0401097f230041d0006b2202240002400240410f10262203450d00200341076a41002900849544370000200341002900fd94443700002003410f411e10272204450d012004200036000f200241286a41186a22004200370300200241286a41106a22054200370300200241286a41086a220342003703002002420037032820044113200241286a1002200241086a41186a2000290300370300200241086a41106a2005290300370300200241086a41086a20032903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a104102400240024002402000450d00200041057421072003280200210020022802282108200228022c21092006210303400240024002400240200920006b41204f0d00200041206a22052000490d072009410174220a20052005200a491b220a4100480d072009450d0120082009200a102722080d020c080b200041206a21050c020b200a10262208450d060b200a21090b200820006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200741606a22070d000b200241306a20053602002002200936022c200220083602280c010b20032802002105200228022c2109200228022821080b200241086a412020082005100402402009450d00200810230b200410230240200141046a280200450d00200610230b200241d0006a24000f0b101e000b200a4101102a000b410f4101102a000b411e4101102a000bde0402047f037e230041d0006b220224000240024002400240411510262203450d002003410d6a41002900ada844370000200341086a41002900a8a844370000200341002900a0a84437000020034115413510272203450d01200320012900003700152003412d6a200141186a290000370000200341256a200141106a2900003700002003411d6a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034135200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002200236022020024120360224200241003602302002410020024120200241306a41044100100122012001417f461b2201410420014104491b2204360228200141034d0d052002350230210620024100360230200241286a410020024120200241306a41042004100122012001417f461b2201410420014104491b20046a360200200141034d0d0520023502302107200241306a200241206a102820022802302201450d0520022902342108200241306a200241206a10282008a7210420022802302205450d04200041186a2002290234370200200041146a2005360200200041106a20084220883e02002000200436020c20002001360208200020074220862006843702000c010b200041003602080b20031023200241d0006a24000f0b41154101102a000b41354101102a000b2004450d00200110230b41d4aac10041331021000bc01904027f027e077f027e230041c0016b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d252003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a200128020421012003450d062003102622060d0720034101102a000b2001410c6a2802002203417f4c0d19200128020421012003450d072003102622060d0820034101102a000b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a28020021060c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121060b2006200120031094042101200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121060b20062001200310940421012000410c6a2003360200200041086a2003360200200020013602042000410a360200200241c0016a24000f0b200241106a41086a200141186a290200370300200241106a41106a200141206a2802003602002002200141106a290200370310200141246a350200200141286a310000422086842104200141096a2f00002001410b6a2d00004110747221072001410c6a2802002106410021030b200241d0006a41106a200241106a41106a280200360200200241d0006a41086a200241106a41086a2903003703002002200229031037035020032007410874722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290350370200200041246a2004370200200041186a200241d0006a41086a290300370200200041206a200241d0006a41106a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041022101410021030c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b41f0004108102a000b8b0303027f017e057f230041306b220124004108210242002103200141206a41086a22044200370300200142003703204195b7c1004115200141206a1000200141086a200429030037030020012001290320370300024002402001411041a886c500410041001001417f460d002001421037021420012001360210200141206a200141106a10890220012802202202450d01200129022421030b20022003422088a7220541286c6a210620022104024002400340200620046b419f014d0d014101210720042000460d02200420004120109604450d02200441286a22082000460d02200820004120109604450d02200441d0006a22082000460d02200820004120109604450d02200441f8006a22082000460d02200441a0016a21042008200041201096040d000c020b0b024020062004460d002002200541286c6a210803404101210720002004460d02200420004120109604450d022008200441286a2204470d000b0b410021070b02402003a7450d00200210230b200141306a240020070f0b41d4aac10041331021000b130020004101360204200041b8b0c4003602000b1300200041073602042000419fb4c4003602000b130020004105360204200041a8b4c4003602000b9e0e050c7f057e017f017e0a7f23004180016b22082400024002400240024002400240200728020c22094100480d00200941ffffffff07460d002007410c6a210a2007410c6a200941016a220b360200200741146a280200210c200741106a220d210e410021090340024002400240024002400240024020090e020001010b200e280200220f41086a2110200f2f010622114105742112417f21090240024002400240024003402012450d01200941016a2109417f410120042010412010960422134100481b410020131b2213450d03201241606a2112201041206a211020134101460d000b200c0d010c030b20112109200c450d020b200c417f6a210c200f20094102746a41880b6a210e410021090c090b200f41e8026a200941e0006c6a2209450d002009280200450d00200941106a2903002114200941086a29030021150c010b200841286a2007411c6a2802002004200741206a28020028021c110400200841306a2903002114200728020c210b200829032821150b2007410c6a200b417f6a360200200141186a29030021162007280240210920012903102117024041004101410220152014842218501b20021b22194101460d0020194102470d0220094190016a21094200211a20172016844200520d030c0d0b20094180016a21094200211a20172016844200510d0c0c020b200d280200220f201d6a2110200f2f0106220d201e742112417f210902400240024003402012450d01200920196a2109201f201920032010202210960422132023481b202320131b2213450d03201220246a2112201020226a211020132019460d000b201c0d010c050b200d2109201c450d040b201c201f6a211c200f20092020746a20216a210d410121090c060b200f41e8026a200941e0006c6a2209450d022009280200450d02200941106a2903002116200941086a29030021170c030b200941f0006a21094200211a20172016844200510d0a0b200841186a2009290300200941086a290300201720161097042001201a200129030822172008290318427f200841186a41086a290300501b7d221620162017562016507222091b37030802402009450d0041e0bbc4002109412221070c090b200a28020022094100480d04200941ffffffff07460d04410121192007410c6a200941016a221b360200200741146a280200211c4108211d4105211e417f211f4102212041880b21214120212241002123416021240c020b200841086a2007411c6a2802002003200741206a28020028021c110400200841106a2903002116200728020c211b200829030821170b200a201b417f6a3602000240201720057d221a201756201620067d2017200554ad7d221720165620172016511b450d004182bcc4002109411d21070c070b024020184200520d00200741c0006a2802002209290360200556200941e8006a290300221620065620162006511b450d00419fbcc4002109411f21070c070b200820034102201a2017108302024020082802002209450d00200828020421070c070b0240201520057c22182015542209201420067c2009ad7c221620145420162014511b450d0041bebcc4002109412d21070c070b4100210920032004460d05200320044120109604450d05200a2003201a2017108102200a200420182016108102200841e0006a41186a200341186a290000370300200841e0006a41106a200341106a290000370300200841e0006a41086a200341086a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a29000037030020082003290000370360200820042900003703400240024002400240200741306a28020022092007412c6a280200470d00200941016a22192009490d0320094101742212201920192012491b2212ad42e8007e2216422088a70d032016a722104100480d032009450d01200741286a280200200941e8006c201010272219450d020c070b200741286a28020021190c070b2010102622190d050b20104108102a000b101e000b410121090c000b0b10e401000b2007412c6a2012360200200741286a2019360200200741306a28020021090b2019200941e8006c6a2219200829036037000141002109201941003a0000201941096a200841e0006a41086a290300370000201941116a200841e0006a41106a290300370000201941196a200841e0006a41186a290300370000201941216a2008290340370000201941296a200841c0006a41086a290300370000201941316a200841c0006a41106a290300370000201941396a200841c0006a41186a290300370000201941c1006a2008280039360000201941c4006a2008413c6a280000360000201941e0006a410036020020194201370358201941d0006a2006370300201941c8006a2005370300200741306a2207200728020041016a3602000b0b200020073602042000200936020020084180016a24000f0b41c8adc400104f000bc60101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a2802002204450d002004210520032100034020002802880b21002005417f6a22050d000b0340200320032f01064102746a41880b6a28020021032004417f6a22040d000c020b0b200321000b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a10d401200141306a24000b160020002001280208360204200020012802003602000b0e0020003502004101200110cc020b8f0301037f230041c0006b22022400200141086a280200210320012802042104200220012802002201360210024002400240200141818004490d002002413c6a41013602002002410236021c200241f8d5c4003602182002420237022c200241fcd5c4003602282002200241186a3602382002200241286a10a2012002280200450d010c020b02402004450d00200220033602140240200120034d0d00200241246a41023602002002413c6a41023602002002410236021c2002420237022c2002418cd6c4003602282002200241106a3602202002200241146a3602182002200241186a3602382002200241286a10a20120022802000d030c020b200341818004490d002002413c6a41013602002002410236021c200241f8d5c4003602182002420237022c2002419cd6c4003602282002200241186a3602382002200241286a10a20120022802000d020c010b2002410036020020022802000d010b20004100360200200241c0006a24000f0b20002002290300370200200041086a200241086a280200360200200241c0006a24000bcf0601037f230041c0006b22042400024002400240024002400240024002400240024020012802084102470d00200128020022052d0000416e6a2201411e4b0d0141002106024020010e1f0002020202020202020202020202020202020202020202020202020a030405000b20042005280204220136020c200120034f0d05200220014101746a22012d0001450d06200441346a41013602002004410236023c2004420237022420044198d8c40036022020042004410c6a3602382004200441386a360230200441106a200441206a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b412e10262201450d06200041013a0000200141266a4100290090d844370000200141206a410029008ad844370000200141186a4100290082d844370000200141106a41002900fad744370000200141086a41002900f2d744370000200141002900ead744370000200041086a42ae808080e005370200200041046a2001360200200441c0006a24000f0b412010262201450d06200041013a0000200141186a41002900d0d844370000200141106a41002900c8d844370000200141086a41002900c0d844370000200141002900b8d844370000200041086a42a08080808004370200200041046a2001360200200441c0006a24000f0b410121060c060b410221060c050b410321060c040b200441346a41013602002004410236023c20044202370224200441a8d8c40036022020042004410c6a3602382004200441386a360230200441106a200441206a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b20012d000021060c020b412e4101102a000b41204101102a000b0240200541106a2d00004106470d00200041003a0000200020063a0001200441c0006a24000f0b0240412910262201450d00200041013a0000200141286a41002d0080d9443a0000200141206a41002900f8d844370000200141186a41002900f0d844370000200141106a41002900e8d844370000200141086a41002900e0d844370000200141002900d8d844370000200041086a42a98080809005370200200041046a2001360200200441c0006a24000f0b41294101102a000b90010002400240024020002d000022004101460d0020004102460d0120004103470d02200128021841b8f6c40041032001411c6a28020028020c1102000f0b200128021841b2f6c40041032001411c6a28020028020c1102000f0b200128021841b5f6c40041032001411c6a28020028020c1102000f0b200128021841aff6c40041032001411c6a28020028020c1102000b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ccb0c5003602082002200236021820012000200241086a10e2032101200241206a240020010ba1d10103037f037e067f230041f0006b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d0000417f6a220441aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01f602001b0f01aa01a701a901a301230c13a80104141a9a01531d2454063507a101880172269101a001a60134090e8a01399d01a40105023a43744b73568d01030a4616797b4184017825287a8901080d272e1218940196012298019c01a5015da201179b01601e5c119e019f0120920177750b1044472a1597011c6231930190018b012b193699013c29664d5767644c8001427e308c0187012d8e0195011f48402f8f01713d217f614a7c85012c3332383f6f5e6e83018201378601505181017668637d6b5f3b553e694e456c4f6d596a654958525a5bf6020b200141306a2802002204200141346a22052802004f0dad0120023100012106200141206a350200210720042001412c6a280200470df402200441016a22022004490de60220044101742205200220022005491b2202ad4203862208422088a70de6022008a722054100480de6022004450de401200141286a2802002004410374200510272204450de5010cf3020b200141306a2802002202417f6a220420024f0d9f02200420024b0d9f02200141286a220228020020044103746a22042d00044101470da90120043100052106200341d8006a200141186a200210ce032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110cf032003280258450df30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0da80120022001411c6a280200470def02200241016a22042002490de30220024101742205200420042005491b22044100480de3022002450ddf01200141186a2802002002200410272202450de0010cee020b200341d8006a200141186a2202200141286a2204410010d00320032d00584101470da801200341e0006a2903002106200328025c22010df0010cf1020b200341d8006a2001200241046a2802004102410010cf032003280258450df00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210d1032003280258450def0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010d1032003280258450dee0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ded0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110d1032003280258450dec0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d3032003280258450deb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dea0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360248200441386a28020020024d0da2012003200428023020024102746a28020022023602282004412c6a28020020024d0db801200428022420024104746a22042d000d2109024020042802082202450d002004280200417f6a2104200141286a2105200141186a210a0340200341d8006a200a2005200420026a2d000010d00320032d00584101460de7012002417f6a22020d000b0b20094104460de902200141206a2802002202200141246a22042802004f0df30120022001411c6a280200470de402200241016a22042002490dda0220024101742205200420042005491b22044100480dda022002450d8702200141186a2802002002200410272202450d88020ce3020b200341d8006a2001410110d2032003280258450de80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410010cf032003280258450de70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20023100012106200341d8006a200141186a200141286a2204410010d00320032d00584101470da0012000200329025c370200200041086a200341e4006a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450de40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450de30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241046a280200210a2001280200210220034100360228200241146a280200450dac01200341d8006a200141186a2204200141286a2205410010d00320032d00584101470daf01200341e0006a2903002106200328025c22010df3010ce2020b200341d8006a200141046a200241046a28020010d50320032d00584101470d9c01200328025c2201450de102200341e0006a29030021060cb3010b200341d8006a2001410010d4032003280258450de00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450ddf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dde0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450ddc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360248200341d8006a200141046a200210d50320032d00584101470d9701200328025c21012003200341e0006a290300220637022c2003200136022820010daf010cdb020b200141306a2802002204200141346a22052802004f0d970120023100012106200141206a350200210720042001412c6a280200470dd302200441016a22022004490dcb0220044101742205200220022005491b2202ad4203862208422088a70dcb022008a722054100480dcb022004450dcb01200141286a2802002004410374200510272204450dcc010cd2020b200341d8006a2001410010d4032003280258450dd90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a28020022023602202001280200210420032002360254200441206a28020020024d0d9601200428021820024101746a22022d0001450db501200320022d000022023a0027200341d8006a200141186a200141286a410410d00320032d00584101470db801200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d9b020cd8020b200341d8006a2001410310d2032003280258450dd70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dd60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450dd50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450dd40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dd30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012d003822024104470d91010cc2020b200341d8006a2001200241046a2802004104410010d1032003280258450dd10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dd00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110d1032003280258450dcf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dce0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dcd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dcc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dcb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dca0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dc80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dc70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dc60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dc50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dc40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110d1032003280258450dc10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310d1032003280258450dc00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450dbf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450dbe0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dbd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210cf032003280258450dbc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110cf032003280258450dbb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110d7032003280258450dba0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450db90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450db80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450db70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450db60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450db50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450db40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450db30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110cf032003280258450db20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450db10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210d7032003280258450db00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450daf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dae0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dad0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410310d7032003280258450dac0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450dab0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012802002102200341003602282002280208450d750c94020b200341d8006a2001410110d4032003280258450da90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450da80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450da70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410210d7032003280258450da60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450da50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410010d7032003280258450da40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450da30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360228200441206a28020020024d0d62200141206a2802002205200141246a220a2802004f0d78200428021820024101746a2d0000210220052001411c6a280200470d8b02200541016a22042005490d93022005410174220a20042004200a491b22044100480d93022005450daa01200141186a2802002005200410272205450dab010c8a020b200341d8006a2001200241046a2802004108410110d1032003280258450da10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450da00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d6020022001411c6a280200470d8602200241016a22042002490d900220024101742205200420042005491b22044100480d90022002450d9201200141186a2802002002200410272202450d93010c85020b200341d8006a2001410110d4032003280258450d9e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450d9d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310d7032003280258450d9c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450d9b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d9a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450d990220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450d980220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450d970220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110d7032003280258450d960220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450d950220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450d940220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450d930220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010d7032003280258450d920220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d910220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d900220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d8f0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d8e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010d7032003280258450d8d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450d8c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d8b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110d7032003280258450d8a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210d7032003280258450d890220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310d7032003280258450d880220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450d870220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450d860220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002202417f6a220420024f0db101200420024b0db101200128022820044103746a220a2802002205200141206a28020022024d0d482001411c6a280200220420026b200520026b22094f0d5d200220096a220b2002490df6012004410174220c200b200b200c491b220b4100480df6012004450d7c200141186a2802002004200b1027220c450d7d0ce6010b200341d8006a2001410210d4032003280258450d840220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010d1032003280258450d830220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d4420022001411c6a280200470de201200241016a22042002490df30120024101742205200420042005491b22044100480df3012002450d77200141186a2802002002200410272202450d780ce1010b20012802002102200341003602282002280208450d4d0cda010b200341d8006a2001410010d4032003280258450d800220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450dff0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450dfe0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfa0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450df90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110d7032003280258450df80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450df70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450df60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450df50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450df40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450df30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450df20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450df10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450df00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450def0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dee0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010d1032003280258450ded0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d3032003280258450dec0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410110cf032003280258450deb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dea0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450de90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d2c20022001411c6a280200470dc001200241016a22042002490dd90120024101742205200420042005491b22044100480dd9012002450d61200141186a2802002002200410272202450d620cbf010b200341d8006a2001410210d6032003280258450de70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450de60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110d1032003280258450de40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450de30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450de10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450de00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dde0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450ddc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a200141046a200241046a28020010d50320032d00584101470d20200328025c2201450ddb01200341e0006a29030021060c420b200341d8006a2001410210d2032003280258450dda0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310cf032003280258450dd80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450dd70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450dd60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110d1032003280258450dd50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010d1032003280258450dd40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241086a280200210a200241046a280200210420032002410c6a2802002205360240200141306a280200220220054d0d1820022005417f736a220520024f0d83014104210c0240200141286a220d280200220920054103746a22052d00044103460d0020052d0005210c0b2003200c3a0038200a450d34200c41ff0171220e4104470d33200a410274210a0340200320042802002205360240200220054d0d3e20022005417f736a220520024f0d7d0240200920054103746a22052d00044103460d0020052d00054104470d3e0b200441046a2104200a417c6a220a0d000b4104210c0c340b200341d8006a2001200241046a2802004101410010cf032003280258450dd10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110d1032003280258450dcf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360240200141306a280200220420024d0d1520042002417f736a220220044f0d8001200141286a220428020020024103746a22022d00044103460d9f0120022d0005220241ff01714104460d9f01200341d8006a200141186a22052004200210d00320032d00584101470d36200328025c2202450d9f01200341e0006a29030021060c9e010b200341d8006a200141186a200141286a410410d00320032d00584101470dcd01200328025c2201450dcd012000200341e0006a29030037020420002001360200200341f0006a24000f0b200241046a2802002102200341d8006a200141186a220a200141286a2205410010d00320032d00584101470d14200341e0006a2903002106200328025c22010d92010ccc010b200141306a2802002202417f6a220420024f0d78200420024b0d78200141286a220a28020020044103746a22042d0005210520042d00044101470d14200541ff01714104460d14200341ec006a41013602002003412936022c2003200441056a3602282003420237025c200341d4d1c4003602582003200341286a360268200341086a200341d8006a10a201200041086a200341086a41086a28020036020020002003290308370200200341f0006a24000f0b411a10262201450d7d200141186a41002f00d0d1443b0000200141106a41002900c8d144370000200141086a41002900c0d144370000200141002900b8d1443700002000429a808080a00337020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc9012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a20022004410410d00320032d00584101470d16200341e0006a2903002106200328025c22010d470cc8010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc7012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc7012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a41013602002003410236023c2003420237025c20034188dac4003602582003200341c8006a3602382003200341386a360268200341086a200341d8006a10a201200329020c2106200328020822010d510cc6010b200141306a2802002202200141346a22052802004f0d15200141206a350200210720022001412c6a280200470d9b01200241016a22052002490db6012002410174220a20052005200a491b2205ad4203862208422088a70db6012008a7220a4100480db6012002450d4920042802002002410374200a10272202450d4a0c9a010b200141206a2802002202200141246a22042802004f0d1520032d0059210420022001411c6a280200470d9801200241016a22052002490db5012002410174220a20052005200a491b22054100480db5012002450d4a200141186a2802002002200510272202450d4b0c97010b200320032d005922023a0038200341d8006a200141186a200141286a410410d00320032d00584101470d16200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d170cc3010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc2012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc2012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a4101360200200341023602442003420237025c200341b8dac4003602582003200341d4006a3602402003200341c0006a360268200341086a200341d8006a10a2010c1f0b200341d8006a200141186a2205200141286a200210d00320032d00584101470d15200328025c2202450db001200341e0006a29030021060c250b200341ec006a4101360200200341023602442003420237025c200341b8dac4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a10a20120032802082201450dbf01200329020c21060c160b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbe012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbe012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbd012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbd012000200329022c37020420002001360200200341f0006a24000f0b2005200220052002491b21040ca1010b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbb012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbb012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a200141186a2205200141286a20032d0059220410d00320032d00584101470d13200328025c2201450dba01200341e0006a29030021060c210b200341086a410c6a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200328022821022003200329022c37022c2003200236022820032802282202450d7b0c8b010b200341146a4102360200200341ec006a220241023602002003410236020c200320043602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821042003200329022c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a201200328020c450d8601200328020810230c86010b200141306a280200210420032002360240200420024d0d1120042002417f736a220220044f0d6b200528020020024103746a22022d00044103460db70120022d0005220241ff01714104460db701200341d8006a200a2005200210d00320032d00584101470d38200328025c2201450db701200341e0006a29030021060c7d0b20024101470d1120012d003822024104470d1f0c83010b200341d8006a41146a41013602002003410236024c2003420237025c200341e8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a201200329020c2106200328020822010d460cb5010b200341ec006a41013602002003410236024c2003420237025c200341b8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a20120032802082202450d9e01200329020c21060c9f010b200341ec006a41013602002003410236024c2003420237025c200341b8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a20120032802082202450d8c01200329020c21060c8d010b20012802002209412c6a28020021022003200a3602282002200a4d0d112009280224200a4104746a220a2d000d21090240200a2802082202450d00200a280200417f6a210a0340200341d8006a20042005200a20026a2d000010d00320032d00584101460d372002417f6a22020d000b0b200941ff01714104460db201200141206a2802002202200141246a22052802004f0d4220022001411c6a280200470d7e200241016a22052002490da3012002410174220a20052005200a491b22054100480da3012002450d5620042802002002200510272202450d570c7d0b200341d8006a2002200420032d0059220510d00320032d00584101470d14200341e0006a2903002106200328025c22010d300cb1010b200341ec006a4101360200200341023602442003420237025c20034198dac4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a10a201200329020c2106200328020822010d3b0cb0010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450daf012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450daf012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dae012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dae01200329022c21060b2000200637020420002001360200200341f0006a24000f0b200320032d005922013a004020014104460dac01200241ff01712001460dac01200341086a41146a412b360200200341146a4123360200200341d8006a41146a41033602002003410236020c2003420337025c200341f4d1c4003602582003200341c0006a3602182003200341386a3602102003200341c8006a3602082003200341086a360268200341286a200341d8006a10a201200329022c210620032802282201450dac010b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d0e20042001411c6a280200470d74200441016a220a2004490d9b0120044101742209200a200a2009491b220a4100480d9b012004450d3c20052802002004200a10272204450d3d0c730b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450da9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450da901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141186a280200220c200222046a210b20094102490d89010c8a010b200141206a2802002202200141246a220a2802004f0d0c20022001411c6a280200470d6e200241016a220a2002490d970120024101742209200a200a2009491b220a4100480d97012002450d3a20052802002002200a10272202450d3b0c6d0b200341146a4102360200200341ec006a220141023602002003410236020c200320043602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200329022c210620032802282201450da5010c6b0b200341d8006a200141186a2202200a10ce032003280258450d1f20002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002204200141346a22052802004f0d0f200141206a350200210720042001412c6a280200470d68200441016a22052004490d94012004410174220a20052005200a491b2205ad4203862208422088a70d94012008a7220a4100480d94012004450d3b20022802002004410374200a10272202450d3c0c670b200341ec006a41013602002003410236024c2003420237025c200341c8dac4003602582003200341d4006a3602482003200341c8006a360268200341086a200341d8006a10a2010b200328020821012003200329020c220637022c200320013602282001450da1010c640b200341ec006a41013602002003410236024c2003420237025c20034198dac4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a201200329020c2106200328020822010d310ca0010b200320032d005922013a00482001200241ff0171460d9f0120014104460d9f01200341086a41146a412b360200200341146a412b360200200341d8006a41146a41033602002003410236020c2003420337025c2003418cd2c4003602582003200341c8006a3602182003200341276a3602102003200341206a3602082003200341086a360268200341286a200341d8006a10a201200329022c2106200328022822010d620c9f010b200a410274210a0340200320042802002205360240200220054d0d0a20022005417f736a220520024f0d49200920054103746a22052d00044103460d0920052d0005220b4104460d09200e200b470d09200441046a2104200a417c6a220a0d000b0b200341d8006a200141186a2202200d410010d003024020032d00584101470d00200341306a200341e4006a2802003602002003200329025c370328200328022822020d700c600b200c41ff01714104470d1a0c5e0b200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d5c200441016a220a2004490d8d0120044101742209200a200a2009491b220a4100480d8d012004450d3620022802002004200a10272202450d370c5b0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d8b012003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d8b01200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d99012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d9901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d1720042001411c6a280200470d55200441016a220a2004490d880120044101742209200a200a2009491b220a4100480d88012004450d3320052802002004200a10272204450d340c540b200341d8006a200141186a2205200a200210d00320032d00584101470d18200328025c2202450d63200341e0006a29030021060c250b200341146a4129360200200341ec006a41023602002003200541056a3602102003412936020c2003420237025c200341e4d1c4003602582003200341386a3602082003200341086a360268200341286a200341d8006a10a201200328022822020d670c570b200341146a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200328022821022003200329022c37022c20032002360228200328022822020d660c560b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d93012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d93012000200329022c37020420002001360200200341f0006a24000f0b2004102622020d8e010b20044101102a000b2005102622040d8e010b20054104102a000b2005102622040d86010b20054104102a000b2004102622020d720b20044101102a000b2004102622020d690b20044101102a000b200b1026220c0d690b200b4101102a000b2004102622020d5d0b20044101102a000b200541ff01714104460d8401200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d40200441016a220a2004490d7520044101742209200a200a2009491b220a4100480d752004450d2a20022802002004200a10272202450d2b0c3f0b200341e0006a2903002106200328025c22010d0e0c83010b200341d8006a2002200d200c10d00320032d00584101470d0e200328025c2202450d432003200341e0006a29030037022c20032002360228200328022822020d540c440b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d81012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d8101200329022c21060b2000200637020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d502003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a201200328020c450d4d20032802081023200328022822020d4e0c500b200141206a2802002204200141246a22052802004f0d0b20042001411c6a280200470d38200441016a22052004490d6f20044101742209200520052009491b22054100480d6f2004450d1e200a2802002004200510272204450d1f0c370b200141206a2802002204200141246a22092802004f0d0b20042001411c6a280200470d35200441016a22092004490d6e2004410174220b20092009200b491b22094100480d6e2004450d1f20052802002004200910272204450d200c340b200341e0006a2903002106200328025c22010d0d0c7c0b200a102622020d500b200a4104102a000b2005102622020d4c0b20054101102a000b2004102622050d5f0b20044101102a000b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d752003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d75200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a22052802004f0d0a20042001411c6a280200470d29200441016a22052004490d642004410174220a20052005200a491b22054100480d642004450d1b20022802002004200510272202450d1c0c280b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d722003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d72200329022c21060c380b200341ec006a220241013602002003410236024c200320093602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d3e2003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d3e200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d6f2003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d6f200329022c21060b2000200637020420002001360200200341f0006a24000f0b200a102622040d360b200a4101102a000b200a102622020d320b200a4101102a000b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d692003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d692000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d292003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d292003200329022c37022c20032002360228200328022822020d3a0c2a0b200a102622020d2b0b200a4104102a000b200a102622020d240b200a4101102a000b200a102622040d200b200a4101102a000b2004102622020d5b0b20044101102a000b2005102622040d180b20054101102a000b2009102622040d140b20094101102a000b2005102622020d260b20054101102a000b200a102622020d140b200a4101102a000b2005102622020d0c0b20054101102a000b4182dcc400411d1021000b4118102622000d0241184101102a000b4118102622000d0241184101102a000b4118102622000d0241184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c200320013602584184d1c4004134200341d8006a10dd03000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c200320013602584184d1c4004134200341d8006a10dd03000b4182dcc400411d1021000b4182dcc400411d1021000b411a4101102a000b4182dcc400411d1021000b2001411c6a2005360200200141186a2002360200200141206a28020021040b200141186a28020020046a200c3a0000200141206a2202200228020041016a3602000c0a0b2001411c6a2009360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c140b2001411c6a2005360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2201200128020041016a3602000c450b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c430b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c120b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c3f0b20034100360228200328022822020d100b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d382004410174220c200b200b200c491b220b4100480d382004450d02200141186a2802002004200b1027220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1026220c0d020b200b4101102a000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c3d0b2000200637020420002001360200200341f0006a24000f0b2001412c6a2005360200200141286a2002360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080802084370200200141306a2201200128020041016a3602000c3a0b2000200637020420002001360200200341f0006a24000f0b2001411c6a200a360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c370b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c250b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c330b200341d8006a200141186a200a10ce032003280258450d3220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20032802282202450d020b200329022c21060b2000200637020420002002360200200341f0006a24000f0b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d292004410174220c200b200b200c491b220b4100480d292004450d02200141186a2802002004200b1027220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1026220c0d020b200b4101102a000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c2e0b2000200329022c37020420002002360200200341f0006a24000f0b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c2b0b2001412c6a2005360200200141286a2002360200200141306a28020021020b200141286a28020020024103746a200642288620078442808080801084370200200141306a2201200128020041016a3602000c290b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41023a0000200141206a2201200128020041016a3602000c270b0240200141206a2802002202200141246a22042802004f0d0020022001411c6a280200470d05200241016a22042002490d1820024101742205200420042005491b22044100480d182002450d02200141186a2802002002200410272202450d030c040b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d262003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d26200329022c21060b2000200637020420002002360200200341f0006a24000f0b2004102622020d010b20044101102a000b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c210b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c1f0b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c1a0b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41013a0000200141206a2201200128020041016a3602000c180b2001411c6a2004360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000c160b200341d8006a200141186a2204200141286a410010d003024020032d00584101470d00200328025c2202450d16200341e0006a29030021060c010b0240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d072002410174220a20052005200a491b22054100480d072002450d0220042802002002200510272202450d030c040b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d152003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d15200329022c21060b2000200637020420002002360200200341f0006a24000f0b2005102622020d010b20054101102a000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c100b200141306a2802002202417f6a220420024f0d01200420024b0d010240024002400240200128022820044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d042004410174220c200b200b200c491b220b4100480d042004450d02200141186a2802002004200b1027220c450d030c060b2005200220052002491b21040c090b200141186a280200220c200222046a210b20094102490d050c060b200b1026220c0d030b200b4101102a000b101e000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c080b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080803084370200200141306a2201200128020041016a3602000c060b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c040b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41033a0000200141206a2201200128020041016a3602000c020b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a2006422886200784370200200141306a2201200128020041016a3602000b20004100360200200341f0006a24000b19002000200141186a280200360204200020012802103602000bb310012e7f230041a0016b2202240002400240024002402000280200220341f098c400460d00200028020421040c010b41ec0010262203450d0141002104200341003b010620034100360200200341086a200241086a41e4001094041a20004100360204200020033602000b200141ff017121050c010b41ec004104102a000b41002107024003400240024002400240024002400240024020070e020001010b200341086a210820032f0106210641002107024002400240034020062007460d014100417f4101200820076a2d0000220920054b1b20092005461b2209450d02200741016a210720094101460d000b2007417f6a21060b02402004450d002004417f6a2104200320064102746a41ec006a2802002103410021070c0a0b2000200028020841016a36020820032f01062207410b4f0d01200341086a2209200641016a220a6a200920066a2209200720066b1095041a200920013a0000200341146a2207200a4103746a200720064103746a2209200341066a22072f010020066b4103741095041a20094101360200200720072f010041016a3b0100200241a0016a24000f0b200320074103746a41146a42013702000c090b41ec001026220b450d04200b41003b0106200b4100360200200b41086a200241086a41e40010940421092003410e6a2d0000210c2003280248210d2003280244210e20092003410f6a200341066a220a2f010041796a22071094042109200b41146a200341cc006a2007410374109404210f200a41063b0100200b20073b010602400240200641064b0d00200341086a2207200641016a22096a200720066a220a200341066a22072f010020066b1095041a200a20013a0000200341146a220a20094103746a200a20064103746a220920072f010020066b4103741095041a200941013602000c010b20092006417a6a220a6a2009200641796a22066a2209200741ffff037120066b1095041a200920013a0000200f200a4103746a200f20064103746a2209200b41066a22072f010020066b4103741095041a200941013602000b4101210a200720072f010041016a3b010020032802002210450d014104210f410a2111419c0121124100211341082114419401211541c800211641c4002117410e2118410f21194106211a4179211b41cc00211c4114211d4103211e418801211f41ec002120417a21214102212241ffff03212341f0002124416c212541d4002126200341046a2f0100212720102f01062207410a4b0d060c020b201210262208450d02200820133b010620082013360200200820146a200241086a20151094042106201020166a280200212a201020176a2802002129201020186a2d000021282006201020196a2010201a6a222b2f01002209201b6a2207109404212c2008201d6a2010201c6a2007201e74109404212d200820206a2010201f6a200920216a222e202274109404212f202b201a3b0100200820073b01060240202e450d0041002107202f210603402006280200220920073b0104200920083602002006200f6a2106202e2007200a6a2207470d000b0b024002402027201a4b0d00201020146a22062027200a6a22076a200620276a2206202b2f0100220920276b222e1095041a2006200c3a00002010201d6a22062007201e746a20062027201e746a2206202e201e741095041a2006200e3602002006200d360204202b2009200a6a22063b0100201020206a22092027202274222b6a20146a200920072022746a222e2006202371220920076b2022741095041a202e200b360200202720094f0d012010202b6a20246a21070340200728020022062027200a6a22273b0104200620103602002007200f6a210720092027470d000c020b0b202c202720216a22066a202c2027201b6a22076a222e2008201a6a22092f010020076b1095041a202e200c3a0000202d2006201e746a202d2007201e746a222e20092f010020076b201e741095041a202e200e360200202e200d360204200920092f0100200a6a222e3b0100202f2027202274222b6a20256a202f20062022746a2209202e202371222720066b2022741095041a2009200b360200200620274b0d002008202b6a20266a21060340200628020022092007200a6a22073b0104200920083602002006200f6a210620272007470d000b0b024020102802002207450d002028210c2029210e202a210d2008210b2010200f6a2f01002127200722102f0106220720114d0d02410121070c070b2008210b202a210d2029210e2028210c0b419c0110262207450d03200741003b010620074100360200200741086a200241086a419401109404210920072000280200220636026c200020073602002000200028020441016a360204200641003b010420062007360200200720072f010622064103746a220a41186a200d360200200a41146a200e360200200920066a200c3a0000200741ec006a200641016a22064102746a200b360200200720063b0106200b20063b0104200b2007360200200241a0016a24000f0b201041086a2209202741016a22066a200920276a2209200720276b220a1095041a2009200c3a0000201041146a220920064103746a200920274103746a2209200a4103741095041a2009200e3602002009200d360204201041066a200741016a22073b0100201041ec006a220920274102746a41086a200920064102746a2209200741ffff0371220a20066b4102741095041a2009200b3602002027200a4f0d0520102006417f6a22074102746a41f0006a2106034020062802002209200741016a22073b010420092010360200200641046a2106200a2007470d000c060b0b419c014104102a000b41ec004104102a000b419c014104102a000b410121070c000b0b200241a0016a24000bbb3101a6017f23004190016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a280200210320012802082104024002400240200141106a2802002205450d0041002106417f2107412c2108417e2109410d210a4104210b4170210c4158210d4109210e4108210f41ffffffff03211041142111416c2112411c21134118211441ff012115410221164174211741012118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021230c010b4104215f410021604100216141002162410021634104216441002165410021664104216741002168410021694104216a4100216b4100216c4104216d41002105410021264104216e4100216f41002170410421714100217241002173410421744100217541002176410421774100217841002179410021010c010b410121010b034002400240024002400240024002400240024002400240024020010e020001010b4104210641002153410021500c010b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020230e050001020304040b20252124202221262004200520076a220520086c6a2201280024212720012800202128200128001821292001280014212a2001280010212b200128000c212c2001280008212d2001280004212e4101212f0240024020012d0000223020096a2201200a4b0d0041012131410121324101213341012134410121354101213641012122202e2125024002400240024002400240024002400240024020010e0e000203040501062d07080927272f000b02402021450d0002402037450d002037200b74212520212101034002402001200b6a280200450d00200128020010230b200141106a21012025200c6a22250d000b0b2038450d00202110230b410121314100212f202c2137202d2138202e21210c0a0b201c450d1d2039450d1c201c2039200b746a213a201c213b4100213c0c260b02402020450d000240203e450d00203e41286c212520202101034002402001200b6a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a21012025200d6a22250d000b0b203f450d00202010230b410021314101212f202c213e202d213f202e21200c080b02402040450d00201f450d00201f10230b2026212220242125202e211f202d2140202c214120050d0e0c2a0b02402042450d00201e450d00201e10230b2026212220242125202e211e202d2142202c214320050d0c0c290b02402044450d00201d450d00201d10230b2026212220242125202e211d202d2144202c214520050d0a0c280b0240201b450d0002402046450d00204620116c2125201b2101034002402001200b6a280200450d00200128020010230b200120116a2101202520126a22250d000b0b2047450d00201b10230b410021334101212f202c2146202d2147202e211b41012131410121320c1f0b201a450d192048450d18201a204820136c6a2149201a214a4101213c0c210b2019450d1a204c450d192019204c20146c6a214d2019214e4102213c0c210b2006450d1b2050450d1a2006205020136c6a2151200621524103213c0c210b410121310b41012132410821010c200b02402082012802082223450d0020820128020021012023207b7421230340024020012d0000207e470d002001207f6a28020020800171450d002001207b6a28020010230b2001207d6a210120232081016a22230d000b0b208201207d6a21010240208201207b6a280200450d0020820128020010230b20012182012001207c470d060c240b0240208e012086016a2802002223450d00208e01280204210120232089017421230340024020012d0000208b01470d0020012087016a280200208c0171450d0020012089016a28020010230b2001208a016a21012023208d016a22230d000b0b0240208e012087016a280200450d00208e012089016a28020010230b208e012084016a21010240208e012088016a280200450d00208e0128021010230b2001218e012001208501470d060c240b0240209a012092016a280200450d00209a0128020010230b0240209a012093016a2802002223450d00209a0128020c210120232092017421230340024020012d0000209601470d0020012097016a28020020980171450d0020012092016a28020010230b20012094016a210120232099016a22230d000b0b209a012090016a21010240209a012094016a280200450d00209a012095016a28020010230b2001219a012001209101470d060c240b024020a701209f016a2802002223450d0020a7012802042101202320a2017421230340024020012d000020a401470d00200120a0016a28020020a50171450d00200120a2016a28020010230b200120a3016a2101202320a6016a22230d000b0b024020a70120a0016a280200450d0020a70120a2016a28020010230b20a701209d016a2101024020a70120a1016a280200450d0020a70128021010230b200121a7012001209e01470d060c240b410021230c060b410021230c060b410021230c060b410121230c060b410221230c060b410321230c060b410421230c060b410121010c220b410121010c210b410121010c200b410121010c1f0b410121010c1e0b410121010c1d0b410121010c1c0b410021010c0d0b410121010c0c0b410221010c0b0b410321010c0a0b410421010c090b410521010c080b410621010c070b410721010c060b410921010c050b410a21010c040b410b21010c030b410b21010c020b410b21010c010b410b21010b0240024002400340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0c000102030405060708090b0d0d0b203d450d17201c1023410121010c2a0b410021324101212f202c2139202d213d202e211c410121310c1a0b204b450d16201a1023410321010c280b410021344101212f202c2148202d214b202e211a4101213141012132410121330c060b204f450d1520191023410521010c260b410021354101212f202c214c202d214f202e211941012131410121324101213341012134410121362030200a4d0d060c270b2053450d1420061023410721010c240b410021364101212f202c2150202d2153202e210641012131410121324101213341012134410121352030200a4d0d040c250b41012133410921010c220b410121340b4101213541012136410a21010c200b2030200a4b0d210b202621222024212502400240024002400240024002400240024020300e0e2800010228282803042b05060708280b0240202d450d00202e10230b202a450d29202b10230c290b202f450d28202c450d26202c200b742125202e2101034002402001200b6a280200450d00200128020010230b200141106a21012025200c6a22250d000c270b0b2031450d27202c450d25202c41286c2125202e2101034002402001200b6a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a21012025200d6a22250d000c260b0b2032450d26202c450d24202e202c200b746a2154202e21554104213c0c190b2033450d25202c450d23202c20116c2125202e2101034002402001200b6a280200450d00200128020010230b200120116a2101202520126a22250d000c240b0b2034450d24202c450d22202e202c20136c6a2156202e21574105213c0c190b2035450d23202c450d21202e202c20146c6a2158202e21594106213c0c1a0b2036450d22202c450d20202e202c20136c6a215a202e215b4107213c0c1b0b02400240202e20157122012016460d0020012018460d01202c450d23202d10230c230b202a450d02202c202a200b746a215c202c215d4108213c0c1d0b202a450d01202a410c6c212e202c21010340024020012802002225450d002001200b6a280200450d00202510230b2001410c6a2101202e20176a222e0d000c020b0b024002400240024002400240024002400240203c0e09000102030405060708080b0240203b2802082225450d00203b28020021012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b203b41106a21010240203b200b6a280200450d00203b28020010230b2001213b2001203a470d09410021010c250b0240204a410c6a2802002225450d00204a28020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b0240204a200f6a280200450d00204a200b6a28020010230b204a20136a21010240204a20116a280200450d00204a28021010230b2001214a20012049470d09410221010c240b0240204e200b6a280200450d00204e28020010230b0240204e20116a2802002225450d00204e28020c21012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b204e20146a21010240204e41106a280200450d00204e410c6a28020010230b2001214e2001204d470d09410421010c230b02402052410c6a2802002225450d00205228020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b02402052200f6a280200450d002052200b6a28020010230b205220136a21010240205220116a280200450d00205228021010230b2001215220012051470d09410621010c220b024020552802082225450d00205528020021012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b205541106a210102402055200b6a280200450d00205528020010230b2001215520012054470d090c220b02402057410c6a2802002225450d00205728020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b02402057200f6a280200450d002057200b6a28020010230b205720136a21010240205720116a280200450d00205728021010230b2001215720012056470d090c210b02402059200b6a280200450d00205928020010230b0240205920116a2802002225450d00205928020c21012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b205920146a21010240205941106a280200450d002059410c6a28020010230b2001215920012058470d090c200b0240205b410c6a2802002225450d00205b28020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b0240205b200f6a280200450d00205b200b6a28020010230b205b20136a21010240205b20116a280200450d00205b28021010230b2001215b2001205a470d090c1f0b205d225e41106a215d0240205e2802042201450d000240205e410c6a2802002225450d002025410c6c21250340024020012802002222450d002001200b6a280200450d00202210230b2001410c6a2101202520176a22250d000b0b205e200f6a280200450d00205e200b6a28020010230b205d205c470d090b202b450d1f202c10230c1f0b4100213c0c0d0b4101213c0c0d0b4102213c0c0d0b4103213c0c0d0b4104213c0c0e0b4105213c0c0f0b4106213c0c100b4107213c0c110b4108213c0c120b410121010c120b410321010c110b410521010c100b410721010c0f0b410821010c0e0b410b21010c0d0b410b21010c0c0b410b21010c0b0b410b21010c0a0b410b21010c090b410b21010c080b410b21010c070b410b21010c060b410b21010c050b410b21010c040b410b21010c030b410b21010c020b410b21010c010b410b21010c000b0b202d450d01202e10230c010b0240202d450d00202e10230b0240202a450d002029450d00202a10230b2027450d00202810230b20262122202421250b20050d070b4100210520252124202221260b204c410020191b2160204f410020191b216120484100201a1b2179204b4100201a1b217820464100201b1b216220474100201b1b216320394100201c1b2176203d4100201c1b217520454100201d1b216520444100201d1b216620434100201e1b217320424100201e1b217220414100201f1b216820404100201f1b2169203e410020201b2170203f410020201b216f2037410020211b216b2038410020211b216c2019410420191b215f201a4104201a1b2177201b4104201b1b2164201c4104201c1b2174201d4104201d1b2167201e4104201e1b2171201f4104201f1b216a2020410420201b216e2021410420211b216d20060d00410021010c0a0b2002280200217a0240200241086a2802002201450d0020014104742123207a210103400240200141046a280200450d00200128020010230b200141106a2101202341706a22230d000b0b02402002280204450d00207a10230b2002410c6a280200217a0240200241146a2802002201450d00200141286c2123207a210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101202341586a22230d000b0b0240200241106a280200450d00207a10230b02402002411c6a280200450d00200241186a28020010230b0240200241286a280200450d00200241246a28020010230b0240200241346a280200450d00200241306a28020010230b2002413c6a280200217a200241c4006a2802002201450d004104217b207a20014104746a217c4110217d4109217e4108217f41ffffffff032180014170218101207a218201410121230c050b0240200241c0006a280200450d00207a10230b200241c8006a2802002183010240200241d0006a2802002201450d00200141146c2123208301210103400240200141046a280200450d00200128020010230b200141146a21012023416c6a22230d000b0b0240200241cc006a280200450d0020830110230b200241dc006a280200218301200241e4006a2802002201450d00411c2184012083012001411c6c6a218501410c2186014108218701411421880141042189014110218a014109218b0141ffffffff03218c014170218d01208301218e01410221230c050b0240200241e0006a280200450d0020830110230b200241e8006a280200218f01200241f0006a2802002201450d004118219001208f01200141186c6a219101410421920141142193014110219401410c2195014109219601410821970141ffffffff032198014170219901208f01219a01410321230c050b0240200241ec006a280200450d00208f0110230b418001219b01200241f4006a280200219c01200241fc006a2802002201450d00411c219d01209c012001411c6c6a219e01410c219f01410821a001411421a101410421a201411021a301410921a40141ffffffff0321a501417021a601209c0121a701410421230c050b2002209b016a21010240200241f8006a280200450d00209c0110230b200110ef03024020024184016a2201280200450d0020024180016a28020010230b20024188016a20053602002001200336020020024180016a2004360200200241fc006a2050360200200241f8006a2053360200200241f4006a2006360200200241f0006a2060360200200241ec006a2061360200200241e8006a205f360200200241e4006a2079360200200241e0006a2078360200200241dc006a2077360200200241d8006a2024360200200241d4006a2026360200200241d0006a2062360200200241cc006a2063360200200241c8006a2064360200200241c4006a2076360200200241c0006a20753602002002413c6a2074360200200241386a2065360200200241346a2066360200200241306a20673602002002412c6a2073360200200241286a2072360200200241246a2071360200200241206a20683602002002411c6a2069360200200241186a206a360200200241146a2070360200200241106a206f3602002002410c6a206e360200200241086a206b3602002002206c3602042002206d36020020002002418c011094041a20024190016a24000f0b41002123410121010c040b410121010c030b410121010c020b410121010c010b410121010c000b0b9a0c02297f017e230041106b22022400024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042101200241086a200010be0320022802082208200228020c22094104746a210a4100210b20094104490d0141ff01210c200341ff0171210d4101210e410d210f411c211041182111411d2112412c21134128211441202115412d2116413c211741c0002118413821194130211a413d211b413f211c4101211d0c020b20012802042104200241106a240020040f0b410021090c010b410121090b02400240024003400240024002400240024002400240024002400240024002400240024002400240024020090e020001010b2008200a460d01410421210240200741ff017122224104470d0041102123200341ff0171212441012125410d21264100211d0c0c0b41102127200341ff0171212841012129410d212a4102211d0c0f0b024002400240201d0e03010002020b024020082d000c200d470d0020082802082004470d002008280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008200f6a2d0000221f410446221e470d00201f2009460d0720200d07201e0d070b0240200820106a2d0000200d470d00200820116a2802002004470d00200841106a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820126a2d0000221f410446221e470d00201f2009460d0420200d04201e0d040b0240200820136a2d0000200d470d00200820146a2802002004470d00200820156a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820166a2d0000221f410446221e470d00201f2009460d0520200d05201e0d050b0240200820176a2d0000200d470d00200820196a2802002004470d002008201a6a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008201b6a2d0000221f410446221e470d00201f2009460d0620200d06201e0d060b200b41046a210b200a200820186a22086b201c4b0d0a410021090c110b024020082d000c2024470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920256a2109201f2d0000201d2d0000460d000c020b0b200820266a2d00002021460d060b200b20256a210b200820236a2208200a470d080c010b024020082d000c2028470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920296a2109201f2d0000201d2d0000460d000c020b0b2008202a6a2d000022092022470d0020092021470d050b200b20296a210b200820276a2208200a470d090b024002400240200041046a28020020002802082208470d00200841016a22092008490d082008410174220e20092009200e491b220ead420486222b422088a70d08202ba7221d4100480d082008450d0120002802002008410474201d10272209450d020c120b200028020021090c120b201d102622090d100b201d4104102a000b200b410172210b20050d030c100b200b410272210b20050d020c0f0b200b410372210b0b2005450d0d0b20011023200241106a2400200b0f0b101e000b4100211d0c030b4101211d0c030b4102211d0c030b410121090c040b410121090c030b410121090c020b410121090c010b410121090c000b0b20002009360200200041046a200e360200200041086a28020021080b200920084104746a220820063b010e200820073a000d200820033a000c200820043602082008200536020420082001360200200041086a2204200428020041016a3602002002200010be032002280204417f6a210b0b200241106a2400200b0bac24032d7f017e2b7f230041306b220224002001280204210320012802002104410121050240024002400240024020012802082206450d00412c10262207450d02200720022f002d3b0001200741023a00002007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002108410121090c010b4104210741002109410121080b200141106a280200210a200128020c210b024002400240200141146a280200220c450d002009410174220d200941016a220e200e200d491b220d412c6c210e2009450d0120072009412c6c200e10272207450d020c040b2009210d0c040b200e102622070d020b200e4104102a000b412c4104102a000b20072009412c6c6a220e20022f002d3b0001200e41033a0000200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200941016a2109410021050b2001411c6a280200210f2001280218211041002111024002400240024002400240024002400240200141206a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310272207450d020c030b410021140c040b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012114200941016a21090b200141286a28020021152001280224211602402001412c6a2802002212450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310272207450d010c020b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41053a0000200e201236000c200e2015360008200e2016360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012111200941016a21090b200141346a280200211720012802302118024002400240024002400240200141386a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310272207450d020c030b410021190c040b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41063a0000200e201236000c200e2017360008200e2018360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012119200941016a21090b200141c0006a280200211a200128023c211b4101211c024002400240024002400240200141c4006a280200221d450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210272207450d020c030b4101211e0c040b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e41073a0000200e201d36000c200e201a360008200e201b360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100211e0b200141cc006a280200211f200128024821200240200141d0006a2802002221450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210272207450d010c020b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e41083a0000200e202136000c200e201f360008200e2020360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241086a41086a290200370200200e2002290208370210200941016a21094100211c0b41012122024020012802544101470d00200141d8006a28020021120240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310272207450d010c020b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41093a0000200e2012360204200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41206a280200360200200e41206a200241086a41186a290200370200200e41186a200241086a41106a290200370200200e41106a200241106a290200370200200e2002290208370208200941016a21090b200141e0006a2802002123200128025c21240240200141e4006a2802002225450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210272207450d010c020b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e410a3a0000200e202536000c200e2023360008200e2024360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021220b200141ec006a28020021262001280268212741012128024002400240024002400240200141f0006a2802002229450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210272207450d020c030b4101212a0c040b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e410b3a0000200e202936000c200e2026360008200e2027360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100212a0b200141f8006a2802002112200128027421130240200141fc006a280200222b450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22282028200e491b220ead422c7ea722284100480d02024002400240200d450d002007200d412c6c202810272207450d010c020b2028102622070d010b20284104102a000b200e210d0b20072009412c6c6a220e410c3a0000200e202b36000c200e2012360008200e2013360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021280b20014184016a280200212c200128028001210e024002400240200d20096b20014188016a280200412c6c222d412c6d22014f0d00200920016a22012009490d03200d410174222e20012001202e491b222ead422c7e222f422088a70d03202fa722304100480d03200d450d012007200d412c6c203010272207450d020c040b200920016a21010c040b2030102622070d020b20304104102a000b101e000b202e210d0b20072009412c6c6a200e202d1094041a0240202c450d00200e10230b0240024002400240024041c00510262209450d002000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200936021020024280c2cdeb16370308200241106a10ef03200910232028450d02202b450d01411c21312013202b411c6c6a2132410c2133410821344114213541042136411021374109213841ffffffff0321394170213a2013213b4100213c0c030b41c0054104102a000b410021010c020b410121010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b2012450d0e20131023410121010c160b202a450d022029450d014118213d2027202941186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff03214541702146202721474101213c0c0f0b02400240203c0e0400010407070b0240203b20336a2802002209450d00203b2802042101200920367421090340024020012d00002038470d00200120346a280200203971450d00200120366a28020010230b200120376a21012009203a6a22090d000b0b0240203b20346a280200450d00203b20366a28020010230b203b20316a21010240203b20356a280200450d00203b28021010230b2001213b20012032470d09410021010c150b02402047203f6a280200450d00204728020010230b0240204720406a2802002209450d00204728020c21012009203f7421090340024020012d00002043470d00200120446a280200204571450d002001203f6a28020010230b200120416a2101200920466a22090d000b0b2047203d6a21010240204720416a280200450d00204720426a28020010230b200121472001203e470d090b2026450d00202710230b2022450d022025450d01411c214820242025411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff03215041702151202421524102213c0c0e0b02402052204a6a2802002209450d00205228020421012009204d7421090340024020012d0000204f470d002001204b6a280200205071450d002001204d6a28020010230b2001204e6a2101200920516a22090d000b0b02402052204b6a280200450d002052204d6a28020010230b205220486a210102402052204c6a280200450d00205228021010230b2001215220012049470d070b2023450d00202410230b0240201c450d0002402021450d00202141146c21092020210103400240200141046a280200450d00200128020010230b200141146a21012009416c6a22090d000b0b201f450d00202010230b201e450d02201d450d0141042153201b201d4104746a215441102155410921564108215741ffffffff03215841702159201b215a4103213c0c0d0b0240205a2802082209450d00205a2802002101200920537421090340024020012d00002056470d00200120576a280200205871450d00200120536a28020010230b200120556a2101200920596a22090d000b0b205a20556a21010240205a20536a280200450d00205a28020010230b2001215a20012054470d050b201a450d00201b10230b02402017410047201941017371450d00201810230b02402015410047201141017371450d00201610230b0240200f410047201441017371450d00201010230b02402005450d000240200c450d00200c41286c2109200b210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200941586a22090d000b0b200a450d00200b10230b02402008450d0002402006450d00200641047421092004210103400240200141046a280200450d00200128020010230b200141106a2101200941706a22090d000b0b2003450d00200410230b200241306a24000f0b4100213c0c040b4101213c0c050b4102213c0c060b4103213c0c070b410121010c070b410221010c060b410221010c050b410221010c040b410221010c030b410221010c020b410221010c010b410221010c000b0bb505000240024002400240024002400240024002400240200041ff0171417f6a220041aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020000eab014a00000000000000000000000000010101010103030404050506060707080809094b0a0a0b0b0c0c0d0d4c4d0e0e0f0f10101111121213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f20204e212122224f2323242450252526262727282829292a2a512b2b2c2c2d2d2e2e2f2f30303131323233333434353536363737383839393a3a3b3b3c3c3d3d3e3e523f3f404041414242434344444545464647474848020202024a0b410a0f0b41080f0b41100f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410f0f0b410f0f0b410e0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b41110f0b41120f0b41050f0b41130f0b41140f0b41000f0b41020f0b41000f0b41020f0b410e0b800203047f017e017f024002400240200041086a28020022032001490d0002400240024002402003200041046a280200470d00200341016a22042003490d0320034101742205200420042005491b2206ad4204862207422088a70d032007a722084100480d032003450d0120002802002003410474200810272205450d020c050b200341016a2104200028020021050c050b2008102622050d030b20084108102a000b101e000b4180e4c400104f000b20002005360200200041046a20063602000b200520014104746a220541106a2005200320016b4104741095041a200541086a200241086a29030037030020052002290300370300200041086a20043602000b9e0503057f017e017f230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a10c8032103024002400240024002400240024002402000411c6a280200200041206a2802002204470d00200441016a22052004490d0520044101742206200520052006491b2206ad4202862207422088a70d052007a722084100480d052004450d01200041186a2802002004410274200810272205450d020c030b200041186a28020021050c030b2008102622050d010b20084104102a000b2000411c6a2006360200200041186a2005360200200041206a28020021040b200520044102746a2003360200200041206a2204200428020041016a360200200241186a41106a200241106a290300370300200241186a41086a200241086a29030037030020022002290300370318024002400240200041ec006a280200200041f0006a2802002204470d00200441016a22052004490d0320044101742203200520052003491b2203ad42187e2207422088a70d032007a722064100480d032004450d01200041e8006a280200200441186c200610272205450d020c040b200041e8006a28020021050c040b2006102622050d020b20064104102a000b101e000b200041ec006a2003360200200041e8006a2005360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000b929601150b7f017e587f037e047f017e387f027e1c7f027e137f037e3e7f027e017f017e047f047e277f017e227f23002203210420034180096b41607122032400024002400240024002400240024002400240411010262205450d00200541063a0000412010262206450d01200641063a00104100210720064100360204200620032f00c0053b00012006412d3a0000200641036a200341c2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d00200528020410230b20051023200141106a2802002208412c6c21092001280208210a024002400240024002400240034020092007460d01200a20076a21052007412c6a220b210720052d00004107470d000b200320032f01a0033b01c005200a200b6a220541586a210a2005415c6a2208280200200541606a22092802002207470d01200741016a220b2007490d0e2007410174220c200b200b200c491b220dad420486220e422088a70d0e200ea7220c4100480d0e2007450d04200541586a2802002007410474200c1027220b450d050c0b0b411010262205450d0720054180023b010c200542828080802037020420052006360200200520032f01a0033b010e2001410c6a2802002008470d09200841016a22072008490d0d20084101742209200720072009491b2207ad422c7e220e422088a70d0d200ea722094100480d0d2008450d01200a2008412c6c20091027220a450d020c080b200a280200210b0c0a0b20091026220a0d060b20094104102a000b200c1026220b0d060b200c4104102a000b41104108102a000b41204108102a000b41104104102a000b2001410c6a2007360200200141086a200a3602000b200141106a200841016a220c360200200a2008412c6c6a220720032f00b0043b0001200741073a0000200742818080801037000820072005360004200720032902c005370210200741036a200341b2046a2d00003a0000200741186a200341c8056a290200370200200741206a200341c0056a41106a290200370200200741286a200341c0056a41186a2802003602004100210f0c020b2008200d360200200541586a200b360200200928020021070b200b20074104746a22074180023b010c200742828080802037020420072006360200200720032f01c0053b010e2009200928020041016a360200200341c0006a200a10be032003280244417f6a210f200141106a280200210c200141086a280200210a0b200c412c6c2107200a41586a210502400340410021062007450d01200741546a2107200541286a21092005412c6a220b210520092d00004103470d000b200b41086a2802002207450d00200741286c2105200b28020041186a2107410021060340200620072d0000456a2106200741286a2107200541586a22050d000b0b200c412c6c2107200a41586a210502400340410021092007450d01200741546a2107200541286a210b2005412c6a22082105200b2d00004103470d000b200841086a2802002207450d00200741286c2105200828020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b200c412c6c2107200a41606a21050240024003402007450d01200741546a2107200541206a210b2005412c6a220a2105200b2d00004104470d000b200a28020021070c010b410021070b0240200720096a2210ad220e421e88a70d00200e420286a72207417f4c0d0002400240024002400240024002402007450d00200710ac01220a450d0220100d010c030b4104210a2010450d030b200a20104102746a2111410021124101211341042114200141106a2115412c211641082117200141086a2118415821194154211a4128211b410b211c4118211d4103211e200a211f410021200c030b20074104102a000b410021070c020b410021070c010b410121070b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e020001010b200141086a2802002121412c2123200141106a280200220d450d360c010b02400240024002400240024002400240024020200e050001030405050b024020122006490d002015280200220d20166c220921072018280200222120196a220b210502400340410021082007450d012007201a6a21072005201b6a210c200520166a22222105200c2d0000201e470d000b202220176a2802002207450d002007201b6c21052022280200201d6a2107410021080340200820072d0000456a21082007201b6a2107200520196a22050d000b0b201220086b220820124b0d0603402009450d032009201a6a2109200b201b6a2107200b20166a2205210b20072d0000201c470d000b200520176a28020020084d0d0720052802002008201d6c6a2802082105200341c0056a2008200110e30320032802c405210720032802c0052013460d08201f200720056a3602000b201220136a2112201f20146a221f2011470d0c410021070c420b20212d0000202a470d3b202128020c2207450d3b202128020422702007202b6c6a2171410021720c1f0b412c10262207450d07200741286a41002800e6de44360000200741206a41002900dede44370000200741186a41002900d6de44370000200741106a41002900cede44370000200741086a41002900c6de44370000200741002900bede443700000c350b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020ca01209a01712207209201460d002007209b01470d01208b0121d201410021070c4c0b20c901209a01712207209b01460d0102402007209201470d00034020990120900122076b209c014d0d05200728020c450d092007209e016a280200450d0d200720a1016a280200450d11200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c150b034020990120900122076b209c014d0d05200728020c450d092007209e016a280200450d0d200720a1016a280200450d11200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c190b20c901209a01712207209b01460d0102402007209201470d00034020990120900122076b209c014d0d06200728020c450d0a2007209e016a280200450d0e200720a1016a280200450d12200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c1b0b034020990120900122076b209c014d0d06200728020c450d0a2007209e016a280200450d0e200720a1016a280200450d12200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c1d0b024020c701209201470d00208b0120c801470d390b0340209101209701460d4d200341286a20910110c5032003280228228b01450d4d2091012096016a219101208b01208b01200328022c209b01746a22c801460d000b410321070c490b20c701209201470d28208b0120c801470d380c270b2007209901460d4a2007209d016a21d4010340200728020c450d1020d4012098016a21d40120072098016a2207209901470d000c4b0b0b2007209901460d102007209d016a21d4010340200728020c450d1420d4012098016a21d40120072098016a2207209901470d000b20990121900120c701209201460d2d0c2e0b410121c9012007209901460d102007209d016a21d4010340200728020c450d1520d4012098016a21d40120072098016a2207209901470d000b209901219001208b0121d2012094010d310c480b2007209901460d102007209d016a21d4010340200728020c450d1720d4012098016a21d40120072098016a2207209901470d000b20990121900120c701209201460d270c280b2007209d016a21d40120072098016a2190010c0c0b2007209d016a21d40120072098016a2190010c100b2007209d016a21d40120072098016a2190010c110b2007209d016a21d40120072098016a2190010c130b2007209f016a21d401200720a0016a2190010c080b2007209f016a21d401200720a0016a2190010c0c0b2007209f016a21d401200720a0016a2190010c0d0b2007209f016a21d401200720a0016a2190010c0f0b200720a2016a21d401200720a3016a2190010c040b200720a2016a21d401200720a3016a2190010c080b200720a2016a21d401200720a3016a2190010c090b200720a2016a21d401200720a3016a2190010c0b0b20d401208f016a2190010b410121c901208b0121d201410421070c360b200721900120c701209201470d1b0c1a0b2007219001208b0121d2012094010d1f0c370b200721900120c701209201470d150c140b20d401208f016a2190010b410121ca01410021c9010c020b20d401208f016a2190010b410021ca01410121c9010b208b0122d201218b01200320d40128020022d30136027c200a0d1c0c2f0b20d401208f016a2190010b410021c901410021ca01208b0122d201218b01200320d40128020022d30136027c200a0d190c2d0b20d001220720f4016a21d001200728020021c302200341e0006a21c402200328026421c5020c140b024020d1022d0000220720d302460d000240200720df02460d00200720d702470d2e20d10228020c2207450d2e20d10228020422e102200720e0026c6a21e202410b21720c290b20d10228020421e602200341e0006a21e702200328026421e8020c150b20d10228020c2207450d2c20d10228020422e902200720d4026c6a21ea02410d21720c290b412c10262207450d04200741286a41002800bade44360000200741206a41002900b2de44370000200741186a41002900aade44370000200741106a41002900a2de44370000200741086a410029009ade4437000020074100290092de443700000c310b411e10262207450d04200741166a4100290080df44370000200741106a41002900fade44370000200741086a41002900f2de44370000200741002900eade44370000429e808080e003210e0c310b200341c8056a290300210e200a102320070d314100210a412c2123200d450d350b2021200d20236c6a212441142125200341b0046a41146a2126200341b0076a212741012128200341c0056a4101722129410b212a4118212b410c212c4104212d4102212e200341a4076a212f200341a0076a21304113213120034190076a213241d700213320034184076a213420034180076a2135412d2136200341f4066a2137200341f0066a213841122139200341e4066a213a200341e0066a213b200341d0066a213c4106213d200341c0066a213e4100213f200341b0066a21404184082141200341a0066a21424137214320034194066a214420034190066a214520034184066a214620034180066a2147200341f4056a2148200341f0056a21494120214a200341c0056a41206a214b41d600214c4110214d200341c0056a41106a214e4108214f200341b0046a41086a215041ac0121514109215241ffffffff032153200341e8056a2154200341e4056a2155200341f8056a215620034188066a215720034198066a2158200341a8066a2159200341a4066a215a200341b8066a215b200341b4066a215c200341c8066a215d200341c4066a215e200341d8066a215f200341d4066a2160200341e8066a2161200341f8066a216220034188076a216320034198076a216420034194076a2165200341a8076a21664208216742042168422021694103216a4170216b41ff01216c412c216d4201216e4198dfc400216f410121200c040b412c4101102a000b412c4101102a000b411e4101102a000b41002120410121070c350b410121070c340b410321720c120b410421720c120b410521720c120b410621720c120b410521720c120b410621720c120b410721720c120b410821720c120b410721720c120b410821720c120b410921720c120b410c21720c130b410121070c140b410121070c130b410221070c120b410221070c110b410321070c100b410521070c0f0b410621070c0e0b410621070c0d0b410621070c0c0b410621070c0b0b410621070c0a0b410621070c090b410621070c080b410621070c070b410621070c060b410621070c050b410621070c040b410621070c030b410621070c020b410621070c010b410621070b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e0700010203070811110b209401450d3c410121070c390b4100219401410221ca0120930121d301410021930120d201218b01200320d30136027c200a450d39410221070c380b201020d3014d0d07200a20d301209b01746a2802002205450d0d20cc0120cb01470d0320cb012092016a220720cb01490d4c20cb01209201742209200720072009491b22cc01ad20a70186220e20a80188a70d4c200ea72207208e01480d4c20cb01450d0120ce0120cb01209b01742007102722cd010d020c0b0b208b01450d39208b01208f016a21d201410121c701410221c901208b0121d4010c190b2007102622cd01450d090b20cd0121ce0120cd0121cf0120cd0121d0010b20d00120cb01209b01746a20d301360200200341c0056a200328027c22d501200341c8006a10e50320ab0128020021d60120032802c40521d10120032802c00522d701209201460d0420d101280208220720ac014c0d4720d101280200210920d1012d000c210b024002402007450d002007102622080d010c080b410121080b200820092007109404210920d10120ad016a2d000021082003200536029c012003200328027c360298012003208e0136029001200320083a008d012003200b3a008c0120032007360288012003200736028401200320093602800102400240200328027022d801209501460d00200328027421d9010c010b20ae01102622d801450d09410021d90120d80141003b010620d801410036020020d80120aa016a200341c0056a20af011094041a20034100360274200320d8013602700b20cb012092016a21cb010c0b0b410121ca010c010b208b01208f016a21d201410021ca01410221c901410121c701208b0121d401208b01450d100b20d201218b01200320d40128020022d30136027c200a0d110c310b200341d4056a4101360200200341023602a403200341d0056a200341a0036a360200200342023702c405200341b8e4c4003602c0052003200341fc006a3602a003200341b0046a200341c0056a10a20120032902b404220e422088a7210520032802b00421d101200ea721d6010c010b20a90128020021050b20032802702003280274200341f8006a28020010e603024020cc01450d0020cd0110230b0240208c01450d00208c01412c6c218b01208d01210703402007109f012007412c6a2107208b0141546a228b010d000b0b0240200341d4006a280200450d00208d0110230b200020d10136020420004101360200200041086a2005ad42208620d601ad84370200200a450d392010450d39200a1023200424000f0b20074101102a000b20074104102a000b4194034104102a000b41022120410121070c3c0b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020720e0e000102060708090c0d0e0f101112120b207020256a22732802002274450d4e2070202c6a2175410021760c420b20d80120aa016a210920d8012f01062208209b01742105417f21070240024002400240024003402005450d0120072092016a2107208e0120ac012092012009280200220b20d5014b1b200b20d501461b220b450d04200520c4016a21052009208f016a2109200b209201460d000b20d9010d010c020b2008210720d901450d010b20d90120ac016a21d90120d8012007209b01746a20ae016a28020021d801410121720c370b200341f0006a20aa016a220520052802002092016a360200200329039801210e20032903900121da0120032903880121db0120032903800121dc0120d8012f0106220520b1014f0d0120d80120aa016a220920072092016a220b209b01746a20092007209b01746a2209200520076b209b01741095041a200920d50136020020d80120a1016a2205200b20b201746a2005200720b201746a220520d80120b0016a22092f010020076b20b201741095041a200520b3016a200e370200200520da01370210200520db01370208200520dc01370200200920092f01002092016a3b010020d701450d230c490b20d801200720b201746a220720a6016a200329039801370200200720bb016a220529020021da012005200329039001370200200720a3016a200329038801370200200720a1016a2207290200210e200720032903800137020020da0120c6018320a70185500d47200e20c50183500d47200ea710230c470b20ae0110262205450d1c2005208e013b01062005208e01360200200520aa016a200341c0056a20af01109404210b200341c0056a20b3016a22dd0120d80120b4016a290200370300200341c0056a209d016a22de0120d80120b5016a29020037030020ab0120d80120b6016a290200370300200320d8012902f4013703c00520d80128022021df01200b20d801209f016a20d80120b0016a22082f010020b7016a2209209b0174109404210b200520a1016a20d80120b8016a200920b20174109404210c200820b0013b0100200520093b0106200341b0046a20b3016a22e00120dd01290300370300200341b0046a209d016a22e10120de01290300370300200341b0046a20aa016a22e20120ab01290300370300200320032903c0053703b00402400240200720b0014b0d0020d80120aa016a220920072092016a220b209b01746a20092007209b01746a220820d80120b0016a22092f010020076b209b01741095041a200820d50136020020d80120a1016a2208200b20b201746a2008200720b201746a220b20092f010020076b20b201741095041a200b20b3016a200e370200200b20da01370210200b20db01370208200b20dc013702000c010b200b200720c1016a2220209b01746a200b200720b7016a2208209b01746a2207200920bc017120086b209b01741095041a200720d501360200200c202020b201746a200c200820b201746a2207200520b0016a22092f010020086b20b201741095041a200720b3016a200e370200200720da01370210200720db01370208200720dc013702000b200920092f01002092016a3b0100200341a0036a20b3016a22e30120e001290300370300200341a0036a209d016a22e40120e101290300370300200341a0036a20aa016a22e50120e201290300370300200320032903b0043703a00320034190026a20b3016a22e60120e30129030037030020034190026a209d016a22e70120e40129030037030020034190026a20aa016a22e80120e501290300370300200320032903a0033703900220d80128020022e901450d0120d8012f010421ea01200521eb010c270b20e30120e60129030037030020e40120e70129030037030020e50120e80129030037030020032003290390023703a00320ea0120bc0171210820e9012f0106220720bd014d0d0220b9011026220b450d1c200b208e013b0106200b208e01360200200b20aa016a200341c0056a20ba01109404210520e901209e016a280200212220dd0120e90120b4016a29020037030020de0120e90120b5016a29020037030020ab0120e90120b6016a290200370300200320e90120bf016a2902003703c005200520e901209f016a20e90120b0016a22202f0100220920b7016a2207209b0174109404218901200b20a1016a20e90120b8016a200720b20174109404218a01200b20ae016a20e90120c0016a200920c1016a220c209b0174109404210d202020b0013b0100200b20073b01060240200c450d0041002107200d210503402005280200220920073b01042009200b3602002005208f016a2105200c20072092016a2207470d000b0b20e00120dd0129030037030020e10120de0129030037030020e20120ab01290300370300200320032903c0053703b00420dd0120e00129030037030020de0120e10129030037030020ab0120e201290300370300200320032903b0043703c0050240024020ea0120bc0171220520b0014b0d0020e90120aa016a220720082092016a220c209b017422096a20072008209b0174220d6a220720202f010022890120086b228a01209b01741095041a200720df0136020020e90120a1016a2207200c20b201746a2007200820b201746a2207208a0120b201741095041a200720b3016a20e3012903003702002007209d016a20e401290300370200200720aa016a20e501290300370200200720032903a00337020020202089012092016a22073b010020e90120ae016a2220200d6a20aa016a202020096a2220200720bc01712209200c6b209b01741095041a202020eb01360200200520094f0d0120e901200d6a20be016a210703402007280200220520082092016a22083b0104200520e9013602002007208f016a210720092008470d000c020b0b208901200820c1016a2209209b017422206a208901200820b7016a2207209b01746a2205200b20b0016a220c2f010020076b209b01741095041a200520df01360200208a01200920b201746a208a01200720b201746a2205200c2f010020076b20b201741095041a200520b3016a20e3012903003702002005209d016a20e401290300370200200520aa016a20e501290300370200200520032903a003370200200c200c2f01002092016a22053b0100200d2008209b01742289016a20c2016a200d20206a220c200520bc0171220820096b209b01741095041a200c20eb01360200200920084b0d00200b2089016a20c3016a210503402005280200220920072092016a22073b01042009200b3602002005208f016a210520082007470d000b0b20e60120dd0129030037030020e70120de0129030037030020e80120ab01290300370300200320032903c00537039002024020e9012802002207450d0020e9012f010421ea01200721e901202221df01200b21eb01410221720c360b202221df0120b901102622070d010c1d0b2005210b20b90110262207450d1c0b2007208e013b01062007208e01360200200720aa016a200341c0056a20ba01109404210820072003280270220536029403200320032802742092016a3602742005208e013b01042003200736027020052007360200200720072f0106220920b201746a220520a6016a20e601290300370200200520bb016a20e701290300370200200520a3016a20e801290300370200200520a1016a20032903900237020020082009209b01746a20df01360200200720ae016a20092092016a2205209b01746a200b360200200720053b0106200b20053b0104200b200736020020d7010d440c1d0b20e90120aa016a220520082092016a2209209b0174220b6a20052008209b0174220c6a2205200720086b2220209b01741095041a200520df0136020020e90120a1016a2205200920b201746a2005200820b201746a2205202020b201741095041a200520b3016a20e3012903003702002005209d016a20e401290300370200200520aa016a20e501290300370200200520032903a00337020020e90120b0016a20072092016a22073b010020e90120ae016a2205200c6a20aa016a2005200b6a2205200720bc0171220b20096b209b01741095041a200520eb013602002008200b4f0d4220e901200920ac016a2207209b01746a20be016a210503402005280200220920072092016a22073b0104200920e9013602002005208f016a2105200b2007470d000c430b0b410121c701208b0121c801410421720c330b410221c901209101209701460d02200341186a20910110c5032091012096016a21910120032802182207450d032007228b012007200328021c209b01746a22c801460d22410521070c480b208b0120c801470d2b410121c701208b0121c801410621720c330b410221c901209101209701460d00200341106a20910110c5032091012096016a21910120032802102207450d0120072003280214209b01746a21c8012007218b010c210b2097012191010b208b0121d2012094010d240c470b208b0120c801470d25410821720c310b209101209701460d45200341206a20910110c5032003280220228b01450d452091012096016a219101208b012003280224209b01746a21c8010c1e0b20c402280200220b20ee016a2109200b2f0106220c20f001742105417f210702400240024003402005450d01200720f7016a210720f80120f50120f7012009280200220820c3024b1b200820c302461b2208450d03200520f9016a2105200920f4016a2109200820f701460d000b20c5020d010c090b200c210720c502450d080b20c50220f5016a21c502200b200720f001746a20f6016a21c402410921720c310b200b20fb016a200720fa01746a22c602450d0620c602280218210520c60228021c210720fc01200f36020020fd0120fe013a000020ff012080023a000020810220073602002082022083023a0000208402200f3602002085022086023a000020870220053602002088022089023a0000208a02208b023a0000208c0220f8013a0000208d02208e023b0100208f022090023a000020910220023602002092022083023a0000209302200f3602002094022086023a0000200341c0056a20fb016a22c702200f36020020950220fe013a00002097022098023a0000209a02200736020020ed012083023a00002003200f3602c40520032086023a00c00520c602280208220b20ec016a22c802ad220e209c0288a70d55200e209b0286a7220720f5014c0d5520c60220ee016a21c902024002400240024002402007450d002007102622ca02450d0f20c902280200220b450d020c010b410821ca02200b450d010b410021094100210703400240200720c802470d0020c80220f7016a220520c802490d5b20c80220f701742208200520052008491b2205ad209b0286220e209e0288a70d5b200ea7220820f801480d5b0240024020c802450d0020ca0220c80220f401742008102722ca020d010c0c0b2008102622ca02450d0b0b200521c8020b20ca0220096a2205209d023a0000200520f4016a2007360200200520c2026a200341a0036a20f0016a2d00003a0000200520f7016a20032f01a0033b0000200920ec016a2109200720f7016a22cb022107200b20cb02470d000b20c80220cb026b209d024f0d020c010b410021cb0220c80241006b209d024f0d010b20cb02209d026a220720cb02490d5720c80220f701742205200720072005491b2207ad209b0286220e209e0288a70d57200ea7220520f801480d570240024020c802450d0020ca0220c80220f401742005102722ca020d010c100b2005102622ca02450d0f0b200721c8020b20ca0220cb0220f401746a21cc02200341c0056a21cd020c1e0b20cb02210b024002400240024020cd022d00002205209f026a220820a0024b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020080e2f291c202d2d121d162d1b082d2d0b0a1a2417091319211f0f0e2526031807060d2214230211041e050100152827100c290b20cd022d00012109412b21050c2c0b20cd0241046a280200210720cd02350208210e412a21050c2a0b20cd0241046a280200210720cd02350208210e412521050c290b20cd0241046a280200210720cd02350208210e411d21050c280b20cd0241046a280200210720cd02350208210e412721050c270b20cd0241046a280200210720cd02350208210e412921050c260b20cd0241046a280200210720cd02350208210e412021050c250b20cd0241046a280200210720cd02350208210e411f21050c240b20cd0241046a280200210720cd022d00012109410c21050c240b20cd0241046a280200210720cd02350208210e411421050c220b20cd0241046a2802002107411021050c210b20cd0241046a2802002107410f21050c200b20cd02290308210e413021050c1e0b20cd0241046a280200210720cd02350208210e412121050c1e0b20cd0241046a280200210720cd02350208210e411a21050c1d0b20cd0241046a280200210720cd02350208210e411921050c1c0b20cd0241046a2802002107412f21050c1b0b20cd0241046a280200210720cd02350208210e412621050c1a0b20cd0241046a2802002107410721050c190b20cd0241046a280200210720cd02350208210e411521050c180b20cd0241046a280200210720cd02350208210e412321050c170b20cd022d00012109412c21050c170b20cd022802082209ad220e421e88a70d6b200e420286a72205417f4c0d6b4104210702402005450d00200510262207450d1e0b02402009450d0020cd0241046a28020021052009410274210820072109034020092005280200360200200941046a2109200541046a21052008417c6a22080d000b0b20cd02410c6a350200422086200e84210e410921050c150b20cd0241046a2802002107411321050c140b20cd0241046a280200210720cd02350208210e411e21050c130b20cd0241046a280200210720cd02350208210e411621050c120b20cd0241046a2802002107411121050c110b20cd0241046a2802002107410b21050c100b20cd022d00012109410321050c100b20cd0241046a2802002107410821050c0e0b20cd0241046a280200210720cd02350208210e412821050c0d0b20cd0241046a280200210720cd02350208210e411821050c0c0b20cd022d00012109410421050c0c0b20cd0241046a280200210720cd02350208210e411721050c0a0b20cd0241046a280200210720cd02350208210e412221050c090b20cd0241046a280200210720cd02350208210e412421050c080b20cd0241046a2802002107411221050c070b20cd0241046a280200210720cd02350208210e411b21050c060b20cd0241046a280200210720cd02350208210e411c21050c050b20cd02290308210e412e21050c030b20cd0241046a2802002107412d21050c030b20cd022d00012109410221050c030b0b0b0b20cc0220093a000120cc0220053a000020cc0220ee016a200e37030020cc0220f4016a2007360200200b20f7016a21cb0220cc0220ec016a21cc0220cd0220ec016a22cd0220f301470d1e024002400240024020c80220cb02470d0020c80220f7016a220720c802490d5920c80220f701742205200720072005491b220cad209b0286220e209e0288a70d59200ea7220720f801480d5920c802450d0120ca0220c80220f401742007102722ca020d020c110b20c802210c0c020b2007102622ca02450d0f0b20c80221cb020b20ca0220cb0220f401746a2207208b023a0000200720ee016a20a102290000370000200720032900b004370001200341b0046a20034180016a20a2021094041a20ec0110262205450d072005208b023a0000200341a0036a200341b0046a20a2021094041a20c902280200220720f5014c0d5420c6022802002120410121094101210802402007450d00200710262208450d0b0b200820202007109404210802400240024020070d00410021204101200820071094041a20070d010c020b200710262209450d0d200721202009200820071094041a2007450d010b200810230b200341b0046a200341a0036a20a2021094041a20c60231000d210e200341a0036a200341b0046a20a2021094041a200341b0046a200341a0036a20a2021094041a20034190026a200341b0046a20a2021094041a20ec0110262208450d08200b20f0016a210b20ce0220a3028322ce022007ad84200e20a502868420a60284210e2008208b023a000020081023200341a0036a20034190026a20a2021094041a200341b0046a200341a0036a20a2021094041a024020052d000020a702470d00200528020820a80271450d00200528020410230b2005102320034190026a200341b0046a20a2021094041a200341b0046a20034190026a20a2021094041a20a90220f80136020020ab02200b36020020ad02200c360200200341a0036a2096026a20ca0236020020ae0220f801360200200341a0036a2099026a209b0237020020af02200e370200200341a0036a20ee016a2020360200200320093602a403200320f7013602a003200341b0046a200341a0036a10cc0320034180016a200341b0046a20a2021094041a20c60220f70136021020c60220f201360214024020032d00c00520a702470d0020ef0128020020a80271450d0020032802c40510230b024020ed012d000020a702470d0020b00228020020a80271450d00209a0228020010230b02402097022d000020a702470d00200341c0056a20aa026a28020020a80271450d00200341c0056a20ac026a28020010230b02402095022d000020a702470d0020b10228020020a80271450d0020c70228020010230b02402094022d000020a702470d0020b20228020020a80271450d0020930228020010230b02402092022d000020a702470d0020b30228020020a80271450d0020910228020010230b0240208f022d000020a702470d0020b40228020020a80271450d0020b50228020010230b0240208d022d000020a702470d0020b60228020020a80271450d0020b70228020010230b0240208c022d000020a702470d0020b80228020020a80271450d0020b90228020010230b0240208a022d000020a702470d0020ba0228020020a80271450d0020bb0228020010230b02402088022d000020a702470d0020bc0228020020a80271450d0020870228020010230b02402085022d000020a702470d0020bd0228020020a80271450d0020840228020010230b02402082022d000020a702470d0020be0228020020a80271450d0020810228020010230b024020ff012d000020a702470d0020bf0228020020a80271450d0020c00228020010230b024020fd012d000020a702470d0020c10228020020a80271450d0020fc0128020010230b20ce0220a4028421ce0220f20120f7016a21f20120d00120f101470d140c440b20e10228020c0d3620e10228021021e302200341e0006a21e402200328026421e5020c330b20e702280200220b20d7026a2109200b2f0106220c20d502742105417f21070240024003402005450d01200720da026a210720db0220d80220da022009280200220820e6024b1b200820e602461b2208450d04200520dc026a2105200920d6026a2109200820da02460d000b20e8020d010c420b200c210720e802450d410b20e80220d8026a21e802200b200720d502746a20d9026a21e702410c21720c300b20e9022802182207450d3320e90228021022eb02200720d502746a21ec02410221070c320b200b20de026a200720dd02746a2207450d3e2007280210450d0d20d10220d6026a20072802143602000c3e0b20084108102a000b41c8e4c4004180011021000b20054104102a000b41104108102a000b41104108102a000b20074108102a000b20074101102a000b20074101102a000b20054108102a000b20074108102a000b4194034104102a000b41c4034104102a000b41c4034104102a000b41c8e5c40041351021000b410221200c020b410221200c020b410321200c020b410121070c3d0b410121070c3c0b410121070c3b0b410121720c0c0b410221720c0d0b410321720c0e0b410521720c0f0b410721720c100b410a21720c120b410a21720c120b410021070c200b410121070c1f0b410221070c1e0b410321070c1d0b410421070c1c0b410521070c1b0b410621070c1a0b410621070c190b410621070c180b410621070c170b410621070c160b410621070c150b410621070c140b410621070c130b410621070c120b410621070c110b410621070c100b410621070c0f0b410621070c0e0b410621070c0d0b410021070c010b410121070b0340024002400240024002400240024002400240024002400240024002400240024002400240024020070e03000102020b207620744f0d024101210720752802002076202d74220c6a22052d0000202a470d1120032005202d6a220536029002200a450d0302402010200528020022054d0d00200a2005202e746a2802002209450d12202f200f360200203020313a0000203220333a000020342009360200203520363a00002037200f360200203820393a0000203a2005360200203b202a3a0000203c203d3a0000203e203f3a0000204020413b0100204220433a000020442002360200204520363a00002046200f360200204720393a00002048200f360200204920313a0000204b204c3a0000200341c0056a20256a22772009360200204e20363a0000202920032f00b0043b00002029202e6a200341b0046a202e6a2d00003a0000200320393a00c0052003200f3602c40520732802002278207620286a2279490d052073207636020020752802002107200341b0046a202b6a227a2027360200200341b0046a204d6a227b207536020020502007200c6a2208204d6a220b360200200320793602b004200341b0046a202c6a227c20072079202d74227d6a22203602002026200341c0056a3602002003207820796b227e3602b404200b2107024002400240024020082d000022092051460d00410021070340200820076a210502402009206c712052470d002005204f6a280200205371450d002005202d6a28020010230b2007450d0220502005204a6a3602002007204d6a21072005204d6a2d000022092051470d000b200820076a204d6a21070b20072020470d010c020b2005204d6a22072020460d010b0340205020072205204d6a22073602000240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a28020010230b200b2007470d000b0b02400240207e450d00207920702802142207470d012027227f200341c0056a2280016b202d762281010d0b0c100b2075202610e70320502802002207207c280200220b470d110c120b200c2007202d7422076b218201207528020020076a218301200341c0056a2284012027460d0741002185010c0b0b200341c0056a20256a20283602002003206d3602a403204e200341a0036a3602002003206e3702c4052003206f3602c005200320034190026a3602a003200341b0046a200341c0056a10a20120032802b0042207450d1c20032902b404210e0c280b20e402280200220b20d7026a2109200b2f0106220c20d502742105417f210702400240024003402005450d01200720da026a210720db0220d80220da022009280200220820e3024b1b200820e302461b2208450d03200520dc026a2105200920d6026a2109200820da02460d000b20e5020d010c160b200c210720e502450d150b20e50220d8026a21e502200b200720d502746a20d9026a21e402410121070c120b200b20de026a200720dd02746a2207450d132007280210450d0420e10220cf026a20072802143602000c130b20eb0222ed0220d6026a21eb0220ed0228020021ee02200341e0006a21ef02200328026421f0020c050b4188dfc400207620741029000b41c6ddc40041cc001021000b41cce3c400104f000b41c8e5c40041351021000b41012185010c020b41042185010c030b410021070c030b410121070c020b410121070c010b410121070b034002400240024002400240024002400240024002400240024020070e020001010b02400240024002400240207b280200228601202d6a2205280200220720786b2081014f0d0020782081016a22092078490d362007202874220b20092009200b491b2209ad206886220e206988a70d36200ea7220b203f480d362007450d012086012802002007202d74200b102722070d020c040b20860128020021070c020b200b10262207450d020b2086012007360200200520093602000b200720792081016a2205202d746a2007207d6a207e202d741095041a200320053602b00420052086012802082207460d0d20762081016a202d742007202d7422076b21870120860128020020076a218801208001207f470d030c020b200b4108102a000b024002400240024002400240024002402085010e050001030406060b2026208401204d6a3602000c010b41002184010b200341a0036a20840110e80320032d00a0032051460d1120830120032903a003370300208301204f6a200341a0036a204f6a2903003703002073207328020020286a3602000240208201450d00208301204d6a218301208201206b6a2182012026280200228401207a280200470d0541012185010c090b207a280200227f20262802002280016b202d76228101450d10410021070c0f0b2026208001204d6a3602000c010b41002180010b200341a0036a20800110e80320032d00a0032051460d0e20880120032903a003370300208801204f6a200341a0036a204f6a290300370300208601204f6a2207200728020020286a360200208701450d0d208801204d6a218801208701206b6a2187012026280200228001207a280200227f460d0441022185010c0a0b20ef02280200220b20d7026a2109200b2f0106220c20d502742105417f210702400240024002400240024003402005450d01200720da026a210720db0220d80220da022009280200220820ee024b1b200820ee02461b2208450d03200520dc026a2105200920d6026a2109200820da02460d000b20f0020d010c030b200c210720f002450d020b20f00220d8026a21f002200b200720d502746a20d9026a21ef0241042185010c0e0b200b20de026a200720dd02746a2207450d002007280210450d0120ed0220072802143602000b20eb0220ec02470d010c140b41c8e5c40041351021000b410221070c110b41002185010c040b41032185010c040b41022185010c040b41032185010c040b410121070c060b410121070c050b410121070c040b410121070c030b410121070c020b410121070c010b410121070c000b0b200341a0036a204f6a2207203f360200200320673703a003200341a0036a202610e70320032802a003222220072802002205202d7422086a210b20032802a403218901202221070240024002400240024002402005450d000240024002400240207b280200220d202d6a2274280200220720032802b404220c20032802b00422056a22206b2008202d7522094f0d00202020096a228a012020490d2e20072028742220208a01208a012020491b2220ad206886220e206988a70d2e200ea7228a01203f480d2e2007450d01200d2802002007202d74208a01102722070d020c050b200d28020021070c020b208a0110262207450d030b200d2007360200207420203602000b2007200520096a2209202d7422206a20072005202d746a200c202d741095041a200320093602b004202221072009200d2802082205460d00200d280200220720206a217420072005202d746a21092022210503402008450d04200341a0036a202e6a22072005206a6a2d00003a0000200320052f00013b01a00320052d0000220c2051460d032005202d6a290200210e2005202c6a28020021202009200c3a00002009202c6a20203602002009202d6a200e37020020032f01a003210c2009206a6a20072d00003a0000200920286a200c3b0000200d204f6a2207200728020020286a3602002008206b6a21082005204d6a220721052009204d6a22092074470d000b0b2007200b460d040c030b208a014108102a000b2005204d6a2207200b470d010c020b200b2207200b460d010b03400240024020072d000022052052460d0020052051470d010c030b2007204f6a280200205371450d002007202d6a28020010230b2007204d6a2207200b470d000b0b208901450d00202210230b20502802002207207c280200220b460d010b0340205020072205204d6a22073602000240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a28020010230b200b2007470d000b0b024020032802b4042207450d00024020032802b004220b207b2802002208204f6a22092802002205460d00200828020022082005202d746a2008200b202d746a2007202d741095041a0b2009200720056a3602000b024020032d00c0052052470d00200341c0056a204f6a280200205371450d0020032802c40510230b0240204e2d00002052470d00200341c0056a202b6a280200205371450d00207728020010230b0240204b2d00002052470d002054280200205371450d00205528020010230b024020492d00002052470d002056280200205371450d00204828020010230b024020472d00002052470d002057280200205371450d00204628020010230b024020452d00002052470d002058280200205371450d00204428020010230b024020422d00002052470d002059280200205371450d00205a28020010230b024020402d00002052470d00205b280200205371450d00205c28020010230b0240203e2d00002052470d00205d280200205371450d00205e28020010230b0240203c2d00002052470d00205f280200205371450d00206028020010230b0240203b2d00002052470d002061280200205371450d00203a28020010230b024020382d00002052470d002062280200205371450d00203728020010230b024020352d00002052470d002063280200205371450d00203428020010230b024020322d00002052470d002064280200205371450d00206528020010230b024020302d00002052470d002066280200205371450d00202f28020010230b410f21070b200720766a2276207328020022744f0d0a410021070c000b0b20e90220d4026a22e90220ea02460d0b410d2172410621070c090b20e10220e0026a22e10220e202460d0a410b2172410621070c080b20d701450d010b20d601450d0120d1011023410221200c020b410221200c020b410221200c020b410121070c160b410121070c150b410121070c140b2070202b6a22702071460d0d41002172410621070c000b0b41c6ddc40041cc001021000b20d10220d0026a22d10220d202460d0241042120410121070c100b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360208c01412c6c2107208d0141586a210502400340410021092007450d01200741546a2107200541286a210b2005412c6a22082105200b2d00004103470d000b200841086a2802002207450d00200741286c2105200828020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b208c01412c6c2107208d0141606a21050240024003402007450d01200741546a2107200541206a210b2005412c6a22082105200b2d00004104470d000b200828020021070c010b410021070b411021ec01200341c0056a41106a22ed01200341c8006a41106a280200360200410821ee01200341c0056a41086a22ef01200341c8006a41086a290300370300200320032903483703c00520034180016a200341c0056a10c70320cb01450d00410221f00120d00120cb014102746a21f101200720096a21f201200341b0076a21f301410421f401417f21f50141940321f601410121f701410021f801417c21f901410521fa01413421fb01200341a4076a21fc01200341a0076a21fd01411321fe0120034190076a21ff0141d70021800220034184076a21810220034180076a218202412d218302200341f4066a218402200341f0066a2185024112218602200341e4066a218702200341e0066a218802410b218902200341d0066a218a024106218b02200341c0066a218c02200341b0066a218d02418408218e02200341a0066a218f02413721900220034194066a21910220034190066a21920220034184066a21930220034180066a219402200341f0056a2195024120219602200341c0056a41206a21970241d6002198024114219902200341c0056a41146a219a024204219b02421c219c02410f219d024220219e02417e219f02412e21a002200341b7046a21a102418c0121a202428080808080804021a3024280808080808c0121a402422821a5024280808080800c21a602410921a70241ffffffff0321a802200341cc036a21a902412821aa02200341a0036a41286a21ab02412421ac02200341a0036a41246a21ad02200341bc036a21ae02200341ac036a21af02200341d8056a21b002200341f8056a21b10220034188066a21b20220034198066a21b302200341a8066a21b402200341a4066a21b502200341b8066a21b602200341b4066a21b702200341c8066a21b802200341c4066a21b902200341d8066a21ba02200341d4066a21bb02200341e8066a21bc02200341f8066a21bd0220034188076a21be0220034198076a21bf0220034194076a21c002200341a8076a21c102410321c2020c020b024020cc01450d0020cf0110230b200341c0056a20034180016a418c011094041a200341b0046a200341c0056a10c903411021cf02200341b0046a41106a2802002207450d00412c21d00220032802b80422d1022007412c6c6a21d202410a21d302411c21d402410221d502410421d602410821d702417f21d80241940321d902410121da02410021db02417c21dc02410521dd02413421de02410921df02411421e002410421200c020b200341bc046a290200210e20032802b004210720032902b404216920032802602003280264200328026810e603200020cf026a200e370200200041086a20693702002000200736020420004100360200200a450d062010450d06200a1023200424000f0b41032120410121070c0c0b410121070c0b0b42ac808080c005210e0b200a10230b4100210a0b2000200736020420004101360200200041086a200e3702000240200a450d002010450d00200a10230b200141086a280200218b010240200141106a2802002203450d002003412c6c2107208b01210303402003109f012003412c6a2103200741546a22070d000b0b2001410c6a280200450d00208b0110230b200424000f0b202120236a22212024470d010b200341c8006a41106a2207200141106a280200360200200341c8006a41086a228b01200141086a290200370300200320012902003703482007280200228c0120236c2107208b01280200228d0141586a218b010240024003402007450d01200741546a2107208b0141286a2105208b0120236a228e01218b0120052d00004108470d000b200341386a208e0110be0320032802382105200328023c21070c010b410021050b2007410020051b218f01208c01412c6c2107208d0141586a218b01200541a886c50020051b2190010240024003402007450d01200741546a2107208b0141286a2105208b01412c6a228e01218b0120052d0000410a470d000b200341306a208e0110be0320032802302105200328023421070c010b410021050b2007410020051b2109208c01412c6c2107208d0141586a218b01200541a886c50020051b2191010240024003404100218e012007450d01200741546a2107208b0141286a2105208b01412c6a229201218b0120052d00004109470d000b20920128020021930141012194010c010b41002194010b2003420037027441f098c400219501200341f098c400360270411c2196012091012009411c6c6a2197014114219801209001208f0141146c6a2199014104218f0141ff01219a0141012192014102219b0141cf00219c014110219d014120219e014124219f01412821a001413421a101413821a201413c21a30141d00021a40141c80021a50141cc0021a601420221a701422021a801200341cc056a21a901410821aa01200341c0056a41086a21ab01417f21ac01410d21ad0141940321ae01418c0321af01410621b001410b21b101410521b201411821b301418c0221b40141840221b50141fc0121b601417921b70141940221b80141c40321b90141bc0321ba0141c40021bb0141ffff0321bc01410a21bd0141980321be0141f40121bf0141b00321c001417a21c101416c21c20141fc0221c301417c21c40142808080807021c50142ffffffff0f21c601410021c701410021c801410021c901410021ca01410021cb01410021cc01410421cd01410421ce01410421cf01410421d0010c010b410121200c010b410221200c010b410121070c010b410121070c000b0b101d000b101e000bda0502047f017e230041d0006b2203240002400240024002400240024002400240200241086a2802002204417f6a220520044f0d00200520044b0d002002280200220620054103746a2d000522054104460d02200341386a20012002200510d00320032d00384101470d012000200329023c370200200041086a200341c4006a280200360200200341d0006a24000f0b411810262202450d05200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341e8d5c4003602382003200341206a3602102003200341106a3602482000200341386a10a2012003280224450d0320032802201023200341d0006a24000f0b200241086a2802002204450d01200228020021060b200241086a2004417f6a2202360200200620024103746a290200220742808080808080c0ff0083428080808080808001520d020b411810262202450d03200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341e8d5c4003602382003200341206a3602102003200341106a3602482000200341386a10a2012003280224450d00200328022010230b200341d0006a24000f0b200141086a280200210220032007370308024020022007a7470d0020004100360200200341d0006a24000f0b2003412c6a4102360200200341cc006a410236020020034102360224200320023602342003420237023c200341c8d4c4003602382003200341086a3602282003200341346a3602202003200341206a360248200341106a200341386a10a201200041086a200341106a41086a28020036020020002003290310370200200341d0006a24000f0b41184101102a000b41184101102a000bc90301017f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005412c6a4102360200200541cc006a4102360200200541023602242005420337023c200541a4d2c40036023820052005410c6a3602282005200541086a3602202005200541206a360248200541106a200541386a10a201200041086a200541106a41086a28020036020020002005290310370200200541d0006a24000f0b2001280200210220054100360234024020022802080d00200541cc006a4101360200200541023602142005420237023c200541b8d9c4003602382005200541346a3602102005200541106a360248200541206a200541386a10a20120052802202202450d002000200529022437020420002002360200200541d0006a24000f0b200541386a200141186a2202200141286a2203200410d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b200541386a20022003410010d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b20004100360200200541d0006a24000bc00601037f230041d0006b22042400200420033a000f024002400240024020022802082205417f6a220620054f0d00200620054b0d00200141086a2802002105200228020020064103746a22062802002102024020062d0006450d0020052002460d040b02400240200520024d0d00200141086a2005417f6a2202360200200128020020026a2d000022024104460d0520024105470d01411810262202450d04200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020044298808080800337022420042002360220200441c4006a41013602002004412a36024c20044201370234200441e8d5c4003602302004200441206a3602482004200441c8006a360240200441106a200441306a10a20102402004280224450d00200428022010230b200041013a0000200041046a20042903103702002000410c6a200441106a41086a280200360200200441d0006a24000f0b412b10262202450d02200041013a0000200241276a41002800a2d544360000200241206a410029009bd544370000200241186a4100290093d544370000200241106a410029008bd544370000200241086a4100290083d544370000200241002900fbd444370000200041086a42ab808080b005370200200041046a2002360200200441d0006a24000f0b0240200341ff017122054104460d0020022005460d00200420023a0048200441206a410c6a412b360200200441c4006a41023602002004412b36022420044202370234200441a8d5c4003602302004200441c8006a36022820042004410f6a3602202004200441206a360240200441106a200441306a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441d0006a24000f0b200041003a0000200020023a0001200441d0006a24000f0b02404118102622020d0041184101102a000b2004421837023420042002360230200441306a4100411810db0320042004280238220241186a3602382002200428023022056a411841a6dbc400411810dc0320042004290234370234200420053602304184d1c4004134200441306a10dd03000b412b4101102a000b41184101102a000b20004180083b0100200441d0006a24000ba10601037f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005411c6a4102360200200541cc006a4102360200200541023602142005420337023c200541a4d2c40036023820052005410c6a3602182005200541086a3602102005200541106a360248200541206a200541386a10a201200041086a200541206a41086a28020036020020002005290320370200200541d0006a24000f0b200541386a200141186a2203200141286a410010d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b2001280200210220054100360220024020022802080d00200541cc006a4101360200200541023602342005420237023c200541b8d9c4003602382005200541206a3602302005200541306a360248200541106a200541386a10a20120052802102202450d002000200529021437020420002002360200200541d0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d03200241016a22062002490d0520024101742207200620062007491b22064100480d052002450d01200328020020022006102722020d020c060b200541cc006a2202410136020020054102360234200520063602302005420137023c200541a0dcc4003602382005200541306a360248200541106a200541386a10a20120052802102201450d032005200529021437021420052001360210200241013602002005412a3602342005420137023c200541e8d5c4003602382005200541106a3602302005200541306a360248200541206a200541386a10a20102402005280214450d00200528021010230b20052802202202450d032000200529022437020420002002360200200541d0006a24000f0b200610262202450d040b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2202200228020041016a3602000b20004100360200200541d0006a24000f0b101e000b20064101102a000bb80401047f230041c0006b22032400200341286a200141186a2204200141286a2205200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d03200241016a22052002490d0520024101742206200520052006491b22054100480d052002450d01200428020020022005102722020d020c060b2003413c6a2201410136020020034102360214200320053602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200510262202450d040b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b101e000b20054101102a000bf70301047f230041c0006b22032400200341286a200141186a2204200141286a200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d0320024101742206200520052006491b22054100480d032002450d0120042802002002200510272202450d020c040b2003413c6a2201410136020020034102360214200320053602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2005102622020d020b20054101102a000b101e000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bb80401057f230041c0006b22032400200341286a200141186a2204200141286a2205200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d03200541016a22062005490d0520054101742207200620062007491b22064100480d052005450d01200428020020052006102722040d020c060b2003413c6a2201410136020020034102360214200320063602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200610262204450d040b2001411c6a2006360200200141186a2004360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b101e000b20064101102a000bc10301057f230041c0006b220324002003200236020002402001280204220420024d0d00200041003a00002000200128020020026a2d00003a0001200341c0006a24000f0b2001280208417c6a21052001410c6a28020041037421010240024003402001450d012004200541046a2802006a22062004490d02200141786a2101200541086a2105200420024b21072006210420070d0020062104200620024d0d000b20052d00002104200041003a0000200020043a0001200341c0006a24000f0b20032004360204200341306a410c6a41023602002003412c6a4102360200200341023602342003420337021c200341f0dcc4003602182003200341046a360238200320033602302003200341306a360228200341086a200341186a10a201200041013a00002000410c6a200341106a280200360200200041046a2003290308370200200341c0006a24000f0b0240412010262204450d00200041013a0000200441186a41002900e8dc44370000200441106a41002900e0dc44370000200441086a41002900d8dc44370000200441002900d0dc44370000200041086a42a08080808004370200200041046a2004360200200341c0006a24000f0b41204101102a000bf70301057f230041c0006b22032400200341286a200141186a2204200141286a200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d05200541016a22062005490d0320054101742207200620062007491b22064100480d032005450d0120042802002005200610272205450d020c040b2003413c6a2201410136020020034102360214200320063602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2006102622050d020b20064101102a000b101e000b2001411c6a2006360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bf70301047f230041c0006b22042400200441286a200141186a2205200141286a200210d003024020042d00284101470d002000200429022c370200200041086a200441346a280200360200200441c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d05200241016a22062002490d0320024101742207200620062007491b22064100480d032002450d0120052802002002200610272202450d020c040b2004413c6a2201410136020020044102360214200420063602102004420137022c200441a0dcc4003602282004200441106a360238200441186a200441286a10a20120042802182202450d052004200429021c37021c20042002360218200141013602002004412a3602142004420137022c200441e8d5c4003602282004200441186a3602102004200441106a3602382004200441286a10a2010240200428021c450d00200428021810230b20042802002201450d052000200429020437020420002001360200200441c0006a24000f0b2006102622020d020b20064101102a000b101e000b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20033a0000200141206a2201200128020041016a3602000b20004100360200200441c0006a24000bad0201027f230041106b220224000240024020002d00004104470d00200128021841d0f6c40041082001411c6a28020028020c11020021010c010b2002200128021841bbf6c40041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0f6c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ccb0c5003602082002200236021820012000200241086a10e2032101200241206a240020010bad0201027f230041106b220224000240024020002d00004104470d00200128021841a4d3c40041032001411c6a28020028020c11020021010c010b2002200128021841a7d3c40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41b0d3c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b810101017f0240200041046a280200220320016b20024f0d0002400240200120026a22022001490d0020034101742201200220022001491b22014100480d00024002402003450d0020002802002003200110272202450d010c030b2001102622020d020b20014101102a000b101e000b20002002360200200041046a20013602000b0bea0101017f230041e0006b22042400200420013602082004200336020c024020012003470d002000200220011094041a200441e0006a24000f0b2004200441086a36024020042004410c6a360244200441c8006a41146a4100360200200441286a41146a4103360200200441346a4104360200200441106a41146a4103360200200441a886c5003602582004420137024c200441a881c5003602482004410436022c20044203370214200441d480c5003602102004200441c8006a3602382004200441c4006a3602302004200441c0006a3602282004200441286a360220200441106a41e481c5001061000b6c01017f230041306b2203240020032001360204200320003602002003412c6a412d3602002003411c6a410236020020032002360228200341013602242003420237020c2003419083c500360208200320033602202003200341206a360218200341086a41a083c5001061000bf10202047f057e230041d0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d004101210420062802184184b1c50041a2b1c50020051b4102410120051b2006411c6a28020028020c1102000d0120012000280200200228020c11030021040c010b024020050d0041012104200628021841a0b1c50041022006411c6a28020028020c1102000d01200028020021060b41012104200341013a00102006290210210720062902082108200341346a220541e8b0c50036020020032006290218370308200629022021092006290228210a200320062d00303a00482006290200210b20032008370320200320073703282003200a370340200320093703382003200b3703182003200341086a3602302001200341186a200228020c1103000d00200341306a2802004182b1c5004102200528020028020c11020021040b200041086a20043a00002000200028020441016a360204200341d0006a240020000b820201027f230041106b220224002002200128021841a8b1c50041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0dcc40010de031a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b160020002802002200280200200028020820011099010b110020012000280200200028020810b3010b9a09010a7f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a360200200342808080808004370308200320003602204100210620034100360218200341003602102003200536023020032005360228024002400240024020022802082207450d0020022802002108200228020422092002410c6a2802002205200520094b1b220a450d01200020082802002008280204200128020c1102000d02200841086a2105200341386a2101200341346a210b200341306a210c41012106024003402001200741206a2d00003a00002003200741086a28020036020c20032007410c6a2802003602084100210202400240024002400240200741186a28020022004101460d00024020004102460d0020004103460d052007411c6a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b2007411c6a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b41e88bc500200020041029000b200341086a410c6a2004360200200341086a41086a20023602004100210202400240024002400240200741106a28020022004101460d00024020004102460d0020004103460d05200741146a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b200741146a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b41e88bc500200020041029000b200341086a41146a2004360200200341086a41106a200236020002400240024020072802004101470d00200741046a2802002202200b28020022044f0d02200c28020020024103746a21020c010b200341086a41206a22042802002202200341086a41246a280200460d032004200241086a3602000b2002280200200341086a200241046a2802001103000d052006200a4f0d04200541046a210220052802002104200541086a2105200741246a2107200641016a2106200341086a41186a28020020042002280200200341086a411c6a28020028020c110200450d010c050b0b41f88bc500200220041029000b41b88ac500104f000b20022802002108200228020422092004200420094b1b220a450d00200020082802002008280204200128020c1102000d01200841086a2107200341206a2100200341246a21014101210603402005280200200341086a200541046a2802001103000d022006200a4f0d01200741046a210220072802002104200541086a2105200741086a2107200641016a2106200028020020042002280200200128020028020c110200450d000c020b0b200920064d0d01200341206a280200200820064103746a22072802002007280204200341246a28020028020c110200450d010b200341c0006a240041010f0b200341c0006a240041000bdb39030e7f017e017f230041c0006b220324002002280208220441586a2105200241106a2802002206412c6c210702400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024003402007450d01200741546a2107200541286a21082005412c6a2209210520082d00004104470d000b2006412c6c2107200441586a210503402007450d02200741546a2107200541286a21082005412c6a220a210520082d0000410b470d000b2006412c6c2107200441586a210503402007450d03200741546a2107200541286a21082005412c6a2204210520082d00004102470d000b200341106a200910be03200328021420014d0d03200328021020014102746a2207450d03200341086a200410be03200328020c200728020022074d0d04200328020820074104746a2207450d04200a41086a28020020014d0d05200a2802002109200341186a41086a420037030020034280808080c00037031820072d000d2108200341306a41026a220a2003412d6a41026a2d00003a0000200320032f002d3b0130411010262207450d3f200341206a220b4101360200200341186a410c6a220528020021062003200736021c200720064104746a220741003a000c2007410036020820072008410447220c3602042007200c360200200720032f01303b000d2007410f6a200a2d00003a00002005200528020041016a3602004100210802402009200141186c6a22072802142205450d002007410c6a2106200741146a210a200341306a410472210d4100210841002107034002402003280218220920084d0d00200341306a200341186a410010e90320032802304101460d0920082003280218220920032802342d000c1b2108200a28020021050b200720054f0d3e02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006280200220120074104746a2d0000220541ab014b0d00024020050eac01141e0707071e13120c181915110e0d0b17160f1004040404040404040404040404040505050505050505050a1a06060606080000000000000000000008000000000000000000000000000000000000000000000303030101010101010101010101010101010303030101010101010101010101010101010303030303030301010101010101030303030303030101010101010102020202020202020202020202020202020202020202020202140b200341306a200341186a410210ea0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1f0c200b200341306a200341186a410210ea0320032802300d272003280218220541016a22092005490d2820032009360218200741016a2207200a2802002205490d1e0c1f0b200341306a200341186a410110ea0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1d0c1e0b200341306a200341186a410110ea0320032802300d2b2003280218220541016a22092005490d2c20032009360218200741016a2207200a2802002205490d1c0c1d0b200341306a200341186a410110ea0320032802300d2c2003280218220541016a22092005490d2d20032009360218200741016a2207200a2802002205490d1b0c1c0b200341306a200341186a410210ea032003280230450d180c2f0b200941016a22052009490d2f20032005360218200741016a2207200a2802002205490d190c1a0b200120074104746a2d0001210e200341306a41026a2003412d6a41026a2d00003a0000200320032f002d3b0130200341246a2802002201200341206a280200470d01200141016a220f2001490d5b20014101742210200f200f2010491b2210ad4204862211422088a70d5b2011a722124100480d5b2001450d13200328021c200141047420121027220f0d140c5c0b200341306a200341186a410110ea0320032802300d2e2003280218220541016a22092005490d3020032009360218200741016a2207200a2802002205490d170c180b200328021c210f0c130b200941016a22052009490d3d20032005360218200741016a2207200a2802002205490d150c160b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d140c150b200341306a200341186a200120074104746a41046a28020010e90320032802304101460d2f200341306a200341186a2003280234280204220510ea0320032802300d41200341306a200341186a410110ea0320032802300d4a2003280218220920056a22052009490d4b20032005360218200741016a2207200a2802002205490d130c140b200341306a200341186a410210ea0320032802300d34200341306a200341186a410110ea0320032802300d3e2003280218220541016a22092005490d4820032009360218200741016a2207200a2802002205490d120c130b200341306a200341186a410110ea032003280230450d0f0c300b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d100c110b200341306a200341186a410110ea032003280230450d0d0c2f0b2003200410be032003280204200120074104746a41046a28020022054d0d2b2003280200220920054104746a2201450d2b200341306a200341186a200920054104746a28020810ea0320032802300d3b2003280218220520012d000d4104476a22092005490d4320032009360218200741016a2207200a2802002205490d0e0c0f0b200341306a200341186a200120074104746a41046a28020010e90320032802304101460d32200341306a200341186a200328023428020410ea0320032802300d38200341246a2802002205417f6a220920054f0d41200920054b0d41200328021c20094104746a41013a000c200741016a2207200a2802002205490d0d0c0e0b200341246a22052802002209450d2420052009417f6a2209360200200328021c20094104746a22052d000c4102460d2420052802002109200320052802082205360218200520096a22092005490d3f20032009360218200741016a2207200a2802002205490d0c0c0d0b200341246a2802002205417f6a220920054f0d31200920054b0d31200328021c20094104746a41013a000c200741016a2207200a2802002205490d0b0c0c0b200341306a200120074104746a41046a280200200210e50320032802304101460d25200341306a200341186a2003280234220528020810ea0320032802300d392003280218220920052d000d4104476a22052009490d3c20032005360218200741016a2207200a2802002205490d0a0c0b0b200341306a200341186a410110ea0320032802300d2d2003280218220541016a22092005490d3920032009360218200741016a2207200a2802002205490d090c0a0b200341306a200341186a410110ea032003280230450d060c290b200341306a200341186a200120074104746a2209410c6a28020010e90320032802304101460d2120032802342802042101200941086a2802004102742105200941046a280200210903402005450d07200341306a200341186a200928020010e90320032802304101460d1b2005417c6a2105200941046a210920032802342802042001460d000c1c0b0b200341306a200341186a200c10ea0320032802300d24200341246a2802002205417f6a220920054f0d30200920054b0d30200328021c20094104746a41013a000c200741016a2207200a2802002205490d060c070b200341306a200341186a410110ea0320032802300d2e2003280218220541016a22092005490d3620032009360218200741016a2207200a2802002205490d050c060b20121026220f450d480b200341206a20103602002003200f36021c200341246a28020021010b200f20014104746a220141003a000c2001200936020820012005410347200e41044722057136020420012005360200200120032f01303b000d2001410f6a200341326a2d00003a0000200341246a2205200528020041016a3602000b200741016a2207200a2802002205490d010c020b200341306a200341186a200110ea0320032802300d39200341246a2802002205417f6a220920054f0d3a200920054b0d3a200328021c20094104746a41013a000c200741016a2207200a2802002205490d000b0b2000410036020020002008360204200b280200450d5c200328021c1023200341c0006a24000f0b411310262207450d382007410f6a41002800aae644360000200741086a41002900a3e6443700002007410029009be644370000200041086a4293808080b0023702002000200736020420004101360200200341c0006a24000f0b410f10262207450d38200741076a41002900b5e644370000200741002900aee644370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b410f10262207450d38200741076a41002900c4e644370000200741002900bde644370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b412510262207450d392007411d6a41002900e9e644370000200741186a41002900e4e644370000200741106a41002900dce644370000200741086a41002900d4e644370000200741002900cce644370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412510262207450d392007411d6a41002900e9e644370000200741186a41002900e4e644370000200741106a41002900dce644370000200741086a41002900d4e644370000200741002900cce644370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412710262207450d3a2007411f6a4100290090e744370000200741186a4100290089e744370000200741106a4100290081e744370000200741086a41002900f9e644370000200741002900f1e644370000200041086a42a7808080f0043702002000200736020420004101360200200341c0006a24000f0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a280200450d550c540b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d530c540b410e10262207450d3a200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d520c530b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d510c520b410e10262207450d39200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d500c510b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4f0c500b410e10262207450d38200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4e0c4f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4d0c4e0b410e10262207450d37200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4c0c4d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4b0c4c0b410e10262207450d36200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4a0c4b0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d490c4a0b412710262207450d352007411f6a41002900dce744370000200741186a41002900d5e744370000200741106a41002900cde744370000200741086a41002900c5e744370000200741002900bde744370000200041086a42a7808080f0043702002000200736020420004101360200200341206a2802000d480c490b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d470c480b410e10262207450d34200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d460c470b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d450c460b411710262207450d332007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d440c450b410e10262207450d33200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d430c440b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d420c430b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d410c420b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d400c410b410e10262207450d30200741066a41002900eae744370000200741002900e4e744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d3f0c400b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3e0c3f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3d0c3e0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3c0c3d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3b0c3c0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3a0c3b0b410e10262207450d2b200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d390c3a0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d380c390b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d370c380b411710262207450d292007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d360c370b410e10262207450d29200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d350c360b410e10262207450d29200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d340c350b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d330c340b411710262207450d282007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d320c330b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d310c320b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d300c310b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2f0c300b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2e0c2f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2d0c2e0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2c0c2d0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2b0c2c0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2a0c2b0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d290c2a0b411710262207450d232007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d280c290b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d270c280b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d260c270b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d250c260b410e10262207450d22200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d240c250b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d230c240b411710262207450d212007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d220c230b41134101102a000b410f4101102a000b410f4101102a000b41f4e7c400200720051029000b41254101102a000b41254101102a000b41104104102a000b41274101102a000b101e000b20124104102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41274101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b200328021c10230b200341c0006a24000b110020002802003502004101200110cc020bbf0a020b7f017e230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c21020240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a200810be0320032802182107200328021c21020c010b410021070b2002410020071b21092006412c6c2102200441586a2105200741a886c50020071b210a0240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a200810be032003280210210b2003280214210c0c010b4100210b0b2006412c6c2102200441586a2105200b41a886c500200b1b210d024002400240024002400240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210503402002450d09200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a200810be0320032802082207200328020c41286c6a210803402008200722026b419f014d0d0320022d0018450d04200241c0006a2d0000450d05200241e8006a2d0000450d06200241a0016a210720024190016a2d00000d000b20024194016a210520010d060c090b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22050d080b200341cc006a41013602002003410236022c2003420237023c200341d4e1c4003602382003200341206a3602282003200341286a360248200341d0006a200341386a10a2012003290254210e200328025021020c0a0b20022008460d042002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c060b0b2005410c6a210720010d030c060b2002411c6a2105200241286a210720010d020c050b200241c4006a2105200241d0006a210720010d010c040b200241ec006a2105200241f8006a21072001450d030b02400240024003402001417f6a2101024002400240024003402008200722026b419f014d0d0120022d0018450d02200241c0006a2d0000450d03200241e8006a2d0000450d04200241a0016a210720024190016a2d00000d000b20010d040c070b20022008460d072002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c090b0b2005410c6a210720010d030c090b200241286a210720010d020c030b200241d0006a210720010d010c030b200241f8006a210720010d000b2003200241ec006a2802002202360224200920024b0d060c070b20032002411c6a2802002202360224200920024b0d050c060b2003200241c4006a2802002202360224200920024b0d040c050b200320024194016a2802002202360224200920024b0d030c040b41f7e0c40041dd001021000b41b5e0c40041c2001021000b200320052802002202360224200920024d0d010b200a20024104746a2202450d002000410036020020002002360204200341e0006a24000f0b200341dc006a4102360200200341cc006a4102360200200341023602542003420337023c200341e4e1c4003602382003200341206a3602582003200341246a3602502003200341d0006a360248200341286a200341386a10a201200329022c210e200328022821020b2000200236020420004101360200200041086a200e370200200341e0006a24000bf50303047f017e017f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441386a2802002105200441346a2802002106200141016a2101200441c4006a2802004102460d030c010b0240024020002802002201450d0020003301044220862003ad842107410121040c010b2003ad210741002104410021010b200010232007a72103024002402007422088a7220620012f01064f0d00200121050c010b03400240024020012802002205450d00200441016a210420013301044220862003ad8421070c010b2003ad2107410021050b200110232007a72103200521012007422088a7220620052f01064f0d000b0b200520064102746a4198036a2802002100200520064105746a220141c4006a2802002108200141386a2802002105200141346a2802002106024020044101460d00410120046b210103402000280294032100200141016a22010d000b0b4100210120084102460d020b2002417f6a210202402005450d00200610230b20020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002105200110232005450d00024020052802002201450d000340200510232001210520012802002200210120000d000b0b200510230b0b940302067f017e230041106b2202240002400240024002400240024002400240200041046a2802002203200041086a28020022046b20012802042205200128020022066b41047622074f0d00200420076a22062004490d0320034101742204200620062004491b2206ad4204862208422088a70d032008a722044100480d032003450d0120002802002003410474200410272203450d020c040b2000280200210320062005460d040c050b2004102622030d020b20044108102a000b101e000b20002003360200200041046a2006360200200041086a280200210420012802002206200141046a280200470d010b410021060c010b2001200641106a3602000b2002200610e803024020022d000041ac01460d00200320044104746a2106034020062002290300370300200641086a200241086a2903003703000240024020012802002203200141046a280200460d002001200341106a3602000c010b410021030b200441016a2104200641106a21062002200310e80320022d000041ac01470d000b0b200041086a2004360200200241106a24000bc80903037f017e017f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001450d0020012d00002202417e6a2203412e4b0d01024020030e2f001f233030152019301e0b30300e0d1d271a0c161c242212112829061b0a091025172605140721080403182b2a130f000b20012d00012104410221020c2f0b200041ac013a00000f0b0c2b0b20012d00012104412b21020c2c0b200141046a280200210620013502082105412a21020c2a0b200141046a280200210620013502082105412521020c290b200141046a280200210620013502082105411d21020c280b200141046a280200210620013502082105412721020c270b200141046a280200210620013502082105412921020c260b200141046a280200210620013502082105412021020c250b200141046a280200210620013502082105411f21020c240b200141046a280200210620012d00012104410c21020c240b200141046a280200210620013502082105411421020c220b200141046a2802002106411021020c210b200141046a2802002106410f21020c200b20012903082105413021020c1e0b200141046a280200210620013502082105412121020c1e0b200141046a280200210620013502082105411a21020c1d0b200141046a280200210620013502082105411921020c1c0b200141046a2802002106412f21020c1b0b200141046a280200210620013502082105412621020c1a0b200141046a2802002106410721020c190b200141046a280200210620013502082105411521020c180b200141046a280200210620013502082105412321020c170b20012d00012104412c21020c170b20012802082204ad2205421e88a70d122005420286a72202417f4c0d124104210602402002450d00200210262206450d140b02402004450d00200141046a28020021022004410274210320062104034020042002280200360200200441046a2104200241046a21022003417c6a22030d000b0b2001410c6a3502004220862005842105410921020c150b200141046a2802002106411321020c140b200141046a280200210620013502082105411e21020c130b200141046a280200210620013502082105411621020c120b200141046a2802002106411121020c110b200141046a2802002106410b21020c100b20012d00012104410321020c100b200141046a2802002106410821020c0e0b200141046a280200210620013502082105412821020c0d0b200141046a280200210620013502082105411821020c0c0b20012d00012104410421020c0c0b200141046a280200210620013502082105411721020c0a0b200141046a280200210620013502082105412221020c090b200141046a280200210620013502082105412421020c080b200141046a2802002106411221020c070b200141046a280200210620013502082105411b21020c060b200141046a280200210620013502082105411c21020c050b20012903082105412e21020c030b200141046a2802002106412d21020c030b101d000b20024104102a000b0b0b200020043a0001200020023a0000200041086a2005370300200041046a20063602000ba00201027f02400240024002402001410c6a2802002203417f6a220420034d0d00411610262201450d01200020013602042001410e6a41002900bee944370000200141086a41002900b8e944370000200141002900b0e944370000200041086a4296808080e002370200200041013602000f0b0240200420026b220220044d0d00411b10262201450d0220002001360204200141176a41002800dde944360000200141106a41002900d6e944370000200141086a41002900cee944370000200141002900c6e944370000200041086a429b808080b003370200200041013602000f0b200320024d0d022000200141046a28020020024104746a360204200041003602000f0b41164101102a000b411b4101102a000b41e4e9c400200220031029000bf60201037f230041106b22032400024002402002450d0020032001410010e90320032802004101470d01200020034104722202290200370200200041086a200241086a280200360200200341106a24000f0b20004100360200200341106a24000f0b02400240024002402001280200220420032802042205280208470d0020052d000c450d0120004100360200200341106a24000f0b0240200420026b220220044d0d00410f10262202450d022000428f808080f00137020420002002360200200241076a41002900a8e944370000200241002900a1e944370000200341106a24000f0b2000410036020020012002360200200341106a24000f0b412510262202450d01200042a5808080d004370204200020023602002002411d6a4100290099e944370000200241186a4100290094e944370000200241106a410029008ce944370000200241086a4100290084e944370000200241002900fce844370000200341106a24000f0b410f4101102a000b41254101102a000be40601087f230041d0006b220224002000280200220041046a28020021032000280200210041012104200128021841a7b1c50041012001411c6a28020028020c11020021050240024002402003450d002002200036020402400240024020050d00024020012d00004104710d00200241046a200110dc0221044101210620034101460d020c030b41012104200141186a220528020041a5b1c50041012001411c6a28020028020c1102000d002001280200210741012104200241086a41086a41013a0000200241186a411c6a41e8b0c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022007360218200241186a41186a200241086a360200200220052902003703082002200141046a28020036021c200241046a200241186a10dc020d00200241306a2802004182b1c5004102200241346a28020028020c11020021040b4101210620034101470d010b4101210020040d020c030b200041046a21002003410274417c6a2103200141186a21072001411c6a210820042105034020022000360204200541ff0171210441012105024020040d000240200128020022044104710d0020072802004184b1c5004102200828020028020c1102000d01200241046a200110dc022105200041046a21002003417c6a22030d020c030b200241086a41086a20063a0000200241186a411c6a220941e8b0c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022004360218200241186a41186a2204200241086a360200200220072902003703082002200141046a28020036021c200241046a200241186a10dc020d0020042802004182b1c5004102200928020028020c1102002105200041046a21002003417c6a22030d010c020b200041046a21002003417c6a22030d000b0b410121002005450d010b200241d0006a240020000f0b200141186a28020041a6b1c50041012001411c6a28020028020c1102002100200241d0006a240020000bdd0202027f027e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d0120042004423f8722057c2005852004427f55200110cc02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b20004180011048000b20004180011048000bdb0203027f017e017f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210020034120710d012000ac2204420020047d2000417f4a22001b2000200110cc02210020024180016a240020000f0b20002802002103410021000340200220006a41ff006a2003410f712205413072200541d7006a2005410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712205413072200541376a2005410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b20034180011048000b20004180011048000bd20201037f23004180016b22022400200028020021000240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff01834101200110cc02210020024180016a240020000f0b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000b931001157f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024002400240024002400240024002400240024002400240024002400240024002400240024020042d00002200410d4b0d00024020000e0e000203040506070809140a0b0c0d000b200441086a280200450d13200441046a280200102320022003470d140c150b0240200441086a280200450d00200441046a28020010230b0240200441146a2802002200450d00200441186a280200450d00200010230b200441246a280200450d12200441206a280200102320022003470d130c140b0240200441086a280200450d00200441046a28020010230b200441146a280200450d11200441106a280200102320022003470d120c130b200441046a210502402004410c6a2802002201450d00200528020021002001410474210103400240200041046a280200450d00200028020010230b200041106a2100200141706a22010d000b0b200441086a280200450d102005280200102320022003470d110c120b200441046a210502402004410c6a2802002201450d0020052802002100200141286c210103400240200041046a280200450d00200028020010230b0240200041106a280200450d002000410c6a28020010230b200041286a2100200141586a22010d000b0b200441086a280200450d0f2005280200102320022003470d100c110b200441086a280200450d0e200441046a280200102320022003470d0f0c100b200441086a280200450d0d200441046a280200102320022003470d0e0c0f0b200441086a280200450d0c200441046a280200102320022003470d0d0c0e0b200441046a21062004410c6a2802002200450d0a2006280200220720004104746a2108410021000c050b200441046a210502402004410c6a2802002201450d0020052802002100200141146c210103400240200041046a280200450d00200028020010230b200041146a21002001416c6a22010d000b0b200441086a280200450d0a2005280200102320022003470d0b0c0c0b200441046a21092004410c6a2802002200450d072009280200220a2000411c6c6a210b410121000c030b200441046a210c2004410c6a2802002200450d05200c280200220d200041186c6a210e410221000c020b200441046a210f2004410c6a2802002200450d03200f28020022102000411c6c6a2111410321000c010b024002400240200441046a2d000022004102460d0020004101460d0120000d022004410c6a280200450d09200441086a280200102320022003470d0a0c0b0b2004410c6a2112200441146a2802002200450d032012280200221320004104746a2114410421000c020b2004410c6a21150240200441146a2802002201450d00201528020021002001410c6c21010340024020002802002205450d00200041046a280200450d00200510230b2000410c6a2100200141746a22010d000b0b200441106a280200450d072015280200102320022003470d080c090b2004410c6a280200450d06200441086a28020010230c060b0340024002400240024002400240024002400240024020000e050001020304040b024020072802082201450d0020072802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b200741106a21000240200741046a280200450d00200728020010230b2000210720002008470d040c0e0b0240200a410c6a2802002201450d00200a2802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b0240200a41086a280200450d00200a41046a28020010230b200a411c6a21000240200a41146a280200450d00200a28021010230b2000210a2000200b470d040c0c0b0240200d41046a280200450d00200d28020010230b0240200d41146a2802002201450d00200d28020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b200d41186a21000240200d41106a280200450d00200d410c6a28020010230b2000210d2000200e470d040c0a0b02402010410c6a2802002201450d0020102802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b0240201041086a280200450d00201041046a28020010230b2010411c6a21000240201041146a280200450d00201028021010230b2000211020002011470d040c080b2013221541106a2113024020152802042200450d0002402015410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d00200510230b2000410c6a2100200141746a22010d000b0b201541086a280200450d00201541046a28020010230b20132014470d040c060b410021000c040b410121000c030b410221000c020b410321000c010b410421000c000b0b200441106a280200450d042012280200102320022003470d050c060b200441086a280200450d03200f280200102320022003470d040c050b200441086a280200450d02200c280200102320022003470d030c040b200441086a280200450d012009280200102320022003470d020c030b200441086a280200450d002006280200102320022003470d010c020b20022003470d000b0b0b0c002000280200200110c2030bb20201027f230041106b2202240002400240200028020022002d00004104470d00200128021841d0f6c40041082001411c6a28020028020c11020021010c010b2002200128021841bbf6c40041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0f6c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470ba41b01037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000022024101460d0020024102470d01200141046a280200200141086a2802002202470d03200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0720012802002002200410272203450d080c0f0b200141046a280200200141086a2802002202470d01200241016a22032002490d1020024101742204200320032004491b22044100480d102002450d0420012802002002200410272203450d050c0c0b200141046a280200200141086a2802002202470d02200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d0720012802002002200410272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2004102622030d070b20044101102a000b2004102622030d070b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a28020020011093030f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d2020024101742204200320032004491b22044100480d202002450d0f20012802002002200410272203450d100c1b0b200141046a28020020042802002202470d03200241016a22032002490d1f20024101742204200320032004491b22044100480d1f2002450d0820012802002002200410272203450d090c180b200141046a280200200141086a2802002202470d03200241016a22032002490d1e20024101742204200320032004491b22044100480d1e2002450d0920012802002002200410272203450d0a0c150b200141046a280200200141086a2802002202470d03200241016a22032002490d1d20024101742204200320032004491b22044100480d1d2002450d0a20012802002002200410272203450d0b0c120b200141046a280200200141086a2802002202470d04200241016a22032002490d1c20024101742204200320032004491b22044100480d1c2002450d0d20012802002002200410272203450d0e0c0f0b200128020021030c150b200128020021030c120b200128020021030c0f0b200128020021030c140b200128020021030c0b0b2004102622030d0f0b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a2802002001109303200041146a280200200041186a280200200110930302400240024002400240200141046a280200200141086a2802002202470d00200241016a22032002490d0720024101742204200320032004491b22044100480d072002450d0120012802002002200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a200041026a2d00003a00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d1e20024101742204200320032004491b22044100480d1e2002450d0f20012802002002200410272203450d100c1b0b200141046a28020020042802002202470d03200241016a22032002490d1d20024101742204200320032004491b22044100480d1d2002450d0820012802002002200410272203450d090c180b200141046a280200200141086a2802002202470d03200241016a22032002490d1c20024101742204200320032004491b22044100480d1c2002450d0920012802002002200410272203450d0a0c150b200141046a280200200141086a2802002202470d03200241016a22032002490d1b20024101742204200320032004491b22044100480d1b2002450d0a20012802002002200410272203450d0b0c120b200141046a280200200141086a2802002202470d04200241016a22032002490d1a20024101742204200320032004491b22044100480d1a2002450d0d20012802002002200410272203450d0e0c0f0b200128020021030c150b200128020021030c120b200128020021030c0f0b200128020021030c140b200128020021030c0b0b2004102622030d0f0b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a2802002001109303200041146a280200200041186a2802002001109303200041206a280200200041246a28020020011093030240024002400240024002400240024002400240024002400240024002400240024002400240200041026a2d0000417f6a220041034b0d00024020000e0400040203000b200141046a280200200141086a2802002200470d07200041016a22022000490d1320004101742203200220022003491b22034100480d132000450d0f20012802002000200310272202450d100c1c0b200141046a280200200141086a2802002200470d03200041016a22022000490d1220004101742203200220022003491b22034100480d122000450d0820012802002000200310272202450d090c190b200141046a280200200141086a2802002200470d03200041016a22022000490d1120004101742203200220022003491b22034100480d112000450d0920012802002000200310272202450d0a0c160b200141046a280200200141086a2802002200470d03200041016a22022000490d1020004101742203200220022003491b22034100480d102000450d0a20012802002000200310272202450d0b0c130b200141046a280200200141086a2802002200470d04200041016a22022000490d0f20004101742203200220022003491b22034100480d0f2000450d0d20012802002000200310272202450d0e0c100b200128020021020c160b200128020021020c130b200128020021020c100b200128020021020c150b200128020021020c0c0b2003102622020d100b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d080b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41023a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41043a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41033a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41013a00000be80701037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d0520022802002003200510272204450d060c170b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1020044101742203200520052003491b22034100480d102004450d0820022802002004200310272204450d090c140b200228020021040c160b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d08200228020020042003102722040d090c0f0b200228020021040c120b200241046a280200200241086a2802002203470d03200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d09200228020020032005102722040d0a0c0e0b2005102622040d110b20054101102a000b200228020021040c050b200228020021040c070b2003102622040d0b0b20034101102a000b200310262204450d060b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a2001410274410272360000200141037422010d0b0c0c0b200510262204450d040b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0420044101742203200520052003491b22034100480d042004450d01200228020020042003102722040d020c070b200228020021040c020b200310262204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a200136000020014103742201450d090c080b101e000b20034101102a000b20054101102a000b20034101102a000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b0000200141037422010d020c030b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a000020014103742201450d010b200020016a210103402000280200200041046a2802002002109303200041086a22002001470d000b0b0bd50101027f200028020421020240024020002802004101470d002000410c6a280200220020011092032000450d01200041186c2103200241146a21000340200041706a280200200041746a28020020011093032000417c6a28020020002802002001109303200041186a2100200341686a22030d000c020b0b200041086a280200220020011092032000450d00200041186c2103200241146a21000340200041706a280200200041746a28020020011093032000417c6a28020020002802002001109303200041186a2100200341686a22030d000b0b0b2700200028020c200041106a280200100f200041146a350200101a200041186a350200101a00000b080020002001100f0b06002000101b0b06002000101c0b2801017f02402002101b2203450d002003200020022001200120024b1b1094041a2000101c0b20030b1c01017f02402000101b2201450d002001410020001093041a0b20010b7601017f230041c0006b220024002000413336020c200041dc82c500360208200041346a412f360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000b1c00200128021841a8b1c50041052001411c6a28020028020c1102000bba0101037f024002400240024002400240200028020022002802042203200028020822046b20024f0d00200420026a22052004490d0320034101742204200520052004491b22044100480d032003450d0120002802002003200410272203450d020c040b200028020021030c040b2004102622030d020b20044101102a000b101e000b20002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a200120021094041a41000bba0401047f230041106b22022400200028020021000240024002400240024002400240024002400240024020014180014f0d00200028020822032000280204470d09200341016a22042003490d0520034101742205200420042005491b22044100480d052003450d0120002802002003200410272203450d020c080b2002410036020c0240024020014180104f0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b024020002802042204200028020822036b20014f0d00200320016a22052003490d0520044101742203200520052003491b22034100480d052004450d0320002802002004200310272204450d040c060b200028020021040c060b2004102622030d060b20044101102a000b2003102622040d020b20034101102a000b101e000b20002004360200200041046a2003360200200041086a28020021030b200041086a200320016a360200200420036a2002410c6a20011094041a0c020b20002003360200200041046a2004360200200041086a28020021030b200028020020036a20013a0000200041086a2200200028020041016a3602000b200241106a240041000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41c482c500200241086a10e2032101200241206a240020010b02000b0c0042afd4e7bdc6bbf3dc230b5501017f0240024002402001418080c400460d0041012104200028021820012000411c6a2802002802101103000d010b2002450d012000280218200220032000411c6a28020028020c11020021040b20040f0b41000bd30801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b21074180022108024003400240200820014f0d00200020086a2c000041bf7f4a0d020b2008417f6a21064100210520084101460d02200720086a21092006210820094101470d000c020b0b41002105200821060b200420063602142004200036021020044100410520051b36021c200441a886c50041da89c50020051b360218024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b20042002360220024002402002450d0020022001460d00200141016a210903400240200220014f0d00200020026a2c000041404e0d020b2002417f6a210820024101460d0220092002462106200821022006450d000c020b0b200221080b20082001460d02410121064100210502400240200020086a22092c000022024100480d002004200241ff0171360224200441286a21020c010b200020016a220621010240200941016a2006460d00200941026a2101200941016a2d0000413f7121050b2002411f712109024002400240200241ff017141e001490d004100210020062107024020012006460d00200141016a210720012d0000413f7121000b20002005410674722101200241ff017141f001490d0141002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d060c020b200520094106747221010c010b20012009410c747221010b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441ec006a4101360200200441e4006a4101360200200441c8006a41146a4130360200200441d4006a4131360200200441306a41146a4105360200200420023602582004410236024c20044205370234200441d08ac5003602302004200441186a3602682004200441106a3602602004200441246a3602502004200441206a3602482004200441c8006a360240200441306a41f88ac5001061000b20042002200320081b360228200441c8006a41146a4101360200200441d4006a4101360200200441306a41146a41033602002004410236024c20044203370234200441e089c5003602302004200441186a3602582004200441106a3602502004200441286a3602482004200441c8006a360240200441306a41f889c5001061000b200441e4006a4101360200200441c8006a41146a4101360200200441d4006a4102360200200441306a41146a41043602002004410236024c20044204370234200441888ac5003602302004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a3602482004200441c8006a360240200441306a41a88ac5001061000b41b88ac500104f000b830101037f230041206b2202240002400240200028020020011087040d002001411c6a2802002103200128021821042002411c6a4100360200200241a886c5003602182002420137020c200241e08bc50036020820042003200241086a10e203450d010b200241206a240041010f0b200028020420011087042101200241206a240020010b860c03037f017e167f410121020240200128021841272001411c6a2802002802101103000d00410221020240024002400240024002400240024002402000280200220341776a2200411e4b0d0041f4002104024020000e1f09000202030202020202020202020202020202020202020202070202020207090b41ee0021040c030b200341dc00460d050b2003108604450d02200341017267410276410773ad4280808080d0008421050c030b41f20021040b0c040b024002400240200341ffff034b0d0020034180fe0371410876210641a098c5002107410021084102210941b002210a41f098c500210b41f098c500210c417f210d4101210e200341ff0171210f410021020c010b0240200341ffff074b0d0020034180fe0371410876211341db9dc50021144100211541022116419f012117419d9ec5002118419d9ec5002119417f211a4101211b200341ff01712112410121020c010b200341ef83384b0d01200341e28b746a41e28d2c490d012003419fa8746a419f18490d01200341dee2746a410e490d01200341feffff0071419ef00a460d01200341a9b2756a4129490d01200341cb91756a410a4d0d01410121020c030b034002400240024002400240024002400240024002400240024020020e020001010b200720096a2110200820072d000122026a211102400240024020072d000022002006470d0020112008490d042011200a4f0d052008200b6a210003402002450d022002200d6a210220002d000021042000200e6a21002004200f470d000c100b0b200020064b0d0120112108201021072010200c470d090c010b20112108201021072010200c470d090b200341ffff03712100419f9bc50021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41db9dc500460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241db9dc500470d000b0b41012102200f410171450d0c0c0e0b201420166a2110201520142d000122026a211102400240024020142d000022002013470d0020112015490d05201120174f0d06201520186a210003402002450d022002201a6a210220002d000021042000201b6a210020042012470d000c0f0b0b200020134b0d01201121152010211420102019470d0a0c010b201121152010211420102019470d0a0b200341ffff0371210041bb9fc50021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41b8a2c500460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241b8a2c500470d000b0b41012102200f410171450d0b0c0d0b200820111048000b201141af02108c01000b201520111048000b2011419e01108c01000b41b88ac500104f000b41b88ac500104f000b410021020c030b410021020c020b410121020c010b410121020c000b0b200341017267410276410773ad4280808080d0008421050b410321020c010b0b200321040b200141186a210f2001411c6a210e02400340024002400240024002400240024020024101460d0041dc002100024020024102460d0020024103470d092005422088a741ff0171417f6a220241044b0d09024020020e050006040503000b200542ffffffff8f6083210541fd0021000c060b410121020c060b41002102200421000c050b200542ffffffff8f60834280808080c0008421050c030b200542ffffffff8f608342808080802084210541fb0021000c020b200542ffffffff8f608342808080803084210541f50021000c010b20042005a7220d410274411c7176410f712202413072200241d7006a2002410a491b21000240200d450d002005427f7c42ffffffff0f832005428080808070838421050c010b200542ffffffff8f60834280808080108421050b410321020b200f2802002000200e280200280210110300450d000b41010f0b200141186a28020041272001411c6a28020028021011030021020b20020b960201017f0240024002400240024002400240200041ff0f4b0d00200041037641f8ffffff017141a88cc5006a21010c010b0240200041ffff034b0d00200041067641606a220141df074b0d02200141c08ec5006a2d0000220141c9004b0d03200141037441b0a3c5006a21010c010b2000410c7641706a220141ff014b0d03200141a096c5006a2d00004106742000410676413f7172220141ff034b0d0420014180a8c5006a2d0000220141364b0d0520014103744180acc5006a21010b200129030042012000413f71ad86834200520f0b41b8a2c500200141e0071029000b41c8a2c500200141ca001029000b41d8a2c50020014180021029000b41e8a2c50020014180041029000b41f8a2c500200141371029000bb30201037f23004180016b220224000240024002400240200128020022034110710d0020034120710d012000ad4101200110cc02210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b20004180011048000b20004180011048000b0e0020003502004101200110cc020bc50501077f41002104024020024103712205450d00410420056b2205450d00200220032005200520034b1b22046a210641002105200141ff017121072004210820022109024002400340200620096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210603402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2006470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b20002005360204200041013602000f0b200141ff017121070240024020034108490d002004200341786a220a4b0d00200741818284086c210502400340200220046a220941046a2802002005732208417f73200841fffdfb776a7120092802002005732209417f73200941fffdfb776a7172418081828478710d01200441086a2204200a4d0d000b0b200420034b0d010b200220046a2109200220036a2102200320046b2108410021050240024002400340200220096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210203402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2002470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b2000200520046a360204200041013602000f0b2000200520076a20046a360204200041003602000f0b200420031048000b2701017f20002802002201280200200128020420002802042802002000280208280200108304000be104010d7f230041306b2203240002402002450d00200341286a2104200041086a2105200341206a21062003411c6a2107200341246a2108200041046a210902400240024002400340024020052d0000450d00200028020041e4b0c5004104200928020028020c1102000d020b2004410a3602002006428a8080801037030020072002360200200341106a41086a220a41003602002003200236021420032001360210200341086a410a200120021089040240024002400240024020032802084101470d00200328020c210b0340200a200b200a2802006a41016a220b36020002400240200b2008280200220c4f0d002003280214210d2007280200220e200b4f0d010c040b02402003280214220d200b490d00200c41054f0d062003280210200b200c6b220f6a220e2004460d05200e2004200c109604450d050b2007280200220e200b490d030b200d200e490d022003200341106a200c6a41176a2d00002003280210200b6a200e200b6b1089042003280204210b20032802004101460d000b0b200a20072802003602000b200541003a00002002210b0c020b200541013a0000200f41016a210b0c010b200c4104108c01000b2009280200210e2000280200210c0240200b452002200b4672220a0d002002200b4d0d042001200b6a2c000041bf7f4c0d040b200c2001200b200e28020c1102000d010240200a0d002002200b4d0d052001200b6a2c000041bf7f4c0d050b2001200b6a21012002200b6b22020d000c020b0b200341306a240041010f0b200341306a240041000f0b200120024100200b108304000b20012002200b2002108304000b200341306a240041000b02000bfa0101017f230041106b220224002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a2001108b042101200241106a240020010b6101017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a4188b1c500200241086a10e2032101200241206a240020010b02000b0e00200028020020012002108b040b810201017f230041106b22022400200028020021002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a2001108b042101200241106a240020010b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a4188b1c500200241086a10e2032101200241206a240020010b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f02400240200120004f0d002002450d012001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000c020b0b2002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b4401037f024002402002450d00410021030340200020036a2d00002204200120036a2d00002205470d02200341016a22032002490d000b41000f0b41000f0b200420056b0b3e01017f230041106b22052400200520012002200320044100109b04200529030021012000200541086a29030037030820002001370300200541106a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080bc30502037f057e230041306b2206240002400240024002400240024002400240024002400240024002400240024020024200510d0020034200510d0120044200510d03200479a7200279a76b220741c0004f0d0241ff0020076b2108200741016a21070c0c0b20044200520d012005450d0520034200510d0d20054200370308200520012003823703000c060b20044200510d0c20014200510d032004427f7c22092004834200510d07200479a7200279a76b2207413f490d090b2005450d012005200137030020052002370308420021010c070b2003427f7c22092003834200510d044100200379a741c1006a200279a76b22076b21080c080b420021010c050b02402005450d0020054200370300200520022004823703080b200220048021010c040b20034200510d070b200120038021010c020b02402005450d0020054200370308200520092001833703000b20034201510d04200641206a2001200220037aa7109a04200641286a2903002102200629032021010c040b02402005450d0020052001370300200520092002833703080b200220047a423f838821010b420021020c020b41ff0020076b2108200741016a21070b200620012002200841ff0071109904200641106a20012002200741ff0071109a04200641086a2903002102200641106a41086a290300210a20062903002101200629031021094200210b0340200a4201862009423f8884220c200c427f8520047c20094201862002423f88842209427f85220c20037c200c54ad7c423f87220c2004837d2009200c200383220d54ad7d210a2009200d7d2109420020024201862001423f8884842102200b2001420186842101200c420183220c210b2007417f6a22070d000b02402005450d00200520093703002005200a3703080b20024201862001423f88842102200c20014201868421010b2000200137030020002002370308200641306a24000f0b00000b0bb8b1050100418080c0000badb10518001000240000001d411100170000004002000009000000547269656420746f20736872696e6b20746f2061206c61726765722063617061636974790000000098061100080000000000000020021000020000000000000000000000284311000000000000000000000000003002100006000000000000003802100003000000000000000000000028431100000000000000000000000000500210000e0000000000000028431100000000000000000000000000284311000000000000000000000000005e021000070000000000000068021000020000000000000000000000284311000000000000000000000000007802100006000000000000008002100001000000000000000000000028431100000000000000000000000000880210000900000000000000800210000100000000000000000000002843110000000000000000000000000091021000090000000000000080021000010000000000000000000000284311000000000000000000000000003c07110008000000000000009c02100002000000000000000000000028431100000000000000000000000000ac021000090000000000000028a4100002000000000000000000000028431100000000000000000000000000b50210000b00000000000000ece6100001000000000000000000000028431100000000000000000000000000c00210000600000000000000c802100003000000000000000000000028431100000000000000000007031000090000005bf61000070000005461626c6564000007031000090000005bf6100007000000e65710000e00000045787465726e616c5461626c656453746172746564000000eb0210000f000000fa0210000d0000005061737365640000eb0210000f0000004e6f7450617373656443616e63656c6c65640000eb0210000f0000002f1c11000400000044656c656761746564556e64656c6567617465645665746f65640000f6081100090000000408110004000000e00210000b000000426c6f636b4e756d6265725265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e64657844656d6f637261637920566f74654f6644656d6f63726163792050726f787944656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6644656d6f6372616379204465706f7369744f6644656d6f6372616379204c6173745461626c656457617345787465726e616c44656d6f6372616379204e65787454616c6c7944656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7344656d6f6372616379204e65787445787465726e616c4e6f2065787465726e616c2070726f706f73616c2077616974696e6743616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d44656d6f6372616379205075626c696350726f7073000000c0041000480000008d0a00000e0000004e6f207075626c69632070726f706f73616c732077616974696e67002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000c00d11000700000000000000c8071000020000000000000000000000f80710000600000000000000000000002808100006000000000000003008100001000000000000000000000048081000060000000000000000000000180e1100040000000000000078081000020000000000000000000000a8081000070000000000000000000000e00810000a0000000000000078081000020000000000000000000000ec0810000700000000000000000000002409100011000000000000003809100004000000000000000000000098091000060000000000000000000000c80910001000000000000000d8091000010000000000000000000000f0091000020000000000000000000000000a100010000000000000006cec1000010000000000000000000000100a1000020000000000000000000000200a100019000000000000006cec10000100000000000000000000003c0a10000200000000000000000000004c0a10000d000000000000005c0a1000010000000000000000000000740a10000100000000000000000000007c0a10001100000000000000900a1000010000000000000000000000a80a1000010000000000000000000000b00a10000d00000000000000c00a1000030000000000000000000000080b1000010000000000000000000000100b100009000000000000001c0b1000010000000000000000000000340b10000500000000000000000000005c0b10000c0000000000000028431100000000000000000000000000680b1000050000000000000000000000900b10000c000000000000001c0b10000100000000000000000000009c0b1000050000000000000000000000c40b10000800000000000000cc0b1000020000000000000000000000fc0b1000050000000000000000000000240c10000a0000000000000028431100000000000000000000000000300c1000050000000000000000000000fc0e1100080000000000000026ee100010000000000000008efd100005000000000000004cfc10001500000008111000280000002843110000000000d31911000b000000de191100080000004211100020000000fc1911000c0000007365636f6e64000000000000fc0e11000800000000000000301110001200000008111000280000002843110000000000d31911000b000000de19110008000000dc36100010000000fc1911000c00000000000000670d100009000000000000003a0d10001800000000000000180e110004000000000000000411100004000000881010004d000000d51010002f0000002843110000000000d31911000b000000de19110008000000691010001f000000fc1911000c00000070726f78795f766f74650000d70f1000540000002b1010003e0000002843110000000000d31911000b000000de19110008000000691010001f000000fc1911000c000000656d657267656e63795f70726f706f736500000000000000fc0e1100080000000000000026ee100010000000000000007f0f11000900000000000000fa0210000d00000000000000c50f10000d00000000000000e30011000e00000000000000d20f10000500000000000000e30011000e000000c60e1000220000002843110000000000e80e100058000000400f1000460000002843110000000000860f10003f000000656d657267656e63795f63616e63656c00000000670d10000900000000000000eb0210000f000000720e100054000000660e10000c00000065787465726e616c5f70726f706f73651a0e10004c000000660e10000c00000065787465726e616c5f70726f706f73655f6d616a6f72697479000000ac0d100056000000020e1000180000007665746f5f65787465726e616c000000000000009f0d10000d00000000000000040f110007000000700d10002f00000063616e63656c5f7265666572656e64756d00000000000000670d100009000000000000003a0d100018000000520d10001500000063616e63656c5f717565756564000000000000002d0d100004000000000000006dfc10001700000000000000310d10000500000000000000266810000c00000000000000360d100004000000000000003a0d100018000000050d1000280000007365745f70726f787900000000000000000d10000500000000000000561c11000c000000da0c1000260000002843110000000000d31911000b000000e619110016000000fc1911000c00000072657369676e5f70726f7879b40c1000260000002843110000000000d31911000b000000e3fb100010000000fc1911000c00000072656d6f76655f70726f78798e0c1000260000002843110000000000d31911000b000000e3fb100010000000fc1911000c00000064656c656761746500000000780c10000200000000000000561c11000c000000000000007a0c10000a00000000000000840c10000a000000690c10000f0000002843110000000000d31911000b000000e619110016000000fc1911000c000000756e64656c65676174650000580c1000110000002843110000000000d31911000b000000de19110008000000fc1911000c00000020556e64656c656761746520766f74652e2044656c656761746520766f74652e746f636f6e76696374696f6e436f6e76696374696f6e20436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e776869636877686174436f6d706163743c5265666572656e64756d496e6465783e2052656d6f76652061207265666572656e64756d2e7265665f696e646578205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e70726f706f73616c5f68617368205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d65205363686564756c6520616e20656d657267656e6379207265666572656e64756d2e20546869732077696c6c206372656174652061206e6577207265666572656e64756d20666f7220746865206070726f706f73616c602c20617070726f766564206173206c6f6e6720617320636f756e74656420766f7465732065786365656420607468726573686f6c646020616e642c20696620617070726f7665642c20656e61637465642061667465722074686520676976656e206064656c6179602e204974206d61792062652063616c6c65642066726f6d206569746865722074686520526f6f74206f722074686520456d657267656e6379206f726967696e2e766f74696e675f706572696f6464656c617920566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e566f74652050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e436f6d706163743c50726f70496e6465783e202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e44656d6f63726163790000000000941610000f000000000000000000000007031000090000000000000000000000000000000000000000000000000000000000000028431100541710000000000000000000a416100001000000000000000100000000000000ac1610000b0000000000000000000000b71610002b0000000000000000000000000000000000000000000000000000000000000028431100101810000000000000000000e416100001000000000000000100000000000000ec161000090000000101000000000000070310000900000000000000f51610002100000000000000000000000000000000000000284311001817100000000000000000002817100001000000000000000000000000000000301710000f0000000000000000000000eb0210000f0000000000000000000000000000000000000000000000000000000000000028431100541710000000000000000000401710000100000000000000010000000000000048171000090000000000000000000000eb0210000f000000000000000000000000000000000000000000000000000000000000002843110054171000000000000000000064171000010000000000000001000000000000006c171000100000000101000000000000eb0210000f000000000000007c1710002d0000000000000000000000000000000000000028431100881810000000000000000000ac17100001000000000000000000000000000000b41710000d0000000101000000000000e30011000e00000000000000c11710002b0000000000000000000000000000000000000028431100ec1710000000000000000000fc1710000100000000000000010000000000000004181000090000000101000000000000eb0210000f00000000000000ea1b11001100000000000000000000000000000000000000284311001018100000000000000000002018100001000000000000000100000000000000281810000600000001010000000000002e1810001f0000000000000004111000040000000000000000000000000000000000000028431100501810000000000000000000601810000400000000000000010000000000000080181000050000000101000000000000561c11000c00000000000000561c11000c00000000000000000000000000000000000000284311008818100000000000000000009818100002000000000000000000000000000000a81810000b0000000101010000000000561c11000c00000000000000b31810001a0000000000000000000000000000000000000028431100d01810000000000000000000e018100001000000000000000100000000000000e81810001500000000000000000000002f1c1100040000000000000000000000000000000000000000000000000000000000000028431100c419100000000000000000000019100002000000000000000100000000000000101910000c00000000000000000000001c1910001c0000000000000000000000000000000000000000000000000000000000000028431100381910000000000000000000481910000400000000000000000000000000000068191000090000000101000000000000040f1100070000000000000071191000230000000000000000000000000000000000000028431100941910000000000000000000a419100002000000000000000000000000000000b41910000d0000000101000000000000040f110007000000000000002f1c1100040000000000000000000000000000000000000028431100c41910000000000000000000d41910000100000000000000010000005075626c696350726f70436f756e7400441f10003d0000005075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0000241f1000200000004465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29000032000000000000000100000033000000031f1000210000005265666572656e64756d436f756e7400b71e10004c0000004e65787454616c6c7900000032000000000000000100000034000000851e1000320000005265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29000000581e10002d000000446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e32000000000000000100000035000000281e100030000000566f74657273466f7200000032000000000000000100000035000000ff1d100029000000566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e7449642900000032000000000000000100000036000000c01c100058000000181d1000530000006b1d100057000000c21d10003d00000050726f787900000032000000000000000100000036000000521c10004c0000009e1c10002200000044656c65676174696f6e7328543a3a4163636f756e7449642c20436f6e76696374696f6e2900000032000000000000000100000037000000021c1000500000004c6173745461626c656457617345787465726e616c000000a21b100056000000f81b10000a0000004e65787445787465726e616c28543a3a50726f706f73616c2c20566f74655468726573686f6c642932000000000000000100000038000000b41a1000560000000a1b1000550000005f1b100029000000881b10001a000000426c61636b6c69737428543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e2932000000000000000100000033000000261a1000540000007a1a10003a00000043616e63656c6c6174696f6e7300000032000000000000000100000036000000dc1910004a000000205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e2041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d6265722028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e20546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e20546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743a202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f72202d20605075626c696350726f70736020697320656d7074792e205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c69632070726f706f73616c2e2047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e000000703b1100280000009c1f1000440000003f010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f64656d6f63726163792f7372632f6c69622e72739c1f1000440000003f0100000100000076616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7744656d6f6372616379205075626c696350726f70436f756e7463616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f7744656d6f63726163792043616e63656c6c6174696f6e7370726f706f73616c207374696c6c20626c61636b6c697374656470726f706f73616c20616c7265616479206d6164656964656e74697479206d6179206e6f74207665746f20612070726f706f73616c20747769636544656d6f637261637920426c61636b6c6973746e6f2065787465726e616c2070726f706f73616c756e6b6e6f776e2070726f706f73616c616c726561647920612070726f787977726f6e672070726f78796e6f742064656c65676174656470726f706f73616c206e6f7420666f756e64756e6b6e6f776e20696e64657863616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e00000000000024221000060000000000000074f510000100000000000000000000002c221000010000000000000000000000342210000e000000000000004422100002000000000000000000000054221000020000000000000000000000642210000c00000000000000e8581000020000000000000000000000702210000100000000000000526577617264000056231000380000004f66666c696e655761726e696e670000f608110009000000821c110003000000c12210005200000013231000430000004f66666c696e65536c6173687822100049000000204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20676976656e20616e206f66666c696e652d7761726e696e6720286974206973207374696c6c2077697468696e20697473206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e20416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67204c65646765720000000000000c26100004000000000000001026100003000000000000000000000058261000110000000000000000000000e02610000a00000000000000ec261000010000000000000000000000042710000c00000000000000000000006427100006000000000000006c271000010000000000000000000000842710001700000000000000000000003c28100011000000000000002843110000000000000000000000000050281000100000000000000000000000d02810000800000000000000d8281000010000000000000000000000f02810000b000000000000000000000048291000080000000000000050291000010000000000000000000000682910000b0000000000000000000000c0291000050000000000000028431100000000000000000000000000c82910000b0000000000000000000000202a100009000000000000002c2a1000010000000000000000000000442a10000b00000000000000000000009c2a10000e00000000000000ac2a1000010000000000000000000000c42a10000b00000000000000000000001c2b10001300000000000000302b1000010000000000000000000000482b1000010000000000000000000000502b10000d0000000000000028431100000000000000000000000000602b1000080000000000000000000000a02b10001700000000000000302b1000010000000000000000000000b82b1000010000000000000000000000c02b10001100000000000000d42b1000010000000000000000000000ec2b10000100000000000000626f6e6400000000cf2e10000a000000000000009efd100023000000000000008efd100005000000000000004cfc100015000000000000002e2f10000500000000000000332f100011000000bf37100059000000183810002200000028431100000000003a381000490000002843110000000000d31911000b0000008338100035000000de19110008000000b83810001a0000002843110000000000d23810005b0000002d3910004900000028431100000000007639100041000000b739100069000000203a10005a000000fc1911000c000000626f6e645f6578747261000000000000b13710000e000000000000004cfc100015000000f6361000590000004f3710000e00000028431100000000005d371000540000002843110000000000e82d1000550000002843110000000000d31911000b0000003d2e10003a000000de19110008000000dc36100010000000fc1911000c000000756e626f6e640000000000008efd100005000000000000004cfc10001500000007331000550000005c331000400000009c3310004d0000002843110000000000e9331000520000003b3410003000000028431100000000006b3410004f000000ba3410004f000000093510003f0000002843110000000000d92e100055000000284311000000000048351000260000002843110000000000d31911000b0000006e35100050000000772e100026000000be35100059000000173610005c0000007336100069000000dc36100010000000ec3610000a00000077697468647261775f756e626f6e646564000000fe3010004b0000002843110000000000493110004d00000096311000130000002843110000000000d92e1000550000002843110000000000a93110001b0000002843110000000000d31911000b000000c43110006000000024321000520000007632100033000000a93210005e0000009d2e100032000000fc1911000c00000076616c696461746500000000dd3010000500000000000000e23010001c000000a33010003a0000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000006e6f6d696e617465000000007430100007000000000000007b301000280000008b2f1000440000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b000000cf2f10004900000018301000260000003e30100036000000fc1911000c0000006368696c6c000000442f1000320000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000762f1000150000009d2e100032000000fc1911000c0000007365745f7061796565000000000000002e2f10000500000000000000332f100011000000832d10002e0000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000007365745f636f6e74726f6c6c6572000000000000cf2e10000a000000000000009efd100023000000832d10002e0000002843110000000000b12d1000370000002843110000000000e82d1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000007365745f76616c696461746f725f636f756e740000000000c5ed10000300000000000000266810000c000000632d100020000000666f7263655f6e65775f657261000000552c10004f000000a42c1000490000002843110000000000d31911000b000000988a100020000000ed2c100045000000322d100031000000fc1911000c0000007365745f6f66666c696e655f736c6173685f677261636500312c1000240000007365745f696e76756c6e657261626c657300000000000000272c10000a00000000000000ea1b110011000000f42b10003300000020536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72732053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e202d205472696767657273207468652050687261676d656e20656c656374696f6e2e20457870656e7369766520627574206e6f7420757365722d636f6e74726f6c6c65642e202d20446570656e6473206f6e2073746174653a20604f287c65646765737c202a207c76616c696461746f72737c29602e2054686520696465616c206e756d626572206f662076616c696461746f72732e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e636f6e74726f6c6c657220546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e202d20436f6e7461696e73206f6e6520726561642e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c2077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602e202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e20497420696d706c69657320202060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c20776869636820697320696e6469726563746c79202020757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360292063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e65656420746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e6365602920202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e202d204f6e6520444220656e7472792e203c2f7765696768743e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f7220207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c2062652074686520206163636f756e74207468617420636f6e74726f6c732069742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e202d20546872656520657874726120444220656e74726965732e204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e204e4f54453a20417420746865206d6f6d656e742c20746865726520617265206e6f2066696e616e6369616c207265737472696374696f6e7320746f20626f6e6420287768696368206372656174657320612062756e6368206f662073746f72616765206974656d7320666f7220616e206163636f756e74292e20496e20657373656e63652c206e6f7468696e672070726576656e7473206d616e79206163636f756e74732066726f6d207370616d6d696e6720605374616b696e67602073746f7261676520627920626f6e64696e67203120554e49542e20536565207465737420636173653a2060626f6e645f776974685f6e6f5f7374616b65645f76616c7565602e5374616b696e675374616b696e6720496e76756c6e657261626c65735374616b696e6720536c617368436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e6720526563656e746c794f66666c696e6576206973206e6f6e2d656d7074793b2071656400203b1000480000008d0a00000e0000005374616b696e67204f66666c696e65536c6173685374616b696e67205374616b657273002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000484210000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100c04410000000000000000000584210000100000000000000010000000000000060421000150000000000000000000000821c11000300000000000000000000000000000000000000000000000000000000000000284311007842100000000000000000008842100001000000000000000100000000000000904210000d00000000000000000000009d421000070000000000000000000000000000000000000000000000000000000000000028431100a44210000000000000000000b442100001000000000000000100000000000000642210000c00000000000000000000009d421000070000000000000000000000000000000000000000000000000000000000000028431100bc4210000000000000000000cc42100001000000000000000100000000000000d4421000110000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100c04410000000000000000000e842100001000000000000000100000000000000f04210000d0000000000000000000000ea1b1100110000000000000000000000000000000000000000000000000000000000000028431100184510000000000000000000004310000300000000000000010000000000000018431000060000000101000000000000561c11000c00000000000000561c11000c0000000000000000000000000000000000000028431100584310000000000000000000204310000100000000000000000000000000000028431000060000000101000000000000561c11000c000000000000002e431000290000000000000000000000000000000000000028431100584310000000000000000000684310000100000000000000000000000000000070431000050000000101000000000000561c11000c00000000000000332f10001100000000000000000000000000000000000000284311007843100000000000000000008843100001000000000000000100000000000000e01b11000a0000000101010000000000561c11000c00000000000000e23010001c0000000000000000000000000000000000000028431100904310000000000000000000a043100001000000000000000100000000000000a84310000a0000000101010000000000561c11000c00000000000000ea1b1100110000000000000000000000000000000000000028431100184510000000000000000000b443100001000000000000000100000000000000bc431000070000000101000000000000561c11000c00000000000000c3431000240000000000000000000000000000000000000028431100e84310000000000000000000f843100004000000000000000100000000000000184410000e0000000000000000000000ea1b11001100000000000000000000000000000000000000000000000000000000000000284311001845100000000000000000002844100001000000000000000100000000000000304410000a00000000000000000000003a441000080000000000000000000000000000000000000000000000000000000000000028431100c0441000000000000000000044441000010000000000000001000000000000004c441000140000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c4410000000000000000000b44210000100000000000000010000000000000060441000100000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c4410000000000000000000704410000200000000000000010000000000000080441000090000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c44100000000000000000009c44100003000000000000000100000000000000b44410000a0000000101000000000000561c11000c00000000000000821c1100030000000000000000000000000000000000000028431100c04410000000000000000000d044100002000000000000000100000000000000e04410000f0000000000000000000000ef4410002800000000000000000000000000000000000000000000000000000000000000284311001845100000000000000000002845100002000000000000000100000000000000384510000b00000000000000000000002f1c11000400000000000000000000000000000000000000000000000000000000000000284311004445100000000000000000005445100001000000000000000100000056616c696461746f72436f756e740000314c10002a0000004d696e696d756d56616c696461746f72436f756e7400000032000000000000000100000039000000e14b10005000000053657373696f6e52657761726450657262696c6c3200000000000000010000003a000000994b1000480000003200000000000000010000003b000000454b1000540000004f66666c696e65536c6173684772616365000000f74a10004e000000496e76756c6e657261626c6573000000234a100056000000794a100053000000cc4a10002b000000426f6e6465640000e3491000400000004c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0032000000000000000100000036000000924910005100000050617965650000003200000000000000010000003600000059491000390000003200000000000000010000003c00000008491000510000004e6f6d696e61746f72730000af481000590000005374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e003200000000000000010000003d000000f247100053000000454810004600000028431100000000008b4810002400000043757272656e74456c65637465640000b34710003f00000043757272656e74457261457261496e64657800009c4710001700000043757272656e7453657373696f6e52657761726443757272656e744572615265776172640f471000560000006547100037000000536c6f745374616b650000003200000000000000010000003e000000934610004c0000002843110000000000df46100030000000536c617368436f756e740000320000000000000001000000340000001f46100057000000764610001d000000526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e0032000000000000000100000035000000a345100055000000f845100027000000466f7263654e657745726100320000000000000001000000360000005c45100047000000205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202857686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e2054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e6420696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e5374616b696e672043757272656e7453657373696f6e5265776172645374616b696e672043757272656e744572615265776172645374616b696e6720466f7263654e65774572615374616b696e672043757272656e74456c6563746564804e100019000000a04e100048000000bb0100002d0000005374616b696e6720536c6f745374616b655374616b696e672043757272656e744572615374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e7468656164206f66205374616b696e672056616c696461746f727368656164206f66205374616b696e67204e6f6d696e61746f727300003f000000280000000400000040000000410000000000000000000000420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005374616b696e672053657373696f6e5265776172645374616b696e6720506179656500000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b110028000000004f10004200000060020000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f6c69622e72730000004f1000420000006002000001000000636f6e74726f6c6c657220616c726561647920706169726564737461736820616c726561647920626f6e6465646e6f74206120636f6e74726f6c6c65726e6f74206120737461736863616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b73756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d7074794c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656400a051100048000000b801000023000000a051100048000000b901000023000000795110001c0000005444110018000000ec0300000d0000003051100049000000870200001d000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f736f72742e7273617373657274696f6e206661696c65643a206d6964203c3d206c656e00000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727330511000490000009d0000003a0000003051100049000000a40000003000000054696d657374616d702055706461746554696d657374616d7020526563656e7448696e74730000004852100031000000795210004b000000790000000400000046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e7273dc52100023000000795210004b0000007a0000000400000046696e616c697a6564206865696768742061626f766520626c6f636b206e756d626572002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72734765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e74206461746154696d657374616d7020496e697469616c697a656454696d657374616d70204f72646572656448696e747354696d657374616d70204d656469616e54696d657374616d702057696e646f7753697a65616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656400005754100043000000795210004b000000b2000000040000000053100048000000870a00000a00000054696d657374616d70205265706f72744c6174656e63797072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b20716564000000000000c85410000a00000000000000d4541000010000000000000000000000ec541000020000000000000066696e616c5f68696e740000000000005972100004000000000000006dfc100017000000fc5410003d000000395510001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e73746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c6964207479706576616c69646174696f6e206572726f7200b05510007c0000002c561000480000007a00000006000000657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f6d6f642e727300000000245710000b0000000000000028a4100002000000000000000000000030571000010000000000000000000000385710001000000000000000ece6100001000000000000000000000048571000010000000000000000000000505710000c0000000000000064a410000100000000000000000000005c571000010000000000000000000000645710000e0000000000000074571000020000000000000000000000845710000100000000000000566f746572526561706564004058100015000000426164526561706572536c6173686564315810000f00000054616c6c7953746172746564f45710003d00000054616c6c7946696e616c697a65640000e65710000e000000e65710000e0000008c5710005a00000020412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e5665633c4163636f756e7449643e20412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c2072656170657200000000000000dc5810000a00000000000000e8581000020000000000000000000000f8581000010000000000000000000000005910000d00000000000000ece6100001000000000000000000000010591000010000000000000000000000f4a310000800000000000000185910000400000000000000000000003859100001000000000000004e65774163636f756e740000f6081100090000005bf6100007000000835910001b0000005265617065644163636f756e740000006c59100017000000f608110009000000f6081100090000005bf61000070000005bf6100007000000405910002c000000205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e416c69766520636f6e7472616374206f7220746f6d6273746f6e6520616c726561647920657869737473647572696e6720657865637574696f6e703b110028000000f05910004c0000005f000000080000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f72756e74696d652e727376657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e7442616c616e63657320546f74616c49737375616e636542616c616e636573204578697374656e7469616c4465706f73697442616c616e636573205472616e73616374696f6e4261736546656542616c616e636573205472616e73616374696f6e42797465466565436f756e63696c205265676973746572496e666f4f6642616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e6365436f756e63696c20416374697665436f756e63696c42616c616e636573204c6f636b73616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f776564f05b10004300000055010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f62616c616e6365732f7372632f6c69622e7273004c5c1000330000007f5c10004a000000ad00000005000000636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6163636f756e745f64622e7273707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a09090909716564000000000000f46010000d00000000000000046110000300000000000000000000004c6110001800000000000000000000000c6210001300000000000000046110000300000000000000000000002062100006000000000000000000000050621000130000000000000064621000040000000000000000000000c46210000c0000000000000000000000246310000d00000000000000346310000100000000000000000000004c6310000a00000000000000000000009c6310001000000000000000ac631000010000000000000000000000c46310000d00000000000000000000002c6410000e000000000000003c64100003000000000000000000000084641000080000000000000000000000c46410001100000000000000d8641000010000000000000000000000f0641000030000000000000000000000086510000d0000000000000018651000010000000000000000000000306510000400000000000000000000005065100019000000000000006c651000010000000000000000000000846510000200000000000000000000009465100011000000000000006c651000010000000000000000000000a865100002000000000000007365745f617070726f76616c73000000000000004b72100005000000000000005072100009000000000000000b0f110005000000000000003469100012000000000000005972100004000000000000005d72100008000000196e100058000000cd6d1000100000002843110000000000716e100030000000a16e10004a0000002843110000000000eb6e100035000000206f100051000000716f10002c0000009d6f100053000000f06f1000620000005270100060000000b27010001d000000cf70100057000000267110003500000028431100000000005b7110006b000000c67110001d0000002843110000000000d31911000b000000de19110008000000e3711000270000000a72100041000000fc1911000c00000070726f78795f7365745f617070726f76616c7300686d100065000000cd6d1000100000002843110000000000d31911000b000000dd6d10003c000000fc1911000c000000726561705f696e6163746976655f766f74657200000000003f6d10000e00000000000000266810000c000000000000006367100003000000000000009efd100023000000000000004d6d10000900000000000000266810000c00000000000000566d100012000000000000003469100012000000de6b100058000000366c10005c000000926c1000280000002843110000000000ba6c1000450000002843110000000000ff6c1000400000002843110000000000d31911000b000000de19110008000000b76b100027000000fc1911000c000000726574726163745f766f746572000000000000000b0f11000500000000000000266810000c000000db6a10004b0000002843110000000000266b1000420000002843110000000000686b10004f0000002843110000000000d31911000b000000de19110008000000b76b100027000000fc1911000c0000007375626d69745f63616e64696461637900000000d76a10000400000000000000266810000c000000466910001e000000284311000000000064691000440000002843110000000000a869100048000000f069100051000000416a10004c0000008d6a10001e0000002843110000000000d31911000b000000ab6a100018000000c36a100014000000fc1911000c00000070726573656e745f77696e6e65720000000000002669100009000000000000009efd100023000000000000002f69100005000000000000004cfc100015000000000000000b0f11000500000000000000346910001200000032681000590000008b68100068000000f36810001e0000002843110000000000d31911000b000000116910001500000093fb100011000000fc1911000c0000007365745f646573697265645f7365617473000000000000007a6610000500000000000000266810000c0000006667100059000000bf67100052000000116810001500000072656d6f76655f6d656d626572000000000000006367100003000000000000009efd1000230000007f6610004c0000002843110000000000cb6610004800000013671000500000007365745f70726573656e746174696f6e5f6475726174696f6e000000000000007a66100005000000000000006dfc10001700000024661000560000000c661000180000007365745f7465726d5f6475726174696f6e000000b8651000540000000c6610001800000020536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722066726f6d2074686520636f756e63696c2e20546869732069732065666665637469766520696d6d6564696174656c792e204e6f74653a20412074616c6c792073686f756c642068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e436f6d706163743c7533323e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e28296020607369676e6564602073686f756c642068617665206174206c65617374202d204f28766f746572732920636f6d707574652e63616e646964617465746f74616c436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e204e4f54453a20696620606f726967696e602068617320616c72656164792061737369676e656420617070726f76616c7320766961205b607365745f617070726f76616c73605d2c2069742077696c6c204e4f54206861766520616e7920757361626c652066756e647320746f20706173732063616e64696461637920626f6e6420616e64206d75737420666972737420726574726163742e204e6f746520746861742073657474696e6720617070726f76616c732077696c6c206c6f636b2074686520656e746972652062616c616e6365206f662074686520766f74657220756e74696c2072657472616374696f6e206f72206265696e67207265706f727465642e202d20496e646570656e64656e74206f6620696e7075742e202d205468726565204442206368616e6765732e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2054686520696e646578206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e20416c736f2072656d6f76657320746865206c6f636b206f6e207468652062616c616e6365206f662074686520766f7465722e20536565205b60646f5f7365745f617070726f76616c732829605d2e202d2054776f20666577657220444220656e74726965732c206f6e65204442206368616e67652e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e20426f746820696e6469636573206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e202d2053616d6520617320607365745f617070726f76616c73602077697468206f6e65206164646974696f6e616c2073746f7261676520726561642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473204c6f636b732074686520746f74616c2062616c616e6365206f662063616c6c657220696e646566696e6974656c792e204f6e6c79205b60726574726163745f766f746572605d206f72205b60726561705f696e6163746976655f766f746572605d2063616e20756e6c6f636b207468652062616c616e63652e206068696e746020617267756d656e7420697320696e74657270726574656420646966666572656e746c79206261736564206f6e3a202d20696620606f726967696e602069732073657474696e6720617070726f76616c7320666f72207468652066697273742074696d653a2054686520696e6465782077696c6c20626520636865636b656420666f72206265696e6720612076616c6964205f686f6c655f20696e2074686520766f746572206c6973742e2020202d206966207468652068696e7420697320636f72726563746c7920706f696e74696e6720746f206120686f6c652c206e6f206665652069732064656475637465642066726f6d20606f726967696e602e2020202d204f74686572776973652c207468652063616c6c2077696c6c2073756363656564206275742074686520696e6465782069732069676e6f72656420616e642073696d706c792061207075736820746f20746865206c617374206368756e6b2020207769746820667265652073706163652068617070656e732e20496620746865206e65772070757368206361757365732061206e6577206368756e6b20746f20626520637265617465642c20612066656520696e646963617465642062792020205b60566f74696e67466565605d2069732064656475637465642e202d20696620606f726967696e6020697320616c7265616479206120766f7465723a2074686520696e646578205f5f6d7573745f5f2062652076616c696420616e6420706f696e7420746f2074686520636f727265637420706f736974696f6e206f662074686520606f726967696e6020696e207468652063757272656e7420766f74657273206c6973742e204e6f7465207468617420616e7920747261696c696e67206066616c73656020766f74657320696e2060766f746573602069732069676e6f7265643b20496e20617070726f76616c20766f74696e672c206e6f7420766f74696e6720666f7220612063616e64696461746520616e6420766f74696e672066616c73652c2061726520657175616c2e202d2054776f20657874726120444220656e74726965732c206f6e65204442206368616e67652e202d20417267756d656e742060766f74657360206973206c696d6974656420696e206c656e67746820746f206e756d626572206f662063616e646964617465732e766f7465735665633c626f6f6c3e68696e74536574496e646578436f756e63696c00000000547a10000d0000000000000000000000c30011000c0000000000000000000000000000000000000000000000000000000000000028431100647a10000000000000000000747a1000010000000000000001000000000000007c7a10000a0000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311004c9310000000000000000000887a100001000000000000000100000000000000907a1000090000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311004c93100000000000000000009c7a100001000000000000000100000000000000a47a1000140000000000000000000000c30011000c0000000000000000000000000000000000000000000000000000000000000028431100b87a10000000000000000000c87a100001000000000000000100000000000000d07a10000a0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100dc7a10000000000000000000ec7a100001000000000000000100000000000000f47a1000140000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100587b10000000000000000000087b100001000000000000000100000000000000107b1000130000000000000000000000237b10000900000000000000000000000000000000000000000000000000000000000000284311002c7b100000000000000000003c7b1000020000000000000001000000000000004c7b10000c0000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100587b10000000000000000000687b100001000000000000000100000000000000707b10000c0000000000000000000000e30011000e00000000000000000000000000000000000000000000000000000000000000284311007c7b100000000000000000008c7b100001000000000000000100000000000000947b10000c0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000a07b100001000000000000000100000000000000a87b10000a0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100b47b10000000000000000000c47b100004000000000000000100000000000000e47b10000d0000000000000000000000f17b10002300000000000000000000000000000000000000000000000000000000000000284311006c7d10000000000000000000147c100004000000000000000100000000000000347c1000090000000000000000000000237b1000090000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000407c100001000000000000000100000000000000487c10000b0000000101000000000000537c100018000000000000006b7c10001100000000000000000000000000000000000000284311006c7d100000000000000000007c7c100005000000000000000100000000000000a47c10000e0000000101000000000000561c11000c00000000000000b27c1000100000000000000000000000000000000000000028431100c09210000000000000000000c47c100002000000000000000000000000000000d47c10000b0000000101000000000000561c11000c00000000000000df7c1000170000000000000000000000000000000000000028431100f87c10000000000000000000087d100001000000000000000000000000000000107d10000600000001010000000000005d7210000800000000000000167d10001900000000000000000000000000000000000000284311006c7d10000000000000000000307d100001000000000000000100000000000000387d10000c00000000000000000000005d721000080000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000447d1000010000000000000001000000000000004c7d10000a00000000000000000000005d721000080000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000587d100001000000000000000100000000000000607d10000a0000000000000000000000ea1b11001100000000000000000000000000000000000000000000000000000000000000284311006c7d100000000000000000007c7d100001000000000000000100000000000000847d10000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000a47d100001000000000000000100000000000000ac7d10000c0000000000000000000000b87d1000280000000000000000000000000000000000000000000000000000000000000028431100e07d10000000000000000000f07d100001000000000000000000000000000000f87d10000b0000000000000000000000037e1000210000000000000000000000000000000000000000000000000000000000000028431100247e10000000000000000000347e100002000000000000000000000043616e646964616379426f6e6400000032000000000000000100000043000000f586100041000000566f74696e67426f6e640000b386100042000000566f74696e674665650000004c8610006700000050726573656e74536c617368506572566f7465723200000000000000010000004400000009861000430000004361727279436f756e74000032000000000000000100000045000000bc8510004d00000050726573656e746174696f6e4475726174696f6e6d8510004f000000496e6163746976654772616365506572696f64566f7465496e64657832000000000000000100000046000000f1841000680000005985100014000000566f74696e67506572696f6432000000000000000100000047000000c38410002e0000005465726d4475726174696f6e320000000000000001000000480000009d84100026000000446573697265645365617473638410003a0000004465636179526174696f000032000000000000000100000049000000388310004d000000858310003b000000c08310005b0000001b84100048000000416374697665436f756e63696c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e0b8210005b000000668210005c000000c28210005c0000001e8310001a000000566f7465436f756e74000000c481100047000000417070726f76616c734f6628543a3a4163636f756e7449642c20536574496e646578295665633c417070726f76616c466c61673eaf8010006800000028431100000000001781100059000000284311000000000070811000540000005265676973746572496e666f4f6628566f7465496e6465782c207533322900003a8010005f0000009980100016000000566f746572496e666f4f66566f746572496e666f3c42616c616e63654f663c543e3e0000320000000000000001000000360000001980100021000000566f746572735665633c4f7074696f6e3c543a3a4163636f756e7449643e3e00d67f1000430000004e657874566f746572536574977f10003f000000566f746572436f756e7400007d7f10001a00000043616e64696461746573000032000000000000000100000035000000617f10001c00000043616e646964617465436f756e740000320000000000000001000000340000003d7f1000240000004e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e2932000000000000000100000033000000f57e1000480000004c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e32000000000000000100000033000000447e100067000000ab7e10004a0000002047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e2054686520666972737420656c656d656e742069732074686520776569676874206f66206561636820656e7472793b204974206d617920626520746865206469726563742073756d6d656420617070726f76616c207374616b65732c206f7220612077656967687465642076657273696f6e206f662069742e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e2043757272656e74206e756d626572206f66206163746976652063616e64696461746573205468652070726573656e742063616e646964617465206c6973742e2043757272656e74206e756d626572206f6620566f746572732e20746865206e65787420667265652073657420746f2073746f7265206120766f74657220696e2e20546869732077696c6c206b6565702067726f77696e672e205468652070726573656e7420766f746572206c69737420286368756e6b656420616e6420636170706564206174205b60564f5445525f5345545f53495a45605d292e20426173696320696e666f726d6174696f6e2061626f7574206120766f7465722e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722e2054686520766f746573206172652073746f726564206173206e756d657269632076616c75657320616e642070617273656420696e2061206269742d77697365206d616e6e65722e20496e206f7264657220746f2067657420612068756d616e2d7265616461626c6520726570726573656e746174696f6e2028605665633c626f6f6c3e60292c20757365205b60616c6c5f617070726f76616c735f6f66605d2e20467572746865726d6f72652c206561636820766563746f72206f66207363616c617273206973206368756e6b656420776974682074686520636170206f662060415050524f56414c5f5345545f53495a45602e2054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e20446563617920666163746f72206f6620776569676874207768656e206265696e6720616363756d756c617465642e2049742073686f756c64207479706963616c6c792062652073657420746f205f5f6174206c656173745f5f2060636f756e63696c5f73697a65202d316020746f206b6565702074686520636f756e63696c207365637572652e205768656e2073657420746f20604e602c20697420696e64696361746573206028312f4e295e7460206f66207374616b656420697320646563617965642061742077656967687420696e6372656d656e742073746570206074602e20302077696c6c20726573756c7420696e206e6f20776569676874206265696e6720616464656420617420616c6c20286e6f726d616c20617070726f76616c20766f74696e67292e204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206d616e7920766f746520696e6469636573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e2054686520616d6f756e74206f662066656520706169642075706f6e206561636820766f7465207375626d697373696f6e2c20756e6c6573732069662074686579207375626d69742061205f686f6c655f20696e64657820616e64207265706c6163652069742e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e00000000000090871000080000000000000098871000020000000000000000000000c8871000170000000000000000000000808810000b000000000000008c881000030000000000000000000000d48810000d000000000000007472616e736665720000000025ad100004000000000000009efd100023000000000000008efd10000500000000000000f18a100013000000108b1000360000002843110000000000468b100042000000888b100048000000d08b100045000000158c10002d0000002843110000000000428c1000460000002843110000000000d31911000b000000888c10004c000000d48c100033000000078d10005a0000002843110000000000618d1000130000002843110000000000748d100054000000c88d10004b000000138e100035000000488e1000370000007f8e1000560000002843110000000000fc1911000c0000007365745f62616c616e636500000000006367100003000000000000009efd10002300000000000000e98a10000800000000000000f18a10001300000000000000048b10000c00000000000000f18a1000130000003c8910002500000028431100000000006189100048000000a989100042000000eb89100046000000318a10003a00000028431100000000006b8a10002d0000002843110000000000d31911000b000000988a100020000000b88a100031000000fc1911000c00000020536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e6e65775f66726565436f6d706163743c543a3a42616c616e63653e6e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c2074726967676572202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e42616c616e6365732056657374696e6742616c616e63657300000000000000609210000d00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c93100000000000000000007892100001000000000000000100000000000000809210001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c9310000000000000000000949210000100000000000000010000000000000018bc10000b00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000024bc1000010000000000000001000000000000002cbc10000b00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000038bc10000100000000000000010000000000000040bc10001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000054bc1000010000000000000001000000000000005cbc10001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000080bc1000010000000000000001000000000000009c921000070000000101000000000000561c11000c00000000000000a39210001b0000000000000000000000000000000000000028431100c09210000000000000000000d092100001000000000000000000000000000000d89210000b0000000101000000000000561c11000c000000000000006d9210000a00000000000000000000000000000000000000284311004c9310000000000000000000e49210000b0000000000000001000000000000003c9310000f0000000101000000000000561c11000c000000000000006d9210000a00000000000000000000000000000000000000284311004c93100000000000000000005c9310000b000000000000000100000000000000b4931000050000000101000000000000561c11000c00000000000000b99310002c0000000000000000000000000000000000000028431100e89310000000000000000000f8931000010000000000000001000000546f74616c49737375616e6365543a3a42616c616e6365005e991000260000004578697374656e7469616c4465706f7369740000299910003500000056657374696e6756657374696e675363686564756c653c543a3a42616c616e63653e000032000000000000000100000036000000f3981000360000004672656542616c616e63650079961000270000002843110000000000a096100050000000f09610005d0000004d97100055000000a29710004f000000f197100051000000429810001500000028431100000000005798100057000000ae98100045000000526573657276656442616c616e6365003200000000000000010000003e0000002e9410005d0000008b941000270000002843110000000000b29410005b0000000d951000490000002843110000000000569510005d000000b39510002d0000002843110000000000e09510005300000033961000460000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00000032000000000000000100000035000000009410002e00000020416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e20546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e436f756e63696c20566f74696e67506572696f64f09b100039000000a09b100048000000100200002d000000436f756e63696c20446573697265645365617473436f756e63696c204e65787446696e616c697a65436f756e63696c205465726d4475726174696f6e309b100048000000870a00000a000000809b100019000000a09b100048000000bb0100002d000000436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c204361727279436f756e74436f756e63696c204c6561646572626f617264000000309b1000480000008d0a00000e000000436f756e63696c2043616e64696461746573436f756e63696c2043616e646964617465436f756e74436f756e63696c20566f7465436f756e74436f756e63696c2043616e646964616379426f6e64436f756e63696c20566f746572496e666f4f6647757275206d656469746174696f6e66696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e436f756e63696c20417070726f76616c734f66436f756e63696c20566f7465727300002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f6e6f7420656e6f75676820667265652066756e64730000703b110028000000f05b1000430000005501000001000000703b110028000000709c10004400000098000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f73656174732e7273709c100044000000980000000100000042616c616e636573204372656174696f6e46656542616c616e636573205472616e73666572466565676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c75656e6f7420612070726f787963616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572696e76616c6964207265706f7274657220696e646578766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665436f756e63696c20496e6163746976654772616365506572696f64696e76616c69642074617267657420696e646578626164207265706f7274657220696e6465786261642074617267657420696e646578436f756e63696c20566f74696e67426f6e6472657472616374696f6e20696e646578206d69736d6174636872657472616374696f6e20696e64657820696e76616c696463616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f7465726475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e64737374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f63616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e746c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647370726573656e7465642063616e646964617465206d7573742062652063757272656e7463616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c6563746564436f756e63696c204465636179526174696f6475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c436f756e63696c2050726573656e74536c617368506572566f746572436f756e63696c20566f746572436f756e746e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e64696461746573696e76616c696420766f74657220696e64657877726f6e6720766f74657220696e6465786e657720766f746572206d75737420686176652073756666696369656e742066756e647320746f207061792074686520626f6e64436f756e63696c204e657874566f746572536574436f756e63696c20566f74696e67466565000014a210001d000000b831110013000000db03000009000000617373657274696f6e206661696c65643a20696e646578203c206c656e00000050a2100043000000ce0a0000250000000000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962616c6c6f632f7665632e72730050a2100043000000d40a00002c000000746f6f206d616e7920696e737472756374696f6e73436f6e7472616374204163636f756e74436f756e746572436f6e74726163742053746f7261676553697a654f6666736574000000000000f4a310000800000000000000fca3100003000000000000000000000014a410000100000000000000000000001ca410000c0000000000000028a4100002000000000000000000000038a4100001000000000000000000000040a410000a00000000000000180711000100000000000000000000004ca4100001000000000000000000000054a410000f0000000000000064a410000100000000000000000000006ca4100001000000000000000000000074a410000a0000000000000080a4100002000000000000000000000090a41000020000000000000000000000a0a410000800000000000000a8a41000020000000000000000000000b8a4100001000000000000005472616e73666572f608110009000000f6081100090000005bf6100007000000e3a5100055000000496e7374616e746961746564f608110009000000f608110009000000aca5100037000000436f646553746f72656400007ea510002e0000005363686564756c655570646174656400821c1100030000004ea5100030000000446973706174636865640000f6081100090000002f1c110004000000e3a410004e00000031a510001d000000436f6e7472616374f608110009000000181a110007000000c0a410002300000020416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e44656164206f7220696e6578697374656e74206163636f756e7420686173206265656e206578656d70742061626f76653b2071656464656661756c743a436f6e7472616374204761735370656e74436f6e747261637420426c6f636b4761734c696d6974436f6e747261637420436f6e7472616374496e666f4f66436f6e7472616374204761735072696365436f6e74726163742052656e7442797465466565436f6e747261637420546f6d6273746f6e654465706f736974436f6e74726163742052656e744465706f7369744f6666736574436f6e7472616374205472616e73616374696f6e42617365466565436f6e7472616374205472616e73616374696f6e4279746546656500000054a710004300000058010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6c69622e72730000000000a0a810000f00000000000000b0a81000010000000000000000000000c8a81000030000000000000000000000e0a810000800000000000000e8a8100002000000000000000000000018a9100002000000000000000000000027221100040000000000000028a9100004000000000000000000000088a91000070000000000000000000000c0a910000600000000000000c8a9100004000000000000000000000028aa10000a000000000000000000000078aa10000f0000000000000088aa1000020000000000000000000000b8aa1000050000000000000000000000e0aa10000a00000000000000ecaa10000400000000000000000000004cab100006000000000000007570646174655f7363686564756c6500000000006eb31000080000000000000076b3100010000000feb210002d00000028431100000000002bb31000430000007075745f636f646500000000bdb010000900000000000000c6b010000f00000000000000fab210000400000000000000181a1100070000006eb2100057000000c5b21000350000000000000025ad100004000000000000009efd100023000000000000008efd100005000000000000004cfc10001500000000000000bdb010000900000000000000c6b010000f00000000000000d5b010000400000000000000181a110007000000d9b010004200000028431100000000001bb110004a00000065b110002c00000091b1100046000000d7b110005200000029b2100045000000637265617465000000000000b4b0100009000000000000004cfc10001500000000000000bdb010000900000000000000c6b010000f0000000000000029ad1000090000000000000032ad10000b00000000000000d5b010000400000000000000181a1100070000009dae10006a000000284311000000000007af100021000000284311000000000028af10005000000078af100041000000b9af10005b00000014b01000570000006bb010002a00000095b010001f000000636c61696d5f737572636861726765000000000025ad10000400000000000000561c11000c000000000000007fae10000a0000000000000089ae10001400000065ad10005c000000c1ad100045000000284311000000000006ae10004e00000054ae10002b000000726573746f72655f746f00000000000025ad10000400000000000000561c11000c0000000000000029ad1000090000000000000032ad10000b000000000000003dad10000e00000000000000c30011000c000000000000004bad1000050000000000000050ad1000150000007cab1000400000002843110000000000bcab10006f0000002bac10004e00000079ac100064000000ddac10004800000020416c6c6f7773206120636f6e747261637420746f20726573746f7265206120746f6d6273746f6e6520627920676976696e67206974732073746f726167652e2054686520636f6e747261637420746861742077616e747320746f20726573746f72652028692e652e206f726967696e206f66207468652063616c6c2c206f7220606d73672e73656e6465726020696e20536f6c6964697479207465726d73292077696c6c20636f6d70757465206120746f6d6273746f6e652077697468206974732073746f7261676520616e642074686520676976656e20636f64655f686173682e2049662074686520636f6d707574656420746f6d6273746f6e65206d61746368207468652064657374696e6174696f6e206f6e652c207468652064657374696e6174696f6e20636f6e747261637420697320726573746f7265642077697468207468652072656e745f616c6c6f77616e636560207370656369666965642c207768696c6520746865206f726967696e2073656e647320616c6c206974732066756e647320746f207468652064657374696e6174696f6e20616e642069732072656d6f7665642e64657374636f64655f68617368436f6465486173683c543e72656e745f616c6c6f77616e636564656c74615665633c657865633a3a53746f726167654b65793e20416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f6475636572206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e20496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e6175785f73656e6465724f7074696f6e3c543a3a4163636f756e7449643e20437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e746761735f6c696d6974436f6d706163743c543a3a4761733e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c653c543a3a4761733e00000000000018bb1000130000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110000be100000000000000000002cbb1000040000000000000001000000000000004cbb1000100000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc100000000000000000005cbb10000100000000000000010000000000000064bb1000110000000000000000000000821c110003000000000000000000000000000000000000000000000000000000000000002843110078bb1000000000000000000088bb10000200000000000000010000000000000098bb10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc10000000000000000000a4bb100001000000000000000100000000000000acbb1000110000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc10000000000000000000c0bb100007000000000000000100000000000000f8bb10000f0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000008bc10000200000000000000010000000000000018bc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000024bc1000010000000000000001000000000000002cbc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000038bc10000100000000000000010000000000000040bc1000120000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000054bc1000010000000000000001000000000000005cbc1000120000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000080bc10000100000000000000010000000000000088bc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110094bc10000000000000000000a4bc100001000000000000000100000000000000acbc10000b0000000000000000000000b7bc1000060000000000000000000000000000000000000000000000000000000000000028431100c0bc10000000000000000000d0bc100001000000000000000100000000000000d8bc10000d0000000000000000000000b7bc1000060000000000000000000000000000000000000000000000000000000000000028431100e8bc10000000000000000000f8bc10000100000000000000010000000000000000bd1000080000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110008bd1000000000000000000018bd10000100000000000000010000000000000020bd1000080000000000000000000000821c110003000000000000000000000000000000000000000000000000000000000000002843110028bd1000000000000000000038bd10000100000000000000010000000000000040bd10000d0000000000000000000000b7bc100006000000000000000000000000000000000000000000000000000000000000002843110050bd1000000000000000000060bd10000100000000000000010000000000000068bd1000080000000000000000000000b7bc100006000000000000000000000000000000000000000000000000000000000000002843110000be1000000000000000000070bd10000100000000000000010000000000000078bd10000f000000000000000000000076b3100010000000000000000000000000000000000000000000000000000000000000002843110088bd1000000000000000000098bd100001000000000000000100000000000000a0bd10000c000000010100000000000032ad10000b00000000000000181a1100070000000000000000000000000000000000000028431100d8bd10000000000000000000acbd100001000000000000000000000000000000b4bd10000b000000010100000000000032ad10000b00000000000000bfbd1000160000000000000000000000000000000000000028431100d8bd10000000000000000000e8bd100001000000000000000000000000000000f0bd10000e000000000000000000000095d1100003000000000000000000000000000000000000000000000000000000000000002843110000be1000000000000000000010be10000100000000000000010000000000000018be10000e0000000101000000000000561c11000c0000000000000026be10000f000000000000000000000000000000000000002843110038be1000000000000000000048be10000100000000000000000000005369676e6564436c61696d48616e6469636170002ec4100038000000284311000000000066c4100042000000a8c410001a000000546f6d6273746f6e654465706f736974f9c310003500000053746f7261676553697a654f66667365740000003200000000000000010000003400000080c310004b000000cbc310002e00000052656e74427974654665650033c310004d00000052656e744465706f7369744f6666736574000000bbc1100041000000fcc1100016000000284311000000000012c210005a0000006cc2100056000000c2c210005300000015c310001e0000005375726368617267655265776172640068c1100039000000a1c110001a0000005472616e736665724665650043c11000250000004372656174696f6e466565001cc11000270000005472616e73616374696f6e426173654665650000e5c01000370000005472616e73616374696f6e4279746546656500003200000000000000010000003e000000a2c0100043000000436f6e7472616374466565003200000000000000010000004a00000072c010003000000043616c6c42617365466565543a3a4761730000003200000000000000010000004b00000040c0100032000000437265617465426173654665650000003200000000000000010000004c00000012c010002e000000476173507269636532000000000000000100000044000000f4bf10001e0000004d617844657074683200000000000000010000004d000000c2bf100032000000426c6f636b4761734c696d69740000003200000000000000010000004e00000086bf10003c0000004761735370656e7466bf10002000000043757272656e745363686564756c65003200000000000000010000004f00000041bf1000250000005072697374696e65436f6465e8be100059000000436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c65000000320000000000000001000000360000008fbe1000590000004163636f756e74436f756e7465720000320000000000000001000000500000007abe100015000000436f6e7472616374496e666f4f66436f6e7472616374496e666f3c543e0000003200000000000000010000003300000050be10002a0000002054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20546865207375627472696520636f756e7465722e2041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e20546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e20546865207072696365206f66206f6e6520756e6974206f66206761732e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c656420746f2072656d6f76616c206f66206120636f6e74726163742e2054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f66667365742074686520636f7374206f66206f6e6520627974652e204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e20427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c207468656e20697420776f756c6420706179203530302042552f6461792e205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e2053697a65206f66206120636f6e7472616374206174207468652074696d65206f66206372656174696f6e2e205468697320697320612073696d706c652077617920746f20656e73757265207468617420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e20546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e205768656e20636c61696d2073757263686167652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b656420666f722063757272656e745f626c6f636b202d2064656c6179436f6e747261637420436f646553746f72616765636f6465206973206e6f7420666f756e64436f6e7472616374205072697374696e65436f64657072697374696e6520636f6465206973206e6f7420666f756e64000067c710001e00000085c710001f00000066756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2071656466756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2066756e6374696f6e5f73656374696f6e5f6c656e203d3d20636f64655f73656374696f6e5f6c656e3b2071656400004dc710001a00000028c710000a00000032c710001b00000073746172742066756e6374696f6e20657870656374656420746f20686176652074797065205b5d202d3e205b5d00000080c610001100000060c610002000000040c610002000000018c61000280000007365676d656e74206f66667365742073686f756c642072657475726e20493332746f6f206d616e79206d656d6f727920726567696f6e7320696e20696e6465782073706163653a20746f6f206d616e79207461626c657320696e20696e6465782073706163653a20747279696e6720746f20696d706f7274206d757461626c6520676c6f62616c206475706c6963617465206578706f727420000000acc610001c000000c8c610005a0000004d0000002800000048617368207461626c65206361706163697479206f766572666c6f772f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6861736862726f776e2d302e312e382f7372632f7261772f6d6f642e72730000ffffffff46756e6374696f6e20232072656164696e672f76616c69646174696f6e206572726f723a204d697373696e6720626f647920666f722066756e6374696f6e206c656e677468206f662066756e6374696f6e2073656374696f6e206973202c207768696c65206c656e206f6620636f64652073656374696f6e20697320703b11002800000054a71000430000005801000001000000436f6e74726163742043757272656e745363686564756c656e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e747468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f6465436f6e7472616374205369676e6564436c61696d48616e6469636170436f6e747261637420537572636861726765526577617264496e76616c69642073757263686172676520636c61696d3a206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e7443616e6e6f7420726573746f72652066726f6d20696e6578697374696e67206f7220746f6d6273746f6e6520636f6e74726163744f726967696e20547269654964207772697474656e20696e207468652063757272656e7420626c6f636b546f6d6273746f6e657320646f6e2774206d6174636843616e6e6f7420726573746f726520746f20696e6578697374696e67206f7220616c69766520636f6e7472616374436f6e7472616374204d61784465707468436f6e747261637420436f6e7472616374466565436f6e7472616374204372656174696f6e466565436f6e7472616374205472616e73666572466565436f6e74726163742043616c6c42617365466565436f6e7472616374204372656174654261736546656552657475726e207479706573206c656e6774682073686f756c642062652030206f722031626164206f726967696e3a20657870656374656420746f206265206e6f206f726967696e626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e64657854696d657374616d702044696455706461746553797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e7369637357656967687400f0ca10002b0000001bcb100044000000f70000000400000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74696d657374616d702f7372632f6c69622e727353797374656d2045787472696e73696344617461008ccb1000300000001bcb100044000000e10000000400000054696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636bd4cb10004e0000001bcb100044000000e20000000400000054696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f7753797374656d204e756d62657253797374656d2045787472696e73696373526f6f7454696d657374616d7020426c6f636b506572696f6454696d657374616d70204d696e696d756d506572696f6453797374656d2044696765737453797374656d20426c6f636b4861736853797374656d204163636f756e744e6f6e6365000000d0cc100019000000f0cc100048000000bb0100002d0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b11002800000050cd100041000000c3000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f73797374656d2f7372632f6c69622e727300000050cd100041000000c30000000100000054696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e74206461746173657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a090909716564000000703b110028000000983b110050000000370100000900000053797374656d20506172656e744861736853797374656d2052616e646f6d4d6174657269616c0000f0ce1000480000008d0a00000e00000053797374656d204576656e747353797374656d204576656e74436f756e7453797374656d204576656e74546f706963730000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000014d0100006000000000000001cd0100001000000000000000000000034d010000100000000000000000000003cd010000e000000000000004cd0100001000000000000000000000064d010000100000000000000000000006cd01000080000000000000074d010000100000000000000000000008cd0100001000000000000000000000094d010000b00000000000000a0d01000010000000000000000000000b8d01000010000000000000000000000c0d010000c00000000000000ccd01000010000000000000000000000e4d01000010000000000000072656d61726b000000000000b3d110000700000000000000181a11000700000098d110001b0000007365745f686561705f706167657300000000000090d11000050000000000000095d110000300000051d110003f0000007365745f636f646500000000c5ed10000300000000000000181a1100070000003fd11000120000007365745f73746f7261676500000000002dd11000050000000000000032d110000d00000012d110001b0000006b696c6c5f73746f7261676500000000081a110004000000000000000ad1100008000000ecd010001e000000204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e5665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573753634204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b53797374656d0000000038d610000c0000000101000000000000561c11000c0000000000000044d6100008000000000000000000000000000000000000002843110084e1100000000000000000004cd610000100000000000000010000000000000054d610000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100a8e11000000000000000000064d61000010000000000000000000000000000006cd61000130000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100a8e11000000000000000000080d610000100000000000000000000000000000088d61000090000000101000000000000e30011000e00000000000000040f110007000000000000000000000000000000000000002843110038d71000000000000000000094d61000010000000000000001000000000000009cd610000d0000000101000000000000821c11000300000000000000181a1100070000000000000000000000000000000000000028431100acd610000000000000000000bcd6100001000000000000000100000000000000c4d610000e0000000000000000000000d2d61000120000000000000000000000000000000000000000000000000000000000000028431100e4d610000000000000000000f4d610000200000000000000010000000000000004d71000060000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110084e1100000000000000000000cd710000100000000000000010000000000000014d710000a0000000000000000000000040f110007000000000000000000000000000000000000000000000000000000000000002843110038d71000000000000000000020d710000100000000000000010000000000000028d710000e0000000000000000000000040f110007000000000000000000000000000000000000000000000000000000000000002843110038d71000000000000000000048d710000100000000000000010000000000000050d7100006000000000000000000000056d710000b000000000000000000000000000000000000000000000000000000000000002843110064d71000000000000000000074d71000010000000000000001000000000000007cd7100006000000000000000000000082d71000230000000000000000000000000000000000000000000000000000000000000028431100a8d710000000000000000000b8d7100001000000000000000100000000000000c0d710000a0000000000000000000000cad710000a0000000000000000000000000000000000000000000000000000000000000028431100d4d710000000000000000000e4d7100001000000000000000100000000000000ecd710000b0000000201010000000000f7d710000200000000000000040f11000700000000000000f9d710002100000000000000284311001cd8100000000000000000002cd810000d00000000000000010000004163636f756e744e6f6e6365543a3a496e64657815de10001f00000045787472696e736963436f756e740000e7dd10002e000000416c6c45787472696e7369637357656967687400a2dd100045000000426c6f636b486173680000007cdd10002600000045787472696e73696344617461000000320000000000000001000000350000002ddd10004f00000052616e646f6d4d6174657269616c2869382c205665633c543a3a486173683e293200000000000000010000005100000070dc100069000000d9dc1000540000004e756d62657200002edc100042000000506172656e7448617368000012dc10001c00000045787472696e73696373526f6f74000032000000000000000100000052000000cddb1000450000004469676573744469676573744f663c543e0000003200000000000000010000003500000091db10003c0000004576656e74735665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e0000003200000000000000010000003500000069db1000280000004576656e74436f756e744576656e74496e646578320000000000000001000000340000003bdb10002e0000004576656e74546f7069637328295665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e00003200000000000000010000003500000094d8100049000000ddd8100025000000284311000000000002d910004b0000004dd910002a000000284311000000000077d9100054000000cbd91000510000001cda100039000000284311000000000055da100053000000a8da100053000000fbda100040000000204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20546865206669727374206b657920736572766573206e6f20707572706f73652e2054686973206669656c64206973206465636c6172656420617320646f75626c655f6d6170206a75737420666f7220636f6e76656e69656e6365206f66207573696e67206072656d6f76655f707265666978602e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e20536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e6720627566666572207769746820746865206069386020707265666978206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e0000000060de1000030000000000000064de10000100000000000000000000007cde100008000000000000007365740000000000f7df10000300000000000000fadf100012000000bcde1000160000002843110000000000d2de10005d0000002fdf10002f00000028431100000000005edf1000630000002843110000000000c1df10003600000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920606d696e696d756d5f706572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d700000000000000078e110000300000000000000000000007be1100009000000000000000000000000000000000000000000000000000000000000002843110084e11000000000000000000094e11000010000000000000001000000000000009ce110000b00000000000000000000007be11000090000000000000000000000000000000000000000000000000000000000000028431100a8e110000000000000000000b8e1100001000000000000000000000000000000c0e110000d00000000000000000000007be11000090000000000000000000000000000000000000000000000000000000000000028431100d0e110000000000000000000e0e110000400000000000000010000000000000000e210000900000000000000000000002f1c11000400000000000000000000000000000000000000000000000000000000000000284311000ce2100000000000000000001ce210000100000000000000010000004e6f77543a3a4d6f6d656e7432000000000000000100000050000000cbe3100024000000426c6f636b506572696f6400320000000000000001000000360000007ae31000510000004d696e696d756d506572696f640000003200000000000000010000005300000051e210005a000000abe210005a00000005e31000590000005ee310001c0000004469645570646174650000003200000000000000010000003600000024e210002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f20546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e204f6c642073746f72616765206974656d2070726f766964656420666f7220636f6d7061746962696c6974792e2052656d6f766520616674657220616c6c206e6574776f726b732075706772616465642e2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e3a6865617070616765733a636f646566696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e644772616e64706146696e616c697479205374616c6c6564000000703b11002800000060e410003f00000069000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7375646f2f7372632f6c69622e727300c0e4100019000000e0e4100042000000520000001f0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e7273576974686472617720686173206265656e20636865636b65642061626f76653b0a09090909676f5f62656c6f775f73756273697374656e63652069732066616c736520616e642073756273697374656e6365203e206578697374656e6369616c5f6465706f7369743b0a0909090971656443616e20776974686472617720616e6420646f6e277420676f2062656c6f772073756273697374656e63654772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c69747920417574686f7269746965734772616e64706146696e616c697479204e657874466f7263656473797374656d696e646963657362616c616e63657373657373696f6e7374616b696e6764656d6f6372616379636f756e63696c636f756e63696c5f6d6f74696f6e736772616e6470617472656173757279636f6e74726163747375646f00000000000000c8e610000500000000000000d0e61000010000000000000000000000d8e61000010000000000000000000000e0e610000a00000000000000ece61000010000000000000000000000f4e61000010000000000000053756469640000002f1c11000400000038e71000180000004b65794368616e6765640000f608110009000000fce610003c00000020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e60e410003f00000069000000010000005375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b65796f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f000000000010e610000600000000000000540000000000000000000000550000000000000000000000000000005600000000000000000000000000000057000000000000000000000000000000f4eb10000400000000000000580000000000000002000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000f8eb100009000000000000005900000000000000000000005a0000000000000000000000000000005b0000000000000000000000020000000000000000000000000000000000000016e6100007000000000000005c00000000000000000000005d0000000000000000000000000000005e0000000000000000000000000000005f0000000000000000000000000000001de61000080000000000000060000000000000000000000061000000000000000000000000000000620000000000000000000000000000006300000000000000000000000000000025e6100007000000000000006400000000000000000000006500000000000000000000000000000066000000000000000000000000000000670000000000000000000000000000002ce610000700000000000000680000000000000000000000690000000000000000000000000000006a0000000000000000000000000000006b00000000000000000000000000000033e6100009000000000000006c00000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f0000000000000000000000000000003ce61000070000000000000070000000000000000000000071000000000000000000000000000000720000000000000000000000000000007300000000000000000000000000000043e610000f0000000000000074000000000000000000000075000000000000000000000000000000760000000000000000000000000000007700000000000000000000000000000001ec1000100000000000000058000000000000000200000000000000000000000000000000000000780000000000000000000000020000000000000000000000000000000000000052e6100007000000000000007900000000000000000000007a0000000000000000000000000000007b0000000000000000000000000000007c00000000000000000000000000000059e6100008000000000000007d00000000000000000000007e0000000000000000000000000000007f0000000000000000000000000000008000000000000000000000000000000061e61000080000000000000081000000000000000000000082000000000000000000000000000000830000000000000000000000000000008400000000000000000000000000000069e61000040000000000000085000000000000000000000086000000000000000000000000000000870000000000000000000000000000008800000000000000000000006175726174696d657374616d7066696e616c6974795f747261636b65720000000000000069e6100004000000000000006cec100001000000000000000000000084ec1000090000000000000000000000ccec10000700000000000000d4ec1000010000000000000000000000ecec1000090000000000000000000000fc0e1100080000000000000026ee100010000000c8ed10004e000000284311000000000091ed1000340000002843110000000000d31911000b000000de191100080000007afb10001900000016ee100010000000fc1911000c0000007365745f6b65790000000000c5ed100003000000000000009efd10002300000034ed10005d000000284311000000000091ed1000340000002843110000000000d31911000b000000de191100080000007afb10001900000093fb100011000000fc1911000c0000002041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e6e65772041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e202d204e6f204442207772697465732e426f783c543a3a50726f706f73616c3e00000000000090ee1000030000000000000000000000561c11000c000000000000000000000000000000000000000000000000000000000000002843110094ee10000000000000000000a4ee10000100000000000000010000004b65790032000000000000000100000089000000acee1000210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e5375646f0000000000000000ef1000120000000000000014ef10000100000000000000000000002cef100001000000000000007265706f72745f6d69736265686176696f720000000000004def10000700000000000000181a11000700000034ef100019000000205265706f727420736f6d65206d69736265686176696f722e5f7265706f727400000000b4f010000b0000000000000000000000bff01000230000000000000000000000000000000000000000000000000000000000000028431100e4f010000000000000000000f4f0100001000000000000000100000000000000fcf010000d000000000000000000000009f1100023000000000000000000000000000000000000000000000000000000000000002843110070f1100000000000000000002cf110000100000000000000000000000000000034f110000a0000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110070f11000000000000000000040f110000100000000000000000000000000000048f110000700000000000000000000004ff1100020000000000000000000000000000000000000000000000000000000000000002843110070f11000000000000000000080f11000010000000000000000000000417574686f7269746965735665633c28417574686f7269747949642c20417574686f72697479576569676874293e0000320000000000000001000000350000000cf210001b00000050656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723edbf11000310000004e657874466f726365640000acf110002f0000005374616c6c656428543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d62657229003200000000000000010000003600000088f110002400000020607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205468652063757272656e7420617574686f72697479207365742e4772616e64706146696e616c6974794e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f7221496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473215468657265206973206f6e6c79206f6e6520666174616c206572726f723b207165647375627374726174652d6e6f6465df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000dd718d5cc53262d40100000046524e4b99f310000d0000007ef310001b0000003cf31000420000001e010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b0000b0f3100010000000696e697469616c697a655f626c6f636bc8f310000f0000006170706c795f65787472696e73696300e0f3100013000000696e686572656e745f65787472696e7369637300fcf310000f000000636865636b5f696e686572656e74730014f410001400000076616c69646174655f7472616e73616374696f6e30f410000f0000006f6666636861696e5f776f726b65720048f41000160000006772616e6470615f70656e64696e675f6368616e6765000068f41000150000006772616e6470615f666f726365645f6368616e6765000000000000009806110008000000000000005cf5100001000000000000000000000064f510000100000000000000000000006cf51000080000000000000074f510000100000000000000000000007cf5100001000000000000000000000084f5100007000000000000008cf51000030000000000000000000000a4f51000010000000000000000000000acf51000050000000000000074f51000010000000000000000000000b4f51000010000000000000000000000bcf51000080000000000000074f51000010000000000000000000000c4f5100001000000000000006d0911000d0000009cf610000e0000005370656e64696e675bf610000700000062f610003a00000041776172646564006d0911000d0000005bf6100007000000f6081100090000003bf61000200000004275726e7400000018f6100023000000526f6c6c6f766572ccf510004c000000205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e42616c616e6365205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e547265617375727920506f7454726561737572792050726f706f73616c73703b110028000000e0f61000430000006b000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74726561737572792f7372632f6c69622e727300e0f61000430000006b000000010000004469676573744974656d206e6f7420657175616c00f81000480000008d0a00000e00000090f7100019000000b0f7100047000000e20000000a00000090f7100019000000b0f7100047000000df0000000a0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f70687261676d656e2e72730000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000024f910000d0000000000000034f9100002000000000000000000000064f91000090000000000000000000000acf910000700000000000000b4f91000010000000000000000000000ccf91000010000000000000000000000d4f910000900000000000000e0f9100004000000000000000000000040fa100001000000000000000000000048fa10000f0000000000000058fa100001000000000000000000000070fa1000070000000000000000000000a8fa1000100000000000000058fa1000010000000000000000000000b8fa1000080000000000000070726f706f73655f7370656e64000000000000008efd100005000000000000004cfc1000150000000000000093fd10000b000000000000009efd100023000000bcfc10004b00000007fd10004d00000054fd1000150000002843110000000000d31911000b000000de191100080000007afb10001900000069fd100025000000fc1911000c0000007365745f706f740000000000b5fc100007000000000000004cfc10001500000088fc10002d000000636f6e666967757265000000000000001afc10000d0000000000000027fc1000100000000000000037fc100015000000000000004cfc1000150000000000000061fc10000c000000000000006dfc1000170000000000000084fc1000040000000000000027fc100010000000fefb10001c00000072656a6563745f70726f706f73616c0000000000f3fb10000b00000000000000100f110016000000a4fb10003f0000002843110000000000d31911000b000000de191100080000007afb100019000000e3fb100010000000fc1911000c000000617070726f76655f70726f706f73616cf8fa1000570000004ffb10002b0000002843110000000000d31911000b000000de191100080000007afb10001900000093fb100011000000fc1911000c00000020417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e202d204c696d697465642073746f726167652072656164732e202d204f6e65204442206368616e67652e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e202d204f6e6520444220636c6561722e70726f706f73616c5f6964202852652d29636f6e6669677572652074686973206d6f64756c652e70726f706f73616c5f626f6e64436f6d706163743c5065726d696c6c3e70726f706f73616c5f626f6e645f6d696e696d756d436f6d706163743c42616c616e63654f663c543e3e7370656e645f706572696f64436f6d706163743c543a3a426c6f636b4e756d6265723e6275726e20536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e6e65775f706f742050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e76616c756562656e65666963696172793c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263655472656173757279000000000000008c0011000c000000000000000000000098001100070000000000000000000000000000000000000000000000000000000000000028431100340111000000000000000000a000110002000000000000000100000000000000b0001100130000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311001c0111000000000000000000d000110001000000000000000100000000000000d80011000b0000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100f4001100000000000000000004011100010000000000000001000000000000000c01110004000000000000000000000098001100070000000000000000000000000000000000000000000000000000000000000028431100340111000000000000000000100111000100000000000000010000000000000018011100030000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311001c01110000000000000000002c01110001000000000000000100000000000000041211000d00000000000000000000006d0911000d00000000000000000000000000000000000000000000000000000000000000284311003401110000000000000000004401110001000000000000000100000000000000881111000900000001010000000000006d0911000d000000000000004c01110024000000000000000000000000000000000000002843110070011100000000000000000080011100010000000000000000000000000000008801110009000000000000000000000091011100120000000000000000000000000000000000000000000000000000000000000028431100a40111000000000000000000b401110001000000000000000100000050726f706f73616c426f6e645065726d696c6c002d03110055000000820311004400000050726f706f73616c426f6e644d696e696d756d42616c616e63654f663c543e00db021100520000005370656e64506572696f64543a3a426c6f636b4e756d6265720000003200000000000000010000008a000000b9021100220000004275726e7502110044000000506f74003200000000000000010000003e000000420211003300000032000000000000000100000034000000190211002900000050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e32000000000000000100000036000000fa0111001f000000417070726f76616c735665633c50726f706f73616c496e6465783e0032000000000000000100000035000000bc0111003e0000002050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e2050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e5472656173757279205370656e64506572696f64000020041100390000006004110048000000100200002d000000547265617375727920417070726f76616c735472656173757279204275726e00000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e727300f8100048000000870a00000a00000050726f706f73657227732062616c616e636520746f6f206c6f7754726561737572792050726f706f73616c426f6e644d696e696d756d54726561737572792050726f706f73616c426f6e6454726561737572792050726f706f73616c436f756e744e6f2070726f706f73616c206174207468617420696e6465782f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d332e352e312f7372632f636f6465632e727300000000000000980611000800000000000000a0061100040000000000000000000000c0061100020000000000000000000000d00611000500000000000000d8061100050000000000000000000000000711000200000000000000000000001007110008000000000000001807110001000000000000000000000020071100010000000000000000000000280711000b0000000000000018071100010000000000000000000000340711000100000000000000000000003c071100080000000000000044071100020000000000000000000000540711000100000000000000000000005c0711000e00000000000000440711000200000000000000000000006c071100010000000000000050726f706f736564f6081100090000006d0911000d0000000408110004000000ff0811000b0000000a091100530000005d09110010000000566f746564000000f60811000900000004081100040000002f1c110004000000ff0811000b000000ff0811000b0000006e08110042000000b008110046000000417070726f76656404081100040000003d08110031000000446973617070726f766564000808110035000000457865637574656404081100040000002f1c110004000000c3071100410000004d656d62657245786563757465640000740711004f00000020412073696e676c6520636f756e63696c6c6f722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e486173682041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4163636f756e7449644d656d626572436f756e742041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292e50726f706f73616c496e646578000000000000a80911000f00000000000000b8091100020000000000000000000000c809110004000000000000004e65774163636f756e74496e64657800f608110009000000630a11000c000000e80911002200000028431100000000000a0a1100410000004b0a1100180000002041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e646578496e76616c6964206f726967696e496e646963657320456e756d536574b00a110019000000d00a110048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b110028000000300b1100420000004a000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f696e64696365732f7372632f6c69622e72730000703b1100280000008c0b1100460000006b000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f6d6f74696f6e732e72730000dc0b11002a000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a200000100c1100230000005f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e00300b1100420000004a000000010000008c0b1100460000006b00000001000000cd0c110036000000320511005b000000bc01000005000000000000000000000000000000900c11003d000000320511005b000000c301000005000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b207165640000000000880d11000700000000000000900d1100010000000000000000000000a80d1100030000000000000000000000c00d11000700000000000000c80d1100020000000000000000000000f80d1100040000000000000000000000180e110004000000000000001c0e1100030000000000000000000000640e11000400000000000000657865637574650000000000fc0e110008000000000000009c0f11001b000000b70f1100400000002843110000000000f70f11002100000070726f706f736500000000007f0f11000900000000000000880f11001400000000000000fc0e110008000000000000009c0f11001b000000d31911000b0000002d0f110024000000510f11002e000000fc1911000c000000766f746500000000fc0e11000800000000000000040f110007000000000000000b0f11000500000000000000100f11001600000000000000260f110007000000000000002f1c110004000000d31911000b000000840e110023000000a70e110055000000fc1911000c000000202d20426f756e6465642073746f72616765207265616420616e64207772697465732e202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e70726f706f73616c543a3a48617368696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f7665202d20426f756e6465642073746f7261676520726561647320616e64207772697465732e202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e7468726573686f6c64436f6d706163743c4d656d626572436f756e743e426f783c3c542061732054726169743e3a3a50726f706f73616c3e20446973706174636820612070726f706f73616c2066726f6d206120636f756e63696c6f72207573696e672074686520604d656d62657260206f726967696e2e204f726967696e206d757374206265206120636f756e63696c206d656d6265722e436f756e63696c4d6f74696f6e7300000000000088111100090000000000000000000000911111000c0000000000000000000000000000000000000000000000000000000000000028431100a81311000000000000000000a011110001000000000000000100000000000000a81111000a0000000101000000000000040f11000700000000000000b2111100160000000000000000000000000000000000000028431100ec1111000000000000000000c811110001000000000000000000000000000000d0111100060000000101000000000000040f11000700000000000000d6111100130000000000000000000000000000000000000028431100ec1111000000000000000000fc11110001000000000000000000000000000000041211000d0000000000000000000000821c11000300000000000000000000000000000000000000000000000000000000000000284311008813110000000000000000001412110001000000000000000100000050726f706f73616c735665633c543a3a486173683e0000008e1211002400000050726f706f73616c4f663c542061732054726169743e3a3a50726f706f73616c5b12110033000000566f74696e67566f7465733c543a3a4163636f756e7449643e000000320000000000000001000000360000002e1211002d00000050726f706f73616c436f756e740000001c121100120000002050726f706f73616c7320736f206661722e20566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e2054686520686173686573206f6620746865206163746976652070726f706f73616c732e496e6469636573000000000000006c1311000b0000000000000000000000771311000f00000000000000000000000000000000000000000000000000000000000000284311008813110000000000000000009813110001000000000000000100000000000000a0131100070000000101000000000000771311000f00000000000000ea1b1100110000000000000000000000000000000000000028431100a81311000000000000000000b81311000100000000000000010000004e657874456e756d536574543a3a4163636f756e74496e646578000032000000000000000100000034000000d61311001f000000456e756d5365740032000000000000000100000035000000c0131100160000002054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e496e6469636573204e657874456e756d536574436f756e63696c4d6f74696f6e732050726f706f73616c73436f756e63696c4d6f74696f6e7320566f74696e67000000cd0c110036000000320511005b000000f00100000500000000000000000000000000000000000000320511005b000000f70100000500000070726f706f736572206e6f74206f6e20636f756e63696c6475706c69636174652070726f706f73616c73206e6f7420616c6c6f776564436f756e63696c4d6f74696f6e732050726f706f73616c4f66436f756e63696c4d6f74696f6e732050726f706f73616c436f756e7470726f706f73616c206d757374206578697374766f746572206e6f74206f6e20636f756e63696c6d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f72656440151100480000008d0a00000e00000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e7273626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d69742062792070726963650000e4151100340000001816110044000000a50000000300000074686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f657865632e72733200000000000000010000008b0000008c0000008d0000008e0000008f0000009000000041757261204c61737454696d657374616d704175726120417574686f72697469657353657373696f6e2056616c696461746f727353657373696f6e204e6578744b6579466f720000e0161100190000000017110048000000bb0100002d000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e727374696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c0000009417110022000000b61711003f000000f8000000030000004175726120736c6f74206475726174696f6e2063616e6e6f74206265207a65726f2e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f617572612f7372632f6c69622e72730000001018110028000000b61711003f000000fe000000030000004f6e6c79206f6e6520626c6f636b206d617920626520617574686f7265642070657220736c6f742e000000006418110008000000000000006c1811000200000000000000000000009c1811000a000000000000007365745f6b65797300000000081a110004000000000000000c1a11000700000000000000131a11000500000000000000181a110007000000ec1811003900000025191100480000006d1911003100000028431100000000009e191100350000002843110000000000d31911000b000000de19110008000000e619110016000000fc1911000c0000002053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e2023203c7765696768743e202d204f2831292e202d204f6e6520657874726120444220656e7472792e2023203c2f7765696768743e6b657973543a3a4b65797370726f6f665665633c75383e53657373696f6e000000000000e01b11000a0000000000000000000000ea1b1100110000000000000000000000000000000000000000000000000000000000000028431100941c11000000000000000000fc1b110001000000000000000100000000000000041c11000c00000000000000000000000f3e11000c0000000000000000000000000000000000000000000000000000000000000028431100101c11000000000000000000201c110001000000000000000100000000000000281c11000700000000000000000000002f1c1100040000000000000000000000000000000000000000000000000000000000000028431100341c11000000000000000000441c1100010000000000000001000000000000004c1c11000a0000000101000000000000561c11000c000000000000000c1a1100070000000000000000000000000000000000000028431100641c11000000000000000000741c1100010000000000000000000000000000007c1c1100060000000101000000000000821c11000300000000000000851c11000e0000000000000000000000000000000000000028431100941c11000000000000000000a41c110001000000000000000100000056616c696461746f72735665633c543a3a4163636f756e7449643e00401d11001f00000043757272656e74496e64657832000000000000000100000034000000221d11001e0000004368616e676564626f6f6c0032000000000000000100000036000000f41c11002e0000004e6578744b6579466f72543a3a4163636f756e744964000032000000000000000100000036000000d01c1100240000004163746976657533325665633c4f70617175654b65793e0032000000000000000100000035000000ac1c11002400000020546865206b6579732074686174206172652063757272656e746c79206163746976652e20546865206e657874206b657920666f72206120676976656e2076616c696461746f722e205472756520696620616e797468696e6720686173206368616e67656420696e20746869732073657373696f6e2e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e53657373696f6e204368616e67656472656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c2066656500009100000018000000040000009200000093000000940000009500000096000000970000006e6f7420656e6f7567682067617320746f20706179207472616e736665722066656562616c616e636520746f6f206c6f7720746f2073656e642076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7464657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756572656163686564206d6178696d756d2064657074682c2063616e6e6f74206372656174656e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e7469617465206665654d6f64756c65206973206e6f742076616c696443616e2774206465636f6465207761736d20636f6465756e6b6e6f776e206578706f72743a20657870656374696e67206f6e6c79206465706c6f7920616e642063616c6c2066756e6374696f6e73657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e61747572656d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72794f6e20656e74727920746f207468652066756e6374696f6e20606d6f64756c65602063616e277420626520604e6f6e65603b207165646d656d6f727976616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706543616e6e6f7420696d706f727420676c6f62616c736d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e6d6f64756c6520696d706f72747320606578745f7072696e746c6e60206275742064656275672066656174757265732064697361626c656443616e6e6f7420696d706f7274207461626c65736d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163654d656d6f727920696d706f7274206d757374206861766520746865206669656c64206e616d6520276d656d6f7279274d756c7469706c65206d656d6f727920696d706f72747320646566696e656452657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e4d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c65646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6563616c6c63616c6c2066756e6374696f6e2069736e2774206578706f727465646465706c6f792066756e6374696f6e2069736e2774206578706f727465646465706c6f796578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e66756e6374696f6e206861732061206e6f6e2d6578697374656e742074797065000000292511001c000000b423110044000000b4000000030000000525110024000000b423110044000000bd00000003000000cd24110038000000b423110044000000fb0000002a000000a524110028000000b423110044000000fc000000320000007d24110028000000b423110044000000fe0000002c000000512411002c000000b423110044000000fd0000004c0000001f24110032000000b4231100440000003701000003000000f823110027000000b4231100440000003f010000040000008c23110028000000b423110044000000450100000300000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f2070617920746865697220666565735472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e53657373696f6e2043757272656e74496e646578696e76616c6964206163636f756e7420696e646578626164207369676e617475726520696e2065787472696e7369634e6f6e2d656d7074792066756e6374696f6e20626f6479206578706563746564662611000f00000075261100020000007726110003000000d825110030000000082611005e0000007d00000005000000617373657274696f6e206661696c65643a20636f6e746578742e6672616d655f737461636b2e69735f656d70747928292f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7761736d692d76616c69646174696f6e2d302e312e302f7372632f66756e632e7273417420696e737472756374696f6e202840293a2070726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b207165646475706c6963617465206b65792070726f766964656453657373696f6e204163746976654552524f523a2061637469766520646f65736e277420636f6e7461696e206f7574676f696e67206b65796578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d6578745f6e6f776578745f64697370617463685f63616c6c6578745f696e7075745f73697a656578745f696e7075745f636f70796578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e746578745f7365745f72656e745f616c6c6f77616e63656578745f72656e745f616c6c6f77616e63656578745f7072696e746c6e6d616b655f746f705f6672616d655f706f6c796d6f72706869632069732063616c6c6564207769746820656d707479206672616d6520737461636b746869732066756e6374696f6e2063616e27742062652063616c6c6564207769746820656d707479206672616d6520737461636b4d6973706c6163656420656c736520696e737472756374696f6e0000fc29110047000000432a110005000000c029110037000000f7291100050000008d291100170000008429110009000000d62b1100140000006c291100180000008429110009000000d62b1100140000003c2911001d0000005929110013000000a458110001000000546f6f206c61726765206d656d6f727920616c69676e6d656e7420325e20286578706563746564206174206d6f737420547279696e6720746f2075706461746520676c6f62616c20206f66207479706520547279696e6720746f20757064617465206c6f63616c20416e79537065636966696300980000000400000004000000990000004c6162656c7320696e2062725f7461626c6520706f696e747320746f20626c6f636b206f6620646966666572656e742074797065733a2020616e6420496620626c6f636b20776974686f757420656c736520726571756972656420746f2068617665204e6f526573756c7420626c6f636b20747970652e2042757420697420686173202074797065582a110018000000702a11000b000000556e657870656374656420737461636b20686569676874202c20657870656374656420547279696e6720746f2061636365737320706172656e74206672616d6520737461636b2076616c7565732e0000b82a110017000000cf2a11001600000045787065637465642076616c7565206f66207479706520206f6e20746f70206f6620737461636b2e20476f7420000000f02a110007000000537461636b3a2000000001007a2b110024000000502b110006000000562b11000e000000642b1100160000002c2b110024000000502b1100060000006d6178696d756d206d656d6f72792073697a65206d757374206265206174206d6f7374202070616765736d6178696d756d206c696d697420206973206c657373207468616e206d696e696d756d20696e697469616c206d656d6f72792073697a65206d757374206265206174206d6f7374200000b02b110026000000d62b110014000000547279696e6720746f20696e697469616c697a65207661726961626c65206f6620747970652020776974682076616c7565206f66207479706520496e69742065787072657373696f6e2073686f756c6420616c776179732062652077697468206c656e6774682032812c110007000000aa2c11000b000000812c110007000000882c1100220000004e6f6e20636f6e7374616e74206f70636f646520696e20696e6974206578707245787072657373696f6e20646f65736e277420656e647320776974682060656e6460206f70636f6465476c6f62616c2020646f65736e277420657869737473206f72206e6f742079657420646566696e6564206973206d757461626c65000000c82c110010000000d82c11000f0000004d656d6f727920617420696e6465782020646f65736e27742065786973747300f82c11000f000000d82c11000f0000005461626c6520617420696e64657820002931110012000000d82c11000f000000282d11000e000000d82c11000f0000005479706520617420696e646578200000962d110010000000d82c11000f000000682d110010000000882d11000e000000682d110010000000782d110010000000457870656374656420676c6f62616c2020746f20626520696d6d757461626c6520746f206265206d757461626c65476c6f62616c20617420696e646578206e6f6e2d656d70747920737461636b2065787065637465640000d02d110020000000f02d110012000000747279696e6720746f206765742076616c756520617420706f736974696f6e20206f6e20737461636b206f662073697a6520636865636b656420636f75706c65206f66206c696e65732061626f766500282e110015000000657863656564656420737461636b206c696d6974200000009800000004000000040000009a0000004c6f63616c732072616e6765206e6f7420696e2033322d6269742072616e6765882e110022000000aa2e110015000000bf2e110007000000547279696e6720746f20616363657373206c6f63616c207769746820696e64657820207768656e20746865726520617265206f6e6c7920206c6f63616c7366756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e6473d02f1100650000002301000017000000a02f11002500000043616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a2000000000000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a0909090971656429311100120000003b3111000f000000fc3011000a00000006311100140000001a3111000f0000005369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e76676173603111005800000088000000160000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e727300e43111001c000000b831110013000000c604000009000000617373657274696f6e206661696c65643a20656e64203c3d206c656e183211001e000000b831110013000000b303000009000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e0000fd321100120000000f3311000c0000006066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e644e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e46756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64737461636b206d757374206265206e6f6e2d656d707479737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e640000103411006c000000c8000000110000000000000000000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e7273747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e64730000000035110048000000870a00000a0000000000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e7273556e726561636861626c654e6f70426c6f636b009800000004000000040000009b0000004c6f6f704966456c7365456e64427200980000000400000004000000040000004272496642725461626c65009800000004000000040000009c00000052657475726e43616c6c43616c6c496e64697265637400009800000004000000040000009d00000044726f7053656c6563744765744c6f63616c5365744c6f63616c5465654c6f63616c476574476c6f62616c536574476c6f62616c4933324c6f61644936344c6f61644633324c6f61644636344c6f61644933324c6f616438534933324c6f616438554933324c6f61643136534933324c6f61643136554936344c6f616438534936344c6f616438554936344c6f61643136534936344c6f61643136554936344c6f61643332534936344c6f616433325549333253746f726549363453746f726546333253746f726546363453746f726549333253746f72653849333253746f7265313649363453746f72653849363453746f7265313649363453746f7265333243757272656e744d656d6f727947726f774d656d6f7279493332436f6e7374009800000004000000040000009e000000493634436f6e73749800000004000000040000009f000000463332436f6e7374463634436f6e73749800000004000000040000002200000049333245717a49333245714933324e654933324c74534933324c74554933324774534933324774554933324c65534933324c655549333247655349333247655549363445717a49363445714936344e654936344c74534936344c74554936344774534936344774554936344c65534936344c655549363447655349363447655546333245714633324e654633324c7446333247744633324c65463332476546363445714636344e654636344c7446363447744636344c654636344765493332436c7a49333243747a493332506f70636e744933324164644933325375624933324d756c493332446976534933324469765549333252656d5349333252656d55493332416e644933324f72493332586f7249333253686c4933325368725349333253687255493332526f746c493332526f7472493634436c7a49363443747a493634506f70636e744936344164644936345375624936344d756c493634446976534936344469765549363452656d5349363452656d55493634416e644936344f72493634586f7249363453686c4936345368725349363453687255493634526f746c493634526f74724633324162734633324e65674633324365696c463332466c6f6f724633325472756e634633324e656172657374463332537172744633324164644633325375624633324d756c4633324469764633324d696e4633324d6178463332436f70797369676e4636344162734636344e65674636344365696c463634466c6f6f724636345472756e634636344e656172657374463634537172744636344164644636345375624636344d756c4636344469764636344d696e4636344d6178463634436f70797369676e493332577261704936344933325472756e63534633324933325472756e63554633324933325472756e63534636344933325472756e6355463634493634457874656e6453493332493634457874656e64554933324936345472756e63534633324936345472756e63554633324936345472756e63534636344936345472756e6355463634463332436f6e7665727453493332463332436f6e7665727455493332463332436f6e7665727453493634463332436f6e766572745549363446333244656d6f7465463634463634436f6e7665727453493332463634436f6e7665727455493332463634436f6e7665727453493634463634436f6e766572745549363446363450726f6d6f74654633324933325265696e746572707265744633324936345265696e746572707265744636344633325265696e746572707265744933324636345265696e74657270726574493634547261696c696e6744617461556e6578706563746564456f66496e76616c69644461746100243b11000b000000492f4f204572726f723a2049333249363446333246363456616c7565980000000400000004000000990000004e6f526573756c74703b110028000000983b1100500000008700000009000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e7273703b110028000000983b110050000000900000000900000061757261736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214175726120696e686572656e742064617461206e6f7420666f756e6474696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e000000000000010000000200000004000000080000001000000000000000ec3c11000e00000000000000fc3c1100010000000000000000000000043d110001000000000000004e6577417574686f7269746965730000303d1100170000000c3d110024000000204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c28417574686f7269747949642c20753634293e0000000000743d11000a00000000000000803d1100010000000000000000000000883d110002000000000000004e657753657373696f6e00000f3e11000c000000983d110055000000ed3d110022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e53657373696f6e496e6465780000000000743e1100100000000000000028431100000000000000000000000000843e11000100000000000000000000008c3e11000f00000000000000284311000000000000000000000000009c3e1100010000000000000045787472696e73696353756363657373b93e11002500000045787472696e7369634661696c656400a43e11001500000020416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e48617368206e6f7420657175616c00000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e7273f03e110019000000103f1100500000005800000022000000903f110019000000b03f110048000000570100002a000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e72736578745f6368696c645f73746f726167655f726f6f74206e657665722072657475726e73207533323a3a6d61785f76616c75653b2071656452756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e6700006c4011002d000000994011000c000000a540110003000000617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20b04011003400000064657374696e6174696f6e20616e6420736f7572636520736c69636573206861766520646966666572656e74206c656e6774687354441100180000004b080000090000000c411100110000001d41110017000000ec020000050000006361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e7273d0411100460000006301000013000000980000000400000004000000a0000000a1000000a20000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f720028431100000000008058110002000000b041110015000000e7030000050000007372632f6c6962636f72652f726573756c742e727300000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f666d742f6d6f642e727301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000202020202020202020202020202020202020202020202020202020202020303030303030303030303030303030304040404040000000000000000000000000038431100200000005843110012000000320000000000000001000000a3000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e64657820697320303030313032303330343035303630373038303931303131313231333134313531363137313831393230323132323233323432353236323732383239333033313332333333343335333633373338333934303431343234333434343534363437343834393530353135323533353435353536353735383539363036313632363336343635363636373638363937303731373237333734373537363737373837393830383138323833383438353836383738383839393039313932393339343935393639373938393900006c4411000600000072441100220000005444110018000000090a0000050000007372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820b444110016000000ca4411000d00000054441100180000000f0a000005000000736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d009e4511000b0000001a58110016000000d7441100010000008845110016000000e107000009000000f85711000e00000006581100040000000a58110010000000d7441100010000008845110016000000e507000005000000b85711002b000000e3571100150000005b010000150000009e4511000b000000a945110026000000cf45110008000000d745110006000000d7441100010000008845110016000000f2070000050000007372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f6620600000002646110002000000104611001600000054040000110000001046110016000000480400002800000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f20b05111004a0000000054110000020000005611003700000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b020001020202020302020202040205060202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200010305050606030706080809110a1c0b190c140d120e160f0410031212130916011705180219031a071c021d011f1620032b062c022d0b2e01300331023202a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f1838586898b8c98a0a4a6a8a9acbabebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74759697c9ff2f5f262e2fa7afb7bfc7cfd7df9a409798308f1fffceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100856070207150d500443032d03010411060f0c3a041d250d064c206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082a0682ff1118082f112d032010210f808c048297190b158894052f053b07020e180980af31740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880ba3d35040a06380846080c06740b1e035a0459098083181c0a1609460a808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b0210011104120513111402150217021a021c051d0824016a036b02bc02d102d40cd509d602d702da01e005e802ee20f004f9040c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1c848509379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a2225c5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d03f71727b5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a80a64e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b5f2148080a80a65e22450b0a060d1338080a362c041080c03c64530c0181004808531d398107460a1d03474937030e080a0639070a8136198107839a66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b65450b2f101140021e97f20e82f3a50d811f51818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b87d580d7294b050a0402831144814b3c06010455051b3402810e2c04640c560a0d035c043d391d0d2c040907020e06809a83d50b0d030a06740c59270c0438080a0628081e520c046703290d0a06030d30600e8592905111002000000027000000190000009051110020000000280000002000000090511100200000002a0000001900000090511100200000002b0000001800000090511100200000002c0000002000000000000000000000007372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21b003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000d0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c813000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d000000000000001e1f20000000000021002200232425000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027280000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000002b2c00002d0000000000000000000000000000000000000000000000000000000000002e2f300000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000000000320033000000000000000000000000000000000000000000000000000034350000353535360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff06fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db07000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f662060426f72726f774572726f72426f72726f774d75744572726f720000002843110000000000e3571100150000000c0400000500000020202020a40000000c00000004000000a5000000a6000000a70000003a202c0a2c200000980000000400000004000000a8000000a9000000aa000000280a282c290a5d5b4572726f72008ae202046e616d650181e2029c04000c6578745f74776f785f31323801146578745f6765745f73746f726167655f696e746f020e6578745f626c616b65325f32353603116578745f636c6561725f73746f72616765040f6578745f7365745f73746f7261676505166578745f73616e64626f785f6d656d6f72795f6e6577061b6578745f73616e64626f785f6d656d6f72795f74656172646f776e07176578745f73616e64626f785f696e7374616e746961746508126578745f73616e64626f785f696e766f6b65091d6578745f73616e64626f785f696e7374616e63655f74656172646f776e0a1f6578745f6765745f616c6c6f63617465645f6368696c645f73746f726167650b156578745f7365745f6368696c645f73746f726167650c176578745f636c6561725f6368696c645f73746f726167650d166578745f6b696c6c5f6368696c645f73746f726167650e166578745f73616e64626f785f6d656d6f72795f6765740f0e6578745f7072696e745f7574663810166578745f73616e64626f785f6d656d6f72795f73657411126578745f737232353531395f76657269667912126578745f656432353531395f76657269667913166578745f6368696c645f73746f726167655f726f6f7414196578745f6765745f616c6c6f63617465645f73746f7261676515106578745f73746f726167655f726f6f7416186578745f73746f726167655f6368616e6765735f726f6f74170d6578745f7072696e745f68657818106578745f636c6561725f70726566697819236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f741a0d6578745f7072696e745f6e756d1b0a6578745f6d616c6c6f631c086578745f667265651d48616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303066616135336238376530653661621e34616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68363534333630666363653539333038361f3b73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f7075626c69633a3a6866623261623538306438366130353931204e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864336433333837396635363662373062212e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a6866343337386339613663343034313036223873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a6862366265373730623536363037303262230e5f5f727573745f6465616c6c6f632430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6832373532316332623635333961663462253d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835323730333337313965616561396439260c5f5f727573745f616c6c6f63270e5f5f727573745f7265616c6c6f63284e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68333162333430633638356463353561372936636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68346631303163306137313663303262662a08727573745f6f6f6d2b8c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a68653338646664303539333431636136652c4073726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a68633431353362653330353734666463382d3f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a68333833386466623938633032323536302e3d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f65787465726e616c3a3a68353766336365383464336137636238302f796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a683433396135666231626132393631376230a9013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6864316238313536383831333534326562313573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a6834643363623566353064323239656164323d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a68653062633364306533383933643731643380023c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2073726d6c5f64656d6f63726163793a3a436f6e76696374696f6e292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68353930353032663038313161616131613486013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a6862633164313832343832613636613633353e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a686261613031663936316563346463613036ef013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6834666234646432626135653563343161374e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866366335393132386261393533653036383d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a6863333463353730393734326433353766397c6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a68353336663137633665353765313237373a3c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68316663386164393065613531346234343b4173726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68343934616563663265376262353363663c4673726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68666161383338663661316237343063323d6f3c73726d6c5f64656d6f63726163793a3a5f5f476574427974655374727563744e65787445787465726e616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68666437363537366638326239333736663e6e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68396439323936363335643430313436363f8c0173726d6c5f64656d6f63726163793a3a5f494d504c5f454e434f44455f464f525f436f6e76696374696f6e3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f64656d6f63726163793a3a436f6e76696374696f6e3e3a3a656e636f64655f746f3a3a683864643663653333376432343436653140703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683038376634656163303033396364303241633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683433303838336563313633396132396142b5013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a683030373732303864306663333335623343800173726d6c5f64656d6f63726163793a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f64656d6f63726163793a3a43616c6c3c543e3e3a3a6465636f64653a3a683431656466376434313732336531313744796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6866326464383363666439383038363036455d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832646431383630646366363235346630465d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833326631626466383562373532623062475e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68323565303232396230663361386137394836636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a683736396238303062623465336330323349800173726d6c5f64656d6f63726163793a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f64656d6f63726163793a3a43616c6c3c543e3e3a3a6465636f64653a3a68366330363165343466643531633534324a5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383033383965346537373737383439334b5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68316462643964653166316533363161384c5e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68326335326466333664353632656536374d493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68623939383539636362323533323036384e443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68656366343530313532633963373339394f29636f72653a3a70616e69636b696e673a3a70616e69633a3a683930306462653831356663633632336250443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a686563663435303135326339633733393951463c73726d6c5f73797374656d3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837326239303930303932623764316664524e3c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683137393532326533376265306633366453503c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683036643461313538626363343934393054483c73726d6c5f636f6e74726163743a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683339326361316463623530653934313655473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683636626363613030646664346261373056473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830643631356565623361626262396137575e3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a686664343433636362383337633437373358ef013c73726d6c5f64656d6f63726163793a3a426c61636b6c6973743c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c20616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e293e3e3a3a6765743a3a6836613764356235663139653863376665596f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a68636361343332336438616136626264385a3573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a68366438303866636531366531616539345b8a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a68373264633635373838616237653435385c3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68316334623366356537353961306662325db50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a68653734386162343266306433366464315e483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a68396637356363353361663162363438375f3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a686135626464656330353832393464663960323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6832346231323866373631326130323533612d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68393563313864623831313666633930666289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6866643364363035613962363562326163638c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a6835653463336266613636376433333061646f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866633134656636336262303965356532653d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683766313063393363376136383765333366643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6839646533666434666432303039313861673d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862343132623566326132333534663734683d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862623562313130626465623239363433693a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68633739326333373764643635653436336a3f73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68376139663564323161663138626333316bc9023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a68356134613565333938653162353335646c9e0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a68386535616136323961383538396464666d3373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a68393535643464306633666437383264336eb4013c73726d6c5f7374616b696e673a3a426f6e6465643c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a68356435656265333066373637333939646f4473726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a686165656266636464346532626634303570683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838383633396439623963363830333564716b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835373232343437623438373336343566726d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866386232316161323838326335376533736e3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637453657373696f6e5265776172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683735336538386436396637306631383574763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68353639323166626330353134366232397586013c73726d6c5f7374616b696e673a3a4d6f64756c653c543e2061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e456e64696e673c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f73657373696f6e5f656e64696e673a3a686535313633306636363638636361363176673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6866326439313535326334303637623864776a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a68626635393135363135343133393639667844636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a683932653839393334616233333963393779f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68333733366566623434363166356632627a3773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a68633337363639633262643933303135317b483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a68336239653437613061613366663166667c6d3c6e6f64655f72756e74696d653a3a43757272656e6379546f566f746548616e646c65722061732073725f7072696d6974697665733a3a7472616974733a3a436f6e766572743c753132382c7536343e3e3a3a636f6e766572743a3a68353637666237386237323465313434367d613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68363831316136353639356566373033667e8e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a68396435343430393131383236656437317f3973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6834393035336663653939393664353862800130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683237386236313539333331396136636281013e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a68323662636361343964663735316562388201d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683436633539386334323439626161393383015c3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838366432623236333166646333346264840185013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a68646562353262626431313032366638658501483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a68373662376631353363626165383533328601483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a683837316531646162333963366664653287013473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a683863616333643766656561643836333088016f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a683866636637393031303130323364383589012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68636430313236643637393166366466338a0134636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a68373930316437393431343736333863338b013c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a68613236643732366361313234646137358c0134636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68396133653135623333653732623336358d012e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a68396134613139636665393430326233398e012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68643032636466333230343961613863358f016f3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683239313630343165646363333739323690014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686334393265383265343832393137646491018f013c73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a683432363237643732313730333731653092013673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a683038393461396331626164353230643093014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683737366564343637623834353637323794012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a683631343137393464626265336134666495014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68323631646237643031626138343532379601303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835333964383965373864336432386636970135636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68626232333962346333656230313863619801303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68663966343739623738313364643766329901313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68653961663431646462346636653666319a016b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68356462343963643635646562396561369b01713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343432336537396237666136333364639c01713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68373535376161643232383364663738389d01683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68653333393636303464383766313162329e016b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68336533366161393132333730623438649f0130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6838623865663864653663643565663130a0016f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6839656432363761666263376163303338a101443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864643538643239613837336539366430a20125616c6c6f633a3a666d743a3a666f726d61743a3a6836363238323931366635643839636166a301743c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a56617255696e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835333337616335653133303232393336a401457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6863343039653861623936343865363938a50127636f72653a3a7374723a3a66726f6d5f757466383a3a6861303162383536303462626661643632a6017c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6832396434356534336335396636373566a7016c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835656534336634343261306436306335a801793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835636361393566393536386433663966a90186017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a6863373130393263326433353730393230aa016f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6838363932336464383833646464333432ab01693c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830373635356166323066616638633434ac01135f5f727573745f616c6c6f635f7a65726f6564ad014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6832386631653666366637316263366436ae01613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6861313534656437353133373565343033af01723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6834326161333662363739326430643866b001723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6864323035306537666665386430383164b1013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6834373937653534376136323663326430b201323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6838316135313335323361343266643731b3012c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6862323466623938633663613936336537b4014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6833633137313734326664343464363431b501613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6866396465623032633130313431363831b60148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6836613231616631656164313134353561b7015a3c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a6866613236356165323336393333666263b8017b3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a6861393434356539656631666338613634b90187013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a6862336666633035383733356436363334ba0187013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a6831653439303531353836633433633137bb0180013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a6831396333313936396362613630646262bc0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a6862613566353261373763386565613862bd0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a6832333831646137343636336138303363be0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a6835656233323666313336306535663566bf0183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a6838306163646635383464356163343739c00185013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a6837313736326661336363396635383131c10184013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a6838666138346134313862303336643766c20183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a6836343433386230306632303431663766c3018d013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a6834383165313066303230396462623061c40182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d3a3a6830646231363535363634323230353335c5017f3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a6839393863386639323461343030373766c60189013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a6835653930636536356562616661666239c70186013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f73697a653a3a6836393432666133373539633532363561c80186013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f636f70793a3a6865613864363566623932646262663032c90188013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a6862333638653731633732333932623934ca0188013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a6861356238363437613064633065323037cb0189013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6835663639653663613338666431653232cc018e013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f72656e745f616c6c6f77616e63653a3a6863306261363734316164623665343462cd018a013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72656e745f616c6c6f77616e63653a3a6832366637353133323438386361626366ce0183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7072696e746c6e3a3a6831303139323034333536653238623532cf013273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a6863333265616162336663633834663734d001a7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a6830333332613261323966396434666363d1014473726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a6865393064306631643436366138613330d201673c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a6836613662316266663034383730643065d301613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831636561376633356531383534376639d401613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6834643765343630363733636637623463d501773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6864613538363437373364393161633062d601773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6863633237633664653363643436303964d701793c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6830616538343035383365663932653431d801b7013c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f3c543e3e3e3a3a6765743a3a6834656437633633653831363131623530d9017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6835303333313332653233393234313938da017e3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6836383237393262643365346631376362db01723c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831656665633264656436313436383737dc018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a6865353131643163343631323236326636dd01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6831383934623633353565653739633265de01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6839323033653539333130616162373435df013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a6833396665333063616239643263336134e0017f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a6834306266313536333830363533643562e1013673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a6831396138616331613331343433303262e2014c73726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a6832386330326662363135343738393533e3013173726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a72616e646f6d3a3a6836653661373533396336333832346535e4012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6835323963333139393332366435346334e5017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6833636431376332336265613732616238e6012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6832323538333565333135383964613337e7014573726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6831643433663038326464303036646130e8017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6861303534656163333938613038326137e9017d3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6836356334643665616263623034616561ea017f3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6864393232353437646465646135656565eb0182013c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6862363037336636626665396661363266ec01763c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831633439366566636164346364626663ed013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830333363396462666564626136316537ee014173726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862626532316466343639636135663839ef014573726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6836663332383366323231386434633839f0014673726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838633363643830353162373562323835f1014b73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6862396631373532643866633062313738f201713c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f7465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862383334386332323031333439346662f301723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744465636179526174696f3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861326133313034363234303765303530f401743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563745465726d4475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831353665656134653234393865343464f501743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f74696e67506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838346662313465646262326639386134f6017b3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374496e6163746976654772616365506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862383635353034333836316635346530f701723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744361727279436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865653634366138333735353061656132f8017c3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637450726573656e74536c617368506572566f7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833613531376362613564626131653435f9016f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744372656174696f6e4665653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830303932656436636465313735316632fa01753c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637443616e646964616379426f6e643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833636562636665643539663638636338fb013d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6864396430353365663436653261316535fc013e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a6831323531373431656231613331333261fd014273726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f6e616d653a3a6863393235393565363038306138336533fe014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a6866356237356638623531313835323531ff014773726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683561323363366238356235373263666280023473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a683066646566366166633961653262366381024e73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a6836356234396161336263356434393136820289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a686265643565656631393135333063633383028c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a683733343431616137643561616338363184027e3c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173683a3a6866313031323732386365373032323764850281013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6830316333386330613937386565316132860288013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4d616b655061796d656e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f7061796d656e743a3a68363139313938343438626364636535398702483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6835643061373731396530373135343637880291013c73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e496e697469616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a686263653862373630336434383762613089024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68363162653461373530356262373662658a023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68306433363162653734663931396633618b024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68656566623665313461326533326666328c023d73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a616c6c5f766f746572733a3a68353262343038613865363763376630358d023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a68613261336630666435656465303333358e02b5023c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572496e666f3c3c3c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a68346365623639653138663131333339338f023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6839393964396238646138633331613839900291013c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e2061732073726d6c5f636f756e63696c3a3a4f6e4d656d626572734368616e6765643c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6d656d626572735f6368616e6765643a3a68626165626438616330656462313561629102c1013c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572733c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3e3a3a6765743a3a686636306262343236303735353134643892024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831343736336633383532313236366166930291013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a68343732376664363632623638383933619402b5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68646130316166643635373932373538329502723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383862356433623533356662643738379602c2013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c436f6e746578743e3e3a3a636865636b3a3a683036653564313134313734396336623097023573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a68636461343636313732363935303962329802633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a686431646632373534313466366664326599025f3c73726d6c5f62616c616e6365733a3a43616c6c3c542c493e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68346362313634363335393462393532389a02633c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68396631643662393862653761643263339b024373726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a68363937366237623035303866623533349c023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a68613562363662306433323539366664649d02513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68343632616537383636383366626532669e023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68346430633965333565643661663364329f02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6833313735373132313132333835633233a002693c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830316338343363633632306238666165a102693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6831333461663738653338346137626365a202693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6862343163666461376564303937303036a3026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866623838366462613837613133666162a4026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866666636363639376566353239376636a5024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835363536323866646432306635316437a6024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836363833346364613430356432633764a7024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838316166663434383562396538663962a8024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838336238616335356434653661346232a9024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861623830383237656337626438656130aa024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862656565623131663538616539396239ab02513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6835353465656535616338353764643066ac02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835363839613464326237393731653532ad02553c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838373631313638303936383131366166ae026b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6865323933633735663634643061626636af027d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6831666330386437643034626634383931b0026f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6836326264653134663536643062353962b1026f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6864616238623536303035613534306666b2028b0173726d6c5f636f6e74726163743a3a5f494d504c5f454e434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a656e636f64655f746f3a3a6861383261333733366437633236323266b3023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862626464383561363032643039373134b402bc0173726d6c5f636f6e74726163743a3a5f494d504c5f454e434f44455f464f525f526177416c697665436f6e7472616374496e666f3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e74726163743a3a526177416c697665436f6e7472616374496e666f3c436f6465486173682c42616c616e63652c426c6f636b4e756d6265723e3e3a3a656e636f64655f746f3a3a6830303736613438386139383963656165b5023b73726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863393730616532633038646531383034b6024073726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6836623664333738393861383966646630b7024573726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6831356530653963346437396161323135b802703c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e7472616374496e666f4f663c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839333866393561376661383066386139b902703c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744163636f756e74436f756e7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833323031343334336266306266323434ba02713c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835623437343165616434316365623934bb026f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374426c6f636b4761734c696d69743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837653532336438306337633333343732bc026a3c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744d617844657074683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864666161616234353338353461353233bd026f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374437265617465426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836636530396362373239356265656564be026d3c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443616c6c426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861653663643564663437623563663936bf026d3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e74726163744665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830383538386639643632306338306166c0027e73726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a43616c6c3c543e3e3a3a6465636f64653a3a6830643962346233303935336164666131c102880173726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a6465636f64653a3a6837623265656434386238383563613031c202723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837643536313431386431386263333665c3027e73726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a43616c6c3c543e3e3a3a6465636f64653a3a6837393835653335613037616339616431c4023873726d6c5f636f6e74726163743a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a6830613834363432353534326634363832c5024173726d6c5f636f6e74726163743a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a6861656436383936333733373961393039c602416861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a7472795f776974685f63617061636974793a3a6831656136316166333338653832306261c7023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6831373535373533376236336263656262c802483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831333831393434366437653064303262c9022e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6833393364613938653639323439383564ca02453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838363734326534666666666630303164cb0249636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a6831666562313135616361656230666432cc022f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a6836333234636430343836666166656636cd02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6833333437623132303630363137626532ce025d3c73726d6c5f636f6e74726163743a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6830353135393834636235663036343465cf022e73726d6c5f636f6e74726163743a3a6761733a3a6275795f6761733a3a6836363661333430633161383932303333d0023473726d6c5f636f6e74726163743a3a436f6e6669673c543e3a3a7072656c6f61643a3a6834316164653736613335306633316235d1024173726d6c5f636f6e74726163743a3a72656e743a3a7472795f65766963745f6f725f616e645f7061795f72656e743a3a6834323138616332613764663135623736d202593c6e6f64655f72756e74696d653a3a43616c6c2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862626638633431636165653434313765d302aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6861663162323439316632316436306638d4023573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a6835366637353766356337656262646466d5023673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6833343638386266303463643066363137d6023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6831653535316635373736306166383030d7023873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6163636f756e745f6e6f6e63653a3a6835616137393765343961623139373366d80230636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6864383935313939363031376332386466d902643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6837326364353931616639636132323162da028d0173726d6c5f73797374656d3a3a5f494d504c5f454e434f44455f464f525f4576656e745265636f72643a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f73797374656d3a3a4576656e745265636f72643c452c543e3e3a3a656e636f64655f746f3a3a6838323837396666306663333164326230db02443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6863333464643934323638613031353930dc02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830393762623431386138383864633836dd027e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6831306637373263333663646337343331de023973726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6838666439616539396365306433653365df023e73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6833376561333837666563663834386238e0024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a6831376563653461336162623566643336e1024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836393735623434353263653664613731e202693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866363537326462303239613532303539e3026e3c73726d6c5f73797374656d3a3a5f5f4765744279746553747275637452616e646f6d4d6174657269616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865396561333661373034663364333732e4023373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6832333262613534633836316662643139e50288013c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6865613363376233363363383231313966e6023c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6865633138323463353265366161373461e7024173726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6861376537396265333130613633373935e8024673726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6863316561623737313962613238396561e902703c73726d6c5f74696d657374616d703a3a5f5f476574427974655374727563744d696e696d756d506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832643835666531326337646634366261ea025e3c73726d6c5f74696d657374616d703a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6864626661323637383662393436396336eb0234636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a6836396461666637393039373061313131ec02753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6862386336353535306336313834396538ed0286013c73726d6c5f6772616e6470613a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6861333436363963343964393361643239ee023773726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6863656665626663343965636232336532ef023b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6830646337636465646430343838646565f0023e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a6830353763643235373336633566323161f102406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a6833303966626664316235383230343331f202416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a6835313638376461316431373635363336f302426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a6830313034353861633265346163316633f402416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a6837306531373138353463393136636462f502416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a6831616430376264623933343831383832f602436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a6835336535366433356462663934383238f702416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c3a3a6864663564313939396433366136323231f802496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f6d6f74696f6e733a3a6864613933353738393165313134333763f902416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a6833353338356331323036326335363830fa02426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a6864346339636463356334633366393333fb02426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e74726163743a3a6839613734613861663361393964663838fc025d3c73726d6c5f74726561737572793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6831363430633263376565613064643238fd02653c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862363465326662356639636662646265fe02453c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a6765743a3a6831306235373565303766633764306438ff02573c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a776569676874733a3a576569676861626c653e3a3a7765696768743a3a6861393836303337636335303561333732800339636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a686237636163326533636430336665653681033f73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683333633630393633646361383235656482034473726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683563633437316233666233343232366283033a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686361353835346539613437333536373684033c73726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a686333633031393532613965623234653485034173726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683966373733386635663264626264616386033773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68643361353435376133303436313365348703613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683862633436363235383930393364366188030c436f72655f76657273696f6e890312436f72655f657865637574655f626c6f636b8a037973726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a696e697469616c697a655f626c6f636b3a3a68376233366163313939613337393135378b034173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a68613533393833653538653062636430648c036c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a68363130383336343662393432383739388d03810173726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a68303635373131643530343264336366398e0387013c73726d6c5f74726561737572793a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68643434613665343736396233643037348f036c3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6834366464366662356238333562393731900315436f72655f696e697469616c697a655f626c6f636b9103114d657461646174615f6d657461646174619203603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68613366393836333937346566363933659303433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68356261663237376630323439353930399403623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68633139393633623465353564366132629503623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68636130653235643436326465303339619603623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683434666466653133623032306564633697031c426c6f636b4275696c6465725f6170706c795f65787472696e73696398031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b990320426c6f636b4275696c6465725f696e686572656e745f65787472696e736963739a033873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a68633264616634656231393762336433329b031c426c6f636b4275696c6465725f636865636b5f696e686572656e74739c0318426c6f636b4275696c6465725f72616e646f6d5f736565649d032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e9e03214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b65729f03214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765a0034e73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573743c486173683e3a3a636f6e766572745f66697273743a3a6836366333363234366332653461666564a103204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765a2031e4772616e6470614170695f6772616e6470615f617574686f726974696573a30315417572614170695f736c6f745f6475726174696f6ea40313417572614170695f617574686f726974696573a5037a3c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a7b7b636c6f737572657d7d3a3a6830633830656137323332346530373965a6033b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832366562646163613532656363613561a7034073726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6835393339323736626561306163656166a8034573726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6839663139653639643062656237313738a9036d3c73726d6c5f74726561737572793a3a5f5f476574427974655374727563745370656e64506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836306239646532646139656632343639aa033673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a6865666535383230393831636338313263ab03960173726d6c5f74726561737572793a3a5f494d504c5f4445434f44455f464f525f50726f706f73616c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f74726561737572793a3a50726f706f73616c3c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6861396236356662323336616562633266ac03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835373062333834306365353164316338ad033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6861646235326434323663363837373737ae034373726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833366464326631646134636339643265af034873726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838383137333832346434613662363731b0034d73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6861646238366366633866623461333036b103703c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a5f5f47657442797465537472756374566f74696e673c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862366262393764653065346336306438b2033a73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837616532366131643234643932326237b3033f73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6831306132303733303438396137353732b4034473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6866363865306666626566326438646465b503483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6832363635303738306162303339663662b603d6013c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a566f74696e673c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a566f7465733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6864363432643232336231656163383566b703443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865636634353031353263396337333939b8034273726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a69735f636f756e63696c6c6f723a3a6832383539316166633763383138613038b9033a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835613734376161303337613130323730ba033f73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6865663337623938613262616336636165bb034473726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6833646333393663383139373062623730bc033073726d6c5f636f6e74726163743a3a657865633a3a7472616e736665723a3a6836623662363532303861393239356436bd0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6866656635303035393964613961653264be03467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a6834633238383839393133366536353162bf034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6835313966313864636237326261336539c003397761736d695f76616c69646174696f6e3a3a76616c69646174655f6d656d6f72795f747970653a3a6865366631393266326664613039643832c103347761736d695f76616c69646174696f6e3a3a657870725f636f6e73745f747970653a3a6861656163356431346336623830396639c203553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863326134356666353061376161396539c303473c7761736d695f76616c69646174696f6e3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6866353933393766323137613636373964c4034a7761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a737465703a3a6832666537613565366332363331356661c503457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6837623865636664383363666165356131c60348616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6830656462363861303163356265306337c7033c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a6834323534626164656230616363376166c803537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a6863663565633265313765663537323035c903a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a6830353536356238326665343262306538ca033a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a6830316332396565616463663335313062cb032d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a6830393332363436363438313361366335cc03507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a6838643061356230363637363139613838cd033c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a6831636436386663336433373839336439ce03347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f6c6162656c3a3a6863626562643038326466356364303865cf03547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f73746f72653a3a6862643739363133313339343332383965d003347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f76616c75653a3a6833313763366332356339306365653430d103537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6c6f61643a3a6834393035633532663833363531346161d203547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f72656c6f703a3a6837353761346463393739376562316230d303557761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f746573746f703a3a6864346366646335333561663030633362d403547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f62696e6f703a3a6838633331313330663565623336316632d503407761736d695f76616c69646174696f6e3a3a7574696c3a3a4c6f63616c733a3a747970655f6f665f6c6f63616c3a3a6831386566303365653833303566666561d603537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f756e6f703a3a6838353331303135666166633861336431d703547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6376746f703a3a6833613733343330326264616561376664d803553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a426c6f636b5479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839346532626165616538343162313330d9034e3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6835613733643831626162386430626264da03543c7761736d695f76616c69646174696f6e3a3a66756e633a3a537461636b56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862373235313739336638363630383535db0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6836613038356231346265396435633734dc033b636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a6836303961663164643666613232333735dd032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6865363865663431386238643863316331de0339636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a6835313334393661303431643563636232df034c3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832666536663963363630326265346663e003303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837326234353830626637326537303332e103453c616c6c6f633a3a737472696e673a3a537472696e6720617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6863663738346335653363613266373731e20323636f72653a3a666d743a3a77726974653a3a6836646264346536386638373035323231e30341707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6864366233373132356536666366663333e403323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6835653966383665363861346464343266e5033f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6835396131346330396137303930383238e603613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6865316438363535626666663531343030e703533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6839626638343738306239303233323334e80333636f72653a3a6f7074696f6e3a3a4f7074696f6e3c26543e3a3a636c6f6e65643a3a6861333566626630386639653461636131e90346707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6865663534363634346336306434623135ea034b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6865646435396332323933383537653261eb03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831643539383166653938316462313737ec03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834626661363434626431393266666236ed03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837613536343663303430373264333733ee03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837646638663737353332306532373734ef03463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6861363537336135373632656161343632f003303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832633037393736363432656561653630f103303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864323138616636666239353832313839f2039c0173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f7261676546756e6374696f6e547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f7261676546756e6374696f6e547970653e3a3a656e636f64655f746f3a3a6836653731323166623136653532633661f303423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6836323336336636653364383535303264f403623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6830613634326534663332376539616135f50311727573745f626567696e5f756e77696e64f6034e73725f696f3a3a696d703a3a6578743a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6832333837396334613931313463373565f7030a5f5f72675f616c6c6f63f8030c5f5f72675f6465616c6c6f63f9030c5f5f72675f7265616c6c6f63fa03115f5f72675f616c6c6f635f7a65726f6564fb032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6864653239343433393239313531623639fc033e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835313235643164306563633239393130fd033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6839353965666131623335626366643438fe033b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6835343638363039306564663265396539ff033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6833636663653965373133323661336239800430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68303031396461623065383937633336378104313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6834613532623136633830303234616261820443636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a683432386265353039346339343164336383042e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a683164313363613733343265626666353384044a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68316436363734336535623538343039638504323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686431393739333162373737643337336386043d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a683531623662343337336438653836356287044e636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68316665623131356163616562306664322e31393039880434636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a686364353964306437623539306436323289042e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a68363461663862323537393838646230348a048001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a68656163303763393531626335663764648b04533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68366538633033663965636631646139308c0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68333430303565383966626464336335388d042f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a68313532633662643433626438333336308e042e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a68623730623339363562646162393237308f0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683031343735323165623962333830323190043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a686366366133663535383139656366646491043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a683138313637396666343166303265313792043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68623438316365373666653862323234389304066d656d7365749404066d656d6370799504076d656d6d6f76659604066d656d636d709704095f5f756469767469339804085f5f6d756c7469339904095f5f6173686c7469339a04095f5f6c7368727469339b040c5f5f756469766d6f6474693400590970726f64756365727302086c616e677561676501045275737404323031380c70726f6365737365642d62790105727573746325312e33372e302d6e696768746c79202834303062343039656620323031392d30362d303929",
+			"0x5286264f4d2ddb5a0d2950bf3bcfb9f6": "0x10000000000000000000000000000000",
+			"0x6d5b60e78cadb1cc37887b7ee4a5ab10": "0x00000000",
+			"0x24586f4898a5a637b755b658ec163d00": "0x00407a10f35a00000000000000000000",
+			"0xabe32953315ab8fe7b2b925eba5f4c80": "0x00e40b54020000000000000000000000",
+			"0x52c9048efbfc40fd1e312b7bed451dee": "0x06000000",
+			"0x90d5871cf3f4d0a3642cf2043a7d8eda": "0x0010a5d4e80000000000000000000000",
 			"0x6e45a8645fa8f905c49fecfef3d06c67": "0x01000000",
-			"0x3a6772616e6470613a617574683a00000000": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993320100000000000000",
-			"0xa5e869ecc1b914a6b0cf5f02b874f5eb90f1739fbd3edd01e5835d1517fd9f72": "0x781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276",
-			"0x46cef122497fefa60faf6c66d3ef05caf9870446796ae11f0a4f734fee993d8b": "0x00",
-			"0x51322b89410377cf0f1bdeeafd212f07": "0xe8030000000000000000000000000000",
-			"0x34de7fc8c73e4252b9e09a9e3bf602f8": "0x6400000000000000",
-			"0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000",
-			"0xbf18c0c65fb39f32ee7c8016685c0a6056f8f924192efb2655be9a692d0b03b6": "0x00",
+			"0x4e62513de81454ce76df887573f7f98b101eb4585b1485a222b7db599f4e93e2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f",
+			"0x3ae31af9a378162eb2736f26855c9ad8": "0x4545454545454545454545454545454545454545454545454545454545454545",
 			"0xbc3717660105a864bd63dcd430de64128d58bd0917fa8dd75aee827cf086e19c": "0x0000c16ff28623000000000000000000",
-			"0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000",
-			"0x7935e46f94f24b82716c0142e2271de9": "0x8070000000000000",
-			"0x3a617574683a02000000": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440",
-			"0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000",
-			"0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300",
-			"0x656abc4530eb4c1692051ca24c867220aa8d62e4a9686b432f760de7455e8f95": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440",
-			"0x24586f4898a5a637b755b658ec163d00": "0x00407a10f35a00000000000000000000",
-			"0x7e6064dc0e78ffebb59b3053826a9467": "0x10781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc152666bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f",
+			"0x68c8d2f39c4605e65218c22c5664917047e4900c797b7dd33999d94213c75049": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f",
+			"0x53d1471b684c8a776c80353e5981c960": "0x00407a10f35a00000000000000000000",
 			"0x1ba14d232d3c301a93e35f55e3d7aef2d98dbb9cc0ce48f457b81b421e0f704d": "0x0000c16ff28623000000000000000000",
+			"0xa5e869ecc1b914a6b0cf5f02b874f5eb90f1739fbd3edd01e5835d1517fd9f72": "0x781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276",
+			"0x717a2ee9c64ad3424e10e4461ec08296": "0x000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000400000000000100100000000020000000",
+			"0x26ac4a74e1ba94e0e7dbfc3b2aea083cf3c0f0d80eb999c7cebb340ee8934da9": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde780f0000c16ff286230f0000c16ff2862300",
+			"0xf4039aa8ae697861be900c58239e96f7": "0x0010a5d4e80000000000000000000000",
+			"0x3229a363ad5159bc2c48c9558128f00d2646f3a058cadf32077e9c9d9cca483f": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f",
+			"0xdd9b01f8462dc19488279cb351a6d861": "0x20a10700",
+			"0xd8bc278604e9f924a948f47f58be8f89": "0x04000000000000000000000000000000",
+			"0x62f532424b7b1c52f522857315040f27": "0x00407a10f35a00000000000000000000",
+			"0xfa8e9950d581fc080f26110dde7c7fd8": "0x109becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993327932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce4403919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef",
+			"0xb9b861cab4bbce870c811515bd5f33d7": "0x00",
+			"0xc63b8a0db7e72fd87c88d8dcf4777b883f86728613c57148c4e5cdceb05b7a1a": "0x0c0001f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78",
+			"0x5e0766c2f9e49ff3d748bdbde578a8fd": "0x0080f420e6b500000000000000000000",
+			"0x633daafcb669e97549c1b9d65660881016f969040bc16171709159437c31294a": "0x0f0000c16ff286230f0000c16ff2862300",
+			"0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000",
+			"0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x1066bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276",
+			"0x9651d20f401bfac47731a01d6eba33b4": "0x00000000",
 			"0x71020fee971bd00e8248d1830b8cffbe5b9cf4de1ea2911a1665c44fd70ab6f3": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630f0000c16ff286230f0000c16ff2862300",
-			"0x4ac2684a5a20e7a5adf17ed7aa792a3f6334a0505f02b2a44c3934d36cc4ee0a": "0xc8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e",
-			"0x0c5cbeca89340ea96c6f8fe1442df463": "0x0010a5d4e80000000000000000000000",
-			"0x1b4b2c8255b431edbbb5a4f5c7dcde69": "0x0010a5d4e80000000000000000000000",
-			"0x3a6772616e6470613a617574683a6c656e": "0x04000000",
-			"0x3a617574683a6c656e": "0x04000000",
+			"0x2b334d6ac6698775ed17edf8cd3cbd9dae56cead0d69cb54f6af6aaecba544d8": "0x0f0000c16ff286230f0000c16ff2862300",
 			"0xe7ea0ae62a742dc4e1a569cdb99af499": "0x0200000000000000",
-			"0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000",
-			"0x50a63a871aced22e88ee6466fe5aa5d9": "0x9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809",
-			"0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0c0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12",
-			"0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x1066bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276",
-			"0x3a6772616e6470613a617574683a03000000": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef0100000000000000",
-			"0x3a617574683a01000000": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f",
-			"0xca0bd0e7fdd2e3998e5245f7c228191c": "0x96000000000000000000000000000000",
+			"0x1b4b2c8255b431edbbb5a4f5c7dcde69": "0x0010a5d4e80000000000000000000000",
 			"0xf718f07ec955fb94f1b3069713461089": "0x0010a5d4e80000000000000000000000",
-			"0x99e2aba8a2b7c8ccba2d740fb86adb0c": "0x00",
-			"0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000",
-			"0x52c9048efbfc40fd1e312b7bed451dee": "0x06000000",
-			"0x2b334d6ac6698775ed17edf8cd3cbd9dae56cead0d69cb54f6af6aaecba544d8": "0x0f0000c16ff286230f0000c16ff2862300",
+			"0x3b7d32346a3315a351084927a27d06a7": "0x0010a5d4e80000000000000000000000",
 			"0xbde3e43a2a348359d103d64bc95928146bdd9ae3490e26da38d2e4d19c137507": "0x0000a0dec5adc9353600000000000000",
-			"0x7c79972b34b7e51bdd5f168ba3accd35fbec396be75dfad19dd1121327f1a1ad": "0x0c000168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde7800",
+			"0x2b89d3b6f46fc8a3aee48c9cb06d7670": "0x0010a5d4e80000000000000000000000",
+			"0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000",
+			"0xcf9a75deea0508104cd993c82daf57d3": "0x8096980000000000",
+			"0xfbb77d814ac81cfe0ef7030e8bd686f0": "0xe803000000000000",
+			"0xca0bd0e7fdd2e3998e5245f7c228191c": "0x96000000000000000000000000000000",
+			"0x579ab55d37b1220812be3c3df29d4858": "0x00000000",
+			"0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000",
+			"0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000",
+			"0x27b3872d47181b4a2dc15f0da43e7026": "0xe803000000000000",
+			"0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000",
+			"0xc98362e2ca21b342cc749022ed9b560e4d29ec9862a960c2538c314f1d279635": "0x149ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e3180973474718099c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663",
+			"0x92f53c21a80e624b3c606bc8ec0ce2a3003c4fe385bed33998bf4dc79b8970f2": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d650f0000c16ff286230f0000c16ff2862300",
+			"0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0c0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12",
+			"0x6c7945a333fd28e51af43324746da2a45fd6a74613dcd61c6430fee856b550f8": "0x10809becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332807932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f805633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440803919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef",
+			"0x934302c5ec4cb4f73a395e2184ab0aa6": "0x00e40b54020000000000000000000000",
+			"0xfd0cbba69a04d769ddcdbb15f5123c98041978f5241f33f78f62b48e3a02b740": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f",
+			"0x8b4621d5f16433d6024b5a31547c59ee24e749e051dbb4bc7e64502f2a4f62fb": "0x66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f",
+			"0x799192c17c5cc562d709af11ace92e6a": "0x00040000",
+			"0x2d5205eddfc20f1a616c0391abb78a3920e823abe7ed33cfd7945dd1a1bf8651": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f",
+			"0xbf18c0c65fb39f32ee7c8016685c0a6056f8f924192efb2655be9a692d0b03b6": "0x00",
+			"0x637414312dac3b280120bf15b4f66cee": "0x00000000",
+			"0x2dce29f1a768624dc5343063cb77f77d": "0x07000000",
+			"0xa36baa0f89eff09b2facf282f27a11ba": "0x50c30000",
+			"0x51322b89410377cf0f1bdeeafd212f07": "0xe8030000000000000000000000000000",
+			"0x4517a8f9aafb0668d19c3cef51a8367afeda7eb83c7edcc4752585e5a496935e": "0x10809becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332807932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f805633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440803919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef",
+			"0x50a63a871aced22e88ee6466fe5aa5d9": "0x9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809",
+			"0x0c5cbeca89340ea96c6f8fe1442df463": "0x0010a5d4e80000000000000000000000",
 			"0x0e4944cfd98d6f4cc374d16f5a4e3f9c": "0x0000000000000000",
-			"0x3b7d32346a3315a351084927a27d06a7": "0x0010a5d4e80000000000000000000000"
+			"0xc1fdc3d212357bc2fa98f2a77b941f0c": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d6568655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde789c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12",
+			"0xe18ad90fcd74459141a97efeed86f463": "0x08000000",
+			"0xfff675c76ad8a5dfbd7db9a4e80f7c0ece595ad1878d2b6fca6086b2483a055b": "0x0000c16ff28623000000000000000000",
+			"0xa8e78ad25e03ac0281ec709fd3f128efb7e112239d0a7c3e1c86375109bff334": "0x4545454545454545454545454545454545454545454545454545454545454545",
+			"0x7935e46f94f24b82716c0142e2271de9": "0x8070000000000000",
+			"0x7e6064dc0e78ffebb59b3053826a9467": "0x10781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc152666bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f",
+			"0x8cb577756012d928f17362e0741f9f2c": "0x0100000000000000",
+			"0x154ebcb2c318b2e1c23e43e65aea27cd1348c4c5157502d7669a31c7635019cc": "0x9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526",
+			"0x96f2cbaf8156f12db4af0b59d3e56f8f": "0x0010a5d4e80000000000000000000000",
+			"0x24b2518f9a9ee24ab0b62346d83d90b0": "0x11080000",
+			"0xbd393c7a86c2574659297d84a8c369613134cd3b80b8b92f816e3ff845991bf4": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993329becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332",
+			"0x8366297e853b97a38cca0f62019a717b": "0x00000000000000000000000000000000",
+			"0x90e2849b965314409e8bc00011f3004f": "0x04000000",
+			"0x46cef122497fefa60faf6c66d3ef05caf9870446796ae11f0a4f734fee993d8b": "0x00",
+			"0x3a65787472696e7369635f696e646578": "0x00000000",
+			"0xccea67b51b4fa33ecbff70a8977ad91d9c60d620f3ab5ac9626dea15cde023b7": "0x0f0000c16ff286230f0000c16ff2862300"
 		}
 	}
 }
-- 
GitLab


From 5ef542a0343fdedc1305554c467098abdc44e51c Mon Sep 17 00:00:00 2001
From: mattrutherford <44339188+mattrutherford@users.noreply.github.com>
Date: Mon, 17 Jun 2019 22:04:29 +0100
Subject: [PATCH 127/140] Remove uses of Error::description() use Display
 instead (#2887)

* Remove all uses of Error::description() - use Display instead
---
 core/client/db/src/utils.rs    |  2 +-
 core/rpc/src/author/error.rs   |  4 ++--
 core/util/fork-tree/src/lib.rs | 18 +++++++-----------
 3 files changed, 10 insertions(+), 14 deletions(-)

diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs
index bd7cf660ea..a0b955a1a2 100644
--- a/core/client/db/src/utils.rs
+++ b/core/client/db/src/utils.rs
@@ -190,7 +190,7 @@ 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::Error::Backend(err.description().into())
+	client::error::Error::Backend(format!("{}", err))
 }
 
 /// Open RocksDB database.
diff --git a/core/rpc/src/author/error.rs b/core/rpc/src/author/error.rs
index 008a70b674..82ace88b84 100644
--- a/core/rpc/src/author/error.rs
+++ b/core/rpc/src/author/error.rs
@@ -33,7 +33,7 @@ pub enum Error {
 	/// Transaction pool error,
 	Pool(txpool::error::Error),
 	/// Verification error
-	#[display(fmt="Extrinsic verification error: {}", "_0.description()")]
+	#[display(fmt="Extrinsic verification error: {}", _0)]
 	Verification(Box),
 	/// Incorrect extrinsic format.
 	#[display(fmt="Invalid extrinsic format")]
@@ -85,7 +85,7 @@ impl From for rpc::Error {
 			},
 			Error::Verification(e) => rpc::Error {
 				code: rpc::ErrorCode::ServerError(VERIFICATION_ERROR),
-				message: e.description().into(),
+				message: format!("Verification Error: {}", e).into(),
 				data: Some(format!("{:?}", e).into()),
 			},
 			Error::Pool(PoolError::InvalidTransaction(code)) => rpc::Error {
diff --git a/core/util/fork-tree/src/lib.rs b/core/util/fork-tree/src/lib.rs
index 4b6745a354..7a2e2f422a 100644
--- a/core/util/fork-tree/src/lib.rs
+++ b/core/util/fork-tree/src/lib.rs
@@ -37,21 +37,17 @@ pub enum Error {
 
 impl fmt::Display for Error {
 	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-		use std::error::Error;
-		write!(f, "{}", self.description())
+		let message = match *self {
+			Error::Duplicate => "Hash already exists in Tree".into(),
+			Error::UnfinalizedAncestor => "Finalized descendent of Tree node without finalizing its ancestor(s) first".into(),
+			Error::Revert => "Tried to import or finalize node that is an ancestor of a previously finalized node".into(),
+			Error::Client(ref err) => format!("Client error: {}", err),
+		};
+		write!(f, "{}", message)
 	}
 }
 
 impl std::error::Error for Error {
-	fn description(&self) -> &str {
-		match *self {
-			Error::Duplicate => "Hash already exists in Tree",
-			Error::UnfinalizedAncestor => "Finalized descendent of Tree node without finalizing its ancestor(s) first",
-			Error::Revert => "Tried to import or finalize node that is an ancestor of a previously finalized node",
-			Error::Client(ref err) => err.description(),
-		}
-	}
-
 	fn cause(&self) -> Option<&dyn std::error::Error> {
 		None
 	}
-- 
GitLab


From c91d9952bd43064bef193170387ed497f57c42f0 Mon Sep 17 00:00:00 2001
From: Toralf Wittner 
Date: Tue, 18 Jun 2019 10:35:28 +0200
Subject: [PATCH 128/140] Change `network::sync::extra_requests` to not send.
 (#2890)

* Change network::sync::extra_requests to not send.

Instead it only maintains the invariants and leaves the actual I/O part
to the parent module (i.e. `sync`).

* Update Cargo.lock.
---
 Cargo.lock                                    |  13 +
 core/network/Cargo.toml                       |   2 +
 core/network/src/protocol.rs                  |   3 +-
 core/network/src/protocol/sync.rs             | 137 ++--
 .../src/protocol/sync/extra_requests.rs       | 628 +++++++++---------
 5 files changed, 413 insertions(+), 370 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 70780e409c..4f9a55e87d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2733,6 +2733,17 @@ name = "quick-error"
 version = "1.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "quickcheck"
+version = "0.8.5"
+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)",
+ "log 0.4.6 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "quote"
 version = "0.6.12"
@@ -4280,6 +4291,7 @@ dependencies = [
  "lru-cache 0.1.2 (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.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quickcheck 0.8.5 (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)",
  "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -5896,6 +5908,7 @@ dependencies = [
 "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 quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9c35d9c36a562f37eca96e79f66d5fd56eefbc22560dacc4a864cabd2d277456"
 "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"
diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml
index 832a9dda88..56a69039c3 100644
--- a/core/network/Cargo.toml
+++ b/core/network/Cargo.toml
@@ -46,6 +46,8 @@ zeroize = "0.6.0"
 [dev-dependencies]
 env_logger = { version = "0.6" }
 keyring = { package = "substrate-keyring", path = "../../core/keyring" }
+quickcheck = "0.8.5"
+rand = "0.6.5"
 test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" }
 test_runtime = { package = "substrate-test-runtime", path = "../../core/test-runtime" }
 consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common", features = ["test-helpers"] }
diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs
index 4b300e7a3e..13be819fae 100644
--- a/core/network/src/protocol.rs
+++ b/core/network/src/protocol.rs
@@ -765,8 +765,7 @@ impl, H: ExHashT> Protocol {
 			let outcome = self.sync.on_block_justification_data(
 				&mut ProtocolContext::new(&mut self.context_data, network_out),
 				peer,
-				request,
-				response,
+				response
 			);
 
 			if let Some((origin, hash, nb, just)) = outcome {
diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs
index 751e3f872e..a6d87f33ff 100644
--- a/core/network/src/protocol/sync.rs
+++ b/core/network/src/protocol/sync.rs
@@ -40,7 +40,7 @@ use client::{BlockStatus, ClientInfo};
 use consensus::{BlockOrigin, import_queue::{IncomingBlock, SharedFinalityProofRequestBuilder}};
 use client::error::Error as ClientError;
 use blocks::BlockCollection;
-use extra_requests::ExtraRequestsAggregator;
+use extra_requests::ExtraRequests;
 use runtime_primitives::traits::{
 	Block as BlockT, Header as HeaderT, NumberFor, Zero, One,
 	CheckedSub, SaturatedConversion
@@ -89,7 +89,7 @@ pub trait Context {
 	fn send_block_request(&mut self, who: PeerId, request: message::BlockRequest);
 }
 
-#[derive(Debug)]
+#[derive(Debug, Clone)]
 pub(crate) struct PeerSync {
 	pub common_number: NumberFor,
 	pub best_hash: B::Hash,
@@ -98,8 +98,8 @@ pub(crate) struct PeerSync {
 	pub recently_announced: VecDeque,
 }
 
-#[derive(Debug)]
 /// Peer sync status.
+#[derive(Debug)]
 pub(crate) struct PeerInfo {
 	/// Their best block hash.
 	pub best_hash: B::Hash,
@@ -129,16 +129,17 @@ pub(crate) enum PeerSyncState {
 
 /// Relay chain sync strategy.
 pub struct ChainSync {
-	_genesis_hash: B::Hash,
 	peers: HashMap>,
 	blocks: BlockCollection,
 	best_queued_number: NumberFor,
 	best_queued_hash: B::Hash,
 	role: Roles,
 	required_block_attributes: message::BlockAttributes,
-	extra_requests: ExtraRequestsAggregator,
+	extra_finality_proofs: ExtraRequests,
+	extra_justifications: ExtraRequests,
 	queue_blocks: HashSet,
 	best_importing_number: NumberFor,
+	request_builder: Option>,
 }
 
 /// Reported sync state.
@@ -179,26 +180,26 @@ impl Status {
 
 impl ChainSync {
 	/// Create a new instance. Pass the initial known state of the chain.
-	pub(crate) fn new(
-		role: Roles,
-		info: &ClientInfo,
-	) -> Self {
-		let mut required_block_attributes = message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION;
+	pub(crate) fn new(role: Roles, info: &ClientInfo) -> Self {
+		let mut required_block_attributes =
+			message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION;
+
 		if role.is_full() {
 			required_block_attributes |= message::BlockAttributes::BODY;
 		}
 
 		ChainSync {
-			_genesis_hash: info.chain.genesis_hash,
 			peers: HashMap::new(),
 			blocks: BlockCollection::new(),
 			best_queued_hash: info.chain.best_hash,
 			best_queued_number: info.chain.best_number,
-			extra_requests: ExtraRequestsAggregator::new(),
+			extra_finality_proofs: ExtraRequests::new(),
+			extra_justifications: ExtraRequests::new(),
 			role,
 			required_block_attributes,
 			queue_blocks: Default::default(),
 			best_importing_number: Zero::zero(),
+			request_builder: None,
 		}
 	}
 
@@ -499,9 +500,9 @@ impl ChainSync {
 		&mut self,
 		protocol: &mut dyn Context,
 		who: PeerId,
-		_request: message::BlockRequest,
 		response: message::BlockResponse,
-	) -> Option<(PeerId, B::Hash, NumberFor, Justification)> {
+	) -> Option<(PeerId, B::Hash, NumberFor, Justification)>
+	{
 		let peer = if let Some(peer) = self.peers.get_mut(&who) {
 			peer
 		} else {
@@ -522,12 +523,8 @@ impl ChainSync {
 						protocol.disconnect_peer(who);
 						return None;
 					}
-
-					return self.extra_requests.justifications().on_response(
-						who,
-						response.justification,
-					);
-				},
+					return self.extra_justifications.on_response(who, response.justification)
+				}
 				None => {
 					// we might have asked the peer for a justification on a block that we thought it had
 					// (regardless of whether it had a justification for it or not).
@@ -536,7 +533,7 @@ impl ChainSync {
 						hash,
 					);
 					return None;
-				},
+				}
 			}
 		}
 
@@ -574,10 +571,7 @@ impl ChainSync {
 				return None;
 			}
 
-			return self.extra_requests.finality_proofs().on_response(
-				who,
-				response.proof,
-			);
+			return self.extra_finality_proofs.on_response(who, response.proof)
 		}
 
 		self.maintain_sync(protocol);
@@ -603,13 +597,47 @@ impl ChainSync {
 		for peer in peers {
 			self.download_new(protocol, peer);
 		}
-		self.extra_requests.dispatch(&mut self.peers, protocol);
+		self.tick(protocol)
 	}
 
 	/// Called periodically to perform any time-based actions. Must be called at a regular
 	/// interval.
 	pub fn tick(&mut self, protocol: &mut dyn Context) {
-		self.extra_requests.dispatch(&mut self.peers, protocol);
+		self.send_justification_requests(protocol);
+		self.send_finality_proof_request(protocol)
+	}
+
+	fn send_justification_requests(&mut self, protocol: &mut dyn Context) {
+		let mut matcher = self.extra_justifications.matcher();
+		while let Some((peer, request)) = matcher.next(&self.peers) {
+			self.peers.get_mut(&peer)
+				.expect("`Matcher::next` guarantees the `PeerId` comes from the given peers; qed")
+				.state = PeerSyncState::DownloadingJustification(request.0);
+			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 send_finality_proof_request(&mut self, protocol: &mut dyn Context) {
+		let mut matcher = self.extra_finality_proofs.matcher();
+		while let Some((peer, request)) = matcher.next(&self.peers) {
+			self.peers.get_mut(&peer)
+				.expect("`Matcher::next` guarantees the `PeerId` comes from the given peers; qed")
+				.state = PeerSyncState::DownloadingFinalityProof(request.0);
+			protocol.send_finality_proof_request(peer, message::generic::FinalityProofRequest {
+				id: 0,
+				block: request.0,
+				request: self.request_builder.as_ref()
+					.map(|builder| builder.build_request_data(&request.0))
+					.unwrap_or_default()
+			})
+		}
 	}
 
 	/// Request a justification for the given block.
@@ -617,24 +645,22 @@ impl ChainSync {
 	/// 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 dyn Context) {
-		self.extra_requests.justifications().queue_request(
-			(*hash, number),
-			|base, block| protocol.client().is_descendent_of(base, block),
-		);
-
-		self.extra_requests.justifications().dispatch(&mut self.peers, protocol);
+		self.extra_justifications.schedule((*hash, number), |base, block| {
+			protocol.client().is_descendent_of(base, block)
+		});
+		self.send_justification_requests(protocol)
 	}
 
 	/// Clears all pending justification requests.
 	pub fn clear_justification_requests(&mut self) {
-		self.extra_requests.justifications().clear();
+		self.extra_justifications.reset()
 	}
 
 	/// 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) {
 		let finalization_result = if success { Ok((hash, number)) } else { Err(()) };
-		if !self.extra_requests.justifications().on_import_result((hash, number), finalization_result) {
+		if !self.extra_justifications.try_finalize_root((hash, number), finalization_result, true) {
 			debug!(target: "sync", "Got justification import result for unknown justification {:?} {:?} request.",
 				hash,
 				number,
@@ -646,12 +672,10 @@ impl ChainSync {
 	///
 	/// 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 dyn 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);
+		self.extra_finality_proofs.schedule((*hash, number), |base, block| {
+			protocol.client().is_descendent_of(base, block)
+		});
+		self.send_finality_proof_request(protocol)
 	}
 
 	pub fn finality_proof_import_result(
@@ -659,11 +683,11 @@ impl ChainSync {
 		request_block: (B::Hash, NumberFor),
 		finalization_result: Result<(B::Hash, NumberFor), ()>,
 	) {
-		self.extra_requests.finality_proofs().on_import_result(request_block, finalization_result);
+		self.extra_finality_proofs.try_finalize_root(request_block, finalization_result, true);
 	}
 
-	pub fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) {
-		self.extra_requests.finality_proofs().essence().0 = Some(request_builder);
+	pub fn set_finality_proof_request_builder(&mut self, builder: SharedFinalityProofRequestBuilder) {
+		self.request_builder = Some(builder)
 	}
 
 	/// Notify about successful import of the given block.
@@ -673,13 +697,21 @@ impl ChainSync {
 
 	/// Notify about finalization of the given block.
 	pub fn on_block_finalized(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut dyn Context) {
-		if let Err(err) = self.extra_requests.on_block_finalized(
-			hash,
-			number,
-			&|base, block| protocol.client().is_descendent_of(base, block),
-		) {
-			warn!(target: "sync", "Error cleaning up pending extra data requests: {:?}", err);
-		};
+		let r = self.extra_finality_proofs.on_block_finalized(hash, number, |base, block| {
+			protocol.client().is_descendent_of(base, block)
+		});
+
+		if let Err(err) = r {
+			warn!(target: "sync", "Error cleaning up pending extra finality proof data requests: {:?}", err);
+		}
+
+		let r = self.extra_justifications.on_block_finalized(hash, number, |base, block| {
+			protocol.client().is_descendent_of(base, block)
+		});
+
+		if let Err(err) = r {
+			warn!(target: "sync", "Error cleaning up pending extra justification data requests: {:?}", err);
+		}
 	}
 
 	fn block_queued(&mut self, hash: &B::Hash, number: NumberFor) {
@@ -859,7 +891,8 @@ impl ChainSync {
 	pub(crate) fn peer_disconnected(&mut self, protocol: &mut dyn Context, who: PeerId) {
 		self.blocks.clear_peer_download(&who);
 		self.peers.remove(&who);
-		self.extra_requests.peer_disconnected(who);
+		self.extra_justifications.peer_disconnected(&who);
+		self.extra_finality_proofs.peer_disconnected(&who);
 		self.maintain_sync(protocol);
 	}
 
diff --git a/core/network/src/protocol/sync/extra_requests.rs b/core/network/src/protocol/sync/extra_requests.rs
index 589a5d3787..c4f6de05a2 100644
--- a/core/network/src/protocol/sync/extra_requests.rs
+++ b/core/network/src/protocol/sync/extra_requests.rs
@@ -14,294 +14,118 @@
 // 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 crate::protocol::sync::{PeerSync, PeerSyncState};
 use fork_tree::ForkTree;
 use libp2p::PeerId;
-use runtime_primitives::Justification;
+use log::warn;
 use runtime_primitives::traits::{Block as BlockT, NumberFor};
-use crate::protocol::message;
-use crate::protocol::sync::{Context, PeerSync, PeerSyncState};
+use std::collections::{HashMap, HashSet, VecDeque};
+use std::time::{Duration, Instant};
 
 // 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 dyn 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 dyn 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);
-	}
-}
+pub(crate) type ExtraRequest = (::Hash, NumberFor);
 
 /// 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 {
+#[derive(Debug)]
+pub(crate) struct ExtraRequests {
 	tree: ForkTree, ()>,
+	/// requests which have been queued for later processing
 	pending_requests: VecDeque>,
-	peer_requests: HashMap>,
-	previous_requests: HashMap, Vec<(PeerId, Instant)>>,
+	/// requests which are currently underway to some peer
+	active_requests: HashMap>,
+	/// previous requests without response
+	failed_requests: HashMap, Vec<(PeerId, Instant)>>,
+	/// successful requests
 	importing_requests: HashSet>,
-	essence: Essence,
 }
 
-impl> ExtraRequests {
-	fn new(essence: Essence) -> Self {
+impl ExtraRequests {
+	pub(crate) fn new() -> Self {
 		ExtraRequests {
 			tree: ForkTree::new(),
 			pending_requests: VecDeque::new(),
-			peer_requests: HashMap::new(),
-			previous_requests: HashMap::new(),
+			active_requests: HashMap::new(),
+			failed_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
+	/// Reset all state as if returned from `new`.
+	pub(crate) fn reset(&mut self) {
+		self.tree = ForkTree::new();
+		self.pending_requests.clear();
+		self.active_requests.clear();
+		self.failed_requests.clear();
 	}
 
-	/// 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 dyn 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(),
-		);
+	/// Returns an iterator-like struct that yields peers which extra
+	/// requests can be sent to.
+	pub(crate) fn matcher(&mut self) -> Matcher {
+		Matcher::new(self)
 	}
 
-	/// Queue a extra data request (without dispatching it).
-	pub(crate) fn queue_request(&mut self, request: ExtraRequest, is_descendent_of: F)
+	/// Queue an extra data request to be considered by the `Matcher`.
+	pub(crate) fn schedule(&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) {
+		match self.tree.import(request.0, request.1, (), &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));
-			},
+				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;
-			},
-			_ => {},
+				warn!(target: "sync", "Failed to insert request {:?} into tree: {:?}", request, 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);
+	pub(crate) fn peer_disconnected(&mut self, who: &PeerId) {
+		if let Some(request) = self.active_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)> {
+	/// Processes the response for the request previously sent to the given peer.
+	pub(crate) fn on_response(&mut self, who: PeerId, resp: Option) -> Option<(PeerId, B::Hash, NumberFor, R)> {
 		// 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 {
+		if let Some(request) = self.active_requests.remove(&who) {
+			if let Some(r) = resp {
 				self.importing_requests.insert(request);
-				return Some((who, request.0, request.1, response));
+				return Some((who, request.0, request.1, r))
 			}
-
-			self.previous_requests
-				.entry(request)
-				.or_insert(Vec::new())
-				.push((who, Instant::now()));
+			self.failed_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(
+	/// 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,
+		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(());
+		let request = (*best_finalized_hash, best_finalized_number);
+
+		if self.try_finalize_root::<()>(request, Ok(request), false) {
+			return Ok(())
 		}
 
 		self.tree.finalize(best_finalized_hash, best_finalized_number, &is_descendent_of)?;
@@ -309,121 +133,250 @@ impl> ExtraRequests {
 		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, &())));
+		self.active_requests.retain(|_, (h, n)| roots.contains(&(h, n, &())));
+		self.failed_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(
+	pub(crate) fn try_finalize_root(
 		&mut self,
-		request: (B::Hash, NumberFor),
-		finalization_result: Result<(B::Hash, NumberFor), ()>,
-		reschedule_on_failure: bool,
-	) -> bool {
+		request: ExtraRequest,
+		result: Result, E>,
+		reschedule_on_failure: bool
+	) -> bool
+	{
 		if !self.importing_requests.remove(&request) {
-			return false;
+			return false
 		}
 
-		let (finalized_hash, finalized_number) = match finalization_result {
-			Ok((finalized_hash, finalized_number)) => (finalized_hash, finalized_number),
+		let (finalized_hash, finalized_number) = match result {
+			Ok(req) => (req.0, req.1),
 			Err(_) => {
 				if reschedule_on_failure {
 					self.pending_requests.push_front(request);
 				}
-				return true;
-			},
+				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(),
+			warn!(target: "sync", "Imported {:?} {:?} which isn't a root in the tree: {:?}",
 				finalized_hash,
 				finalized_number,
-				self.tree.roots().collect::>(),
+				self.tree.roots().collect::>()
 			);
-			return true;
-		};
+			return true
+		}
 
-		self.previous_requests.clear();
-		self.peer_requests.clear();
-		self.pending_requests =
-			self.tree.roots().map(|(h, n, _)| (h.clone(), n.clone())).collect();
+		self.failed_requests.clear();
+		self.active_requests.clear();
+		self.pending_requests.clear();
+		self.pending_requests.extend(self.tree.roots().map(|(&h, &n, _)| (h, n)));
 
 		true
 	}
 }
 
-pub(crate) struct JustificationsRequestsEssence;
-
-impl ExtraRequestsEssence for JustificationsRequestsEssence {
-	type Response = Justification;
+/// Matches peers with pending extra requests.
+#[derive(Debug)]
+pub(crate) struct Matcher<'a, B: BlockT> {
+	/// Length of pending requests collection.
+	/// Used to ensure we do not loop more than once over all pending requests.
+	remaining: usize,
+	extras: &'a mut ExtraRequests
+}
 
-	fn type_name(&self) -> &'static str {
-		"justification"
+impl<'a, B: BlockT> Matcher<'a, B> {
+	fn new(extras: &'a mut ExtraRequests) -> Self {
+		Matcher {
+			remaining: extras.pending_requests.len(),
+			extras
+		}
 	}
 
-	fn send_network_request(&self, protocol: &mut dyn 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),
-		})
-	}
+	/// Finds a peer to which a pending request can be sent.
+	///
+	/// Peers are filtered according to the current known best block (i.e. we won't
+	/// send an extra request for block #10 to a peer at block #2), and we also
+	/// throttle requests to the same peer if a previous request yielded no results.
+	///
+	/// This method returns as soon as it finds a peer that should be able to answer
+	/// our request. If no request is pending or no peer can handle it, `None` is
+	/// returned instead.
+	///
+	/// # Note
+	///
+	/// The returned `PeerId` (if any) is guaranteed to come from the given `peers`
+	/// argument.
+	pub(crate) fn next(&mut self, peers: &HashMap>) -> Option<(PeerId, ExtraRequest)> {
+		if self.remaining == 0 {
+			return None
+		}
+
+		// clean up previously failed requests so we can retry again
+		for requests in self.extras.failed_requests.values_mut() {
+			requests.retain(|(_, instant)| instant.elapsed() < EXTRA_RETRY_WAIT);
+		}
+
+		while let Some(request) = self.extras.pending_requests.pop_front() {
+			for (peer, sync) in peers.iter().filter(|(_, sync)| sync.state == PeerSyncState::Available) {
+				// only ask peers that have synced at least up to the block number that we're asking the extra for
+				if sync.best_number < request.1 {
+					continue
+				}
+				// don't request to any peers that already have pending requests
+				if self.extras.active_requests.contains_key(peer) {
+					continue
+				}
+				// only ask if the same request has not failed for this peer before
+				if self.extras.failed_requests.get(&request).map(|rr| rr.iter().any(|i| &i.0 == peer)).unwrap_or(false) {
+					continue
+				}
+				self.extras.active_requests.insert(peer.clone(), request);
+				return Some((peer.clone(), request))
+			}
+
+			self.extras.pending_requests.push_back(request);
+			self.remaining -= 1;
 
-	fn peer_downloading_state(&self, block: B::Hash) -> PeerSyncState {
-		PeerSyncState::DownloadingJustification(block)
+			if self.remaining == 0 {
+				break
+			}
+		}
+
+		None
 	}
 }
 
-pub(crate) struct FinalityProofRequestsEssence(pub Option>);
+#[cfg(test)]
+mod tests {
+	use crate::protocol::sync::PeerSync;
+	use client::error::Error as ClientError;
+	use quickcheck::{Arbitrary, Gen, QuickCheck, StdThreadGen};
+	use rand::Rng;
+	use std::collections::{HashMap, HashSet};
+	use super::*;
+	use test_client::runtime::{Block, BlockNumber, Hash};
+
+	#[test]
+	fn requests_are_processed_in_order() {
+		fn property(mut peers: ArbitraryPeers) {
+			let mut requests = ExtraRequests::::new();
+
+			let num_peers_available = peers.0.values()
+				.filter(|s| s.state == PeerSyncState::Available).count();
 
-impl ExtraRequestsEssence for FinalityProofRequestsEssence {
-	type Response = Vec;
+			for i in 0 .. num_peers_available {
+				requests.schedule((Hash::random(), i as u64), |a, b| Ok(a[0] >= b[0]))
+			}
+
+			let pending = requests.pending_requests.clone();
+			let mut m = requests.matcher();
+
+			for p in &pending {
+				let (peer, r) = m.next(&peers.0).unwrap();
+				assert_eq!(p, &r);
+				peers.0.get_mut(&peer).unwrap().state = PeerSyncState::DownloadingJustification(r.0);
+			}
+		}
 
-	fn type_name(&self) -> &'static str {
-		"finality proof"
+		QuickCheck::with_gen(StdThreadGen::new(19))
+			.quickcheck(property as fn(ArbitraryPeers))
 	}
 
-	fn send_network_request(&self, protocol: &mut dyn 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(),
-		})
+	#[test]
+	fn new_roots_schedule_new_request() {
+		fn property(data: Vec) {
+			let mut requests = ExtraRequests::::new();
+			for (i, number) in data.into_iter().enumerate() {
+				let hash = [i as u8; 32].into();
+				let pending = requests.pending_requests.len();
+				let is_root = requests.tree.roots().any(|(&h, &n, _)| hash == h && number == n);
+				requests.schedule((hash, number), |a, b| Ok(a[0] >= b[0]));
+				if !is_root {
+					assert_eq!(1 + pending, requests.pending_requests.len())
+				}
+			}
+		}
+		QuickCheck::new().quickcheck(property as fn(Vec))
 	}
 
-	fn peer_downloading_state(&self, block: B::Hash) -> PeerSyncState {
-		PeerSyncState::DownloadingFinalityProof(block)
+	#[test]
+	fn disconnecting_implies_rescheduling() {
+		fn property(mut peers: ArbitraryPeers) -> bool {
+			let mut requests = ExtraRequests::::new();
+
+			let num_peers_available = peers.0.values()
+				.filter(|s| s.state == PeerSyncState::Available).count();
+
+			for i in 0 .. num_peers_available {
+				requests.schedule((Hash::random(), i as u64), |a, b| Ok(a[0] >= b[0]))
+			}
+
+			let mut m = requests.matcher();
+			while let Some((peer, r)) = m.next(&peers.0) {
+				peers.0.get_mut(&peer).unwrap().state = PeerSyncState::DownloadingJustification(r.0);
+			}
+
+			assert!(requests.pending_requests.is_empty());
+
+			let active_peers = requests.active_requests.keys().cloned().collect::>();
+			let previously_active = requests.active_requests.values().cloned().collect::>();
+
+			for peer in &active_peers {
+				requests.peer_disconnected(peer)
+			}
+
+			assert!(requests.active_requests.is_empty());
+
+			previously_active == requests.pending_requests.iter().cloned().collect::>()
+		}
+
+		QuickCheck::with_gen(StdThreadGen::new(19))
+			.quickcheck(property as fn(ArbitraryPeers) -> bool)
 	}
-}
 
-#[cfg(test)]
-mod tests {
-	use client::error::Error as ClientError;
-	use test_client::runtime::{Block, Hash};
-	use super::ExtraRequestsAggregator;
+	#[test]
+	fn no_response_reschedules() {
+		fn property(mut peers: ArbitraryPeers) {
+			let mut requests = ExtraRequests::::new();
+
+			let num_peers_available = peers.0.values()
+				.filter(|s| s.state == PeerSyncState::Available).count();
+
+			for i in 0 .. num_peers_available {
+				requests.schedule((Hash::random(), i as u64), |a, b| Ok(a[0] >= b[0]))
+			}
+
+			let mut m = requests.matcher();
+			while let Some((peer, r)) = m.next(&peers.0) {
+				peers.0.get_mut(&peer).unwrap().state = PeerSyncState::DownloadingJustification(r.0);
+			}
+
+			let active = requests.active_requests.iter().map(|(p, &r)| (p.clone(), r)).collect::>();
+
+			for (peer, req) in &active {
+				assert!(requests.failed_requests.get(req).is_none());
+				assert!(!requests.pending_requests.contains(req));
+				assert!(requests.on_response::<()>(peer.clone(), None).is_none());
+				assert!(requests.pending_requests.contains(req));
+				assert_eq!(1, requests.failed_requests.get(req).unwrap().iter().filter(|(p, _)| p == peer).count())
+			}
+		}
+
+		QuickCheck::with_gen(StdThreadGen::new(19))
+			.quickcheck(property as fn(ArbitraryPeers))
+	}
 
 	#[test]
 	fn request_is_rescheduled_when_earlier_block_is_finalized() {
 		let _ = ::env_logger::try_init();
 
-		let mut extra_requests = ExtraRequestsAggregator::::new();
+		let mut finality_proofs = ExtraRequests::::new();
 
 		let hash4 = [4; 32].into();
 		let hash5 = [5; 32].into();
@@ -435,33 +388,76 @@ mod tests {
 		}
 
 		// 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);
+		finality_proofs.tree.import(hash4, 4, (), &is_descendent_of).unwrap();
+		finality_proofs.tree.finalize_root(&hash4);
 
 		// schedule request for #6
-		extra_requests.finality_proofs().queue_request((hash6, 6), is_descendent_of);
+		finality_proofs.schedule((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)));
+		finality_proofs.importing_requests.insert((hash6, 6));
+		finality_proofs.on_block_finalized(&hash5, 5, is_descendent_of).unwrap();
+		finality_proofs.try_finalize_root::<()>((hash6, 6), Ok((hash5, 5)), true);
 
 		// ensure that request for #6 is still pending
-		assert_eq!(
-			extra_requests.finality_proofs().pending_requests.iter().collect::>(),
-			vec![&(hash6, 6)],
-		);
+		assert_eq!(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)));
+		finality_proofs.importing_requests.insert((hash6, 6));
+		finality_proofs.on_block_finalized(&hash6, 6, is_descendent_of).unwrap();
+		finality_proofs.on_block_finalized(&hash7, 7, is_descendent_of).unwrap();
+		finality_proofs.try_finalize_root::<()>((hash6, 6), Ok((hash7, 7)), true);
 
 		// ensure that there's no request for #6
-		assert_eq!(
-			extra_requests.finality_proofs().pending_requests.iter().collect::>(),
-			Vec::<&(Hash, u64)>::new(),
-		);
+		assert_eq!(finality_proofs.pending_requests.iter().collect::>(), Vec::<&(Hash, u64)>::new());
+	}
+
+	// Some Arbitrary instances to allow easy construction of random peer sets:
+
+	#[derive(Debug, Clone)]
+	struct ArbitraryPeerSyncState(PeerSyncState);
+
+	impl Arbitrary for ArbitraryPeerSyncState {
+		fn arbitrary(g: &mut G) -> Self {
+			let s = match g.gen::() % 5 {
+				0 => PeerSyncState::Available,
+				// TODO: 1 => PeerSyncState::AncestorSearch(g.gen(), AncestorSearchState),
+				1 => PeerSyncState::DownloadingNew(g.gen::()),
+				2 => PeerSyncState::DownloadingStale(Hash::random()),
+				3 => PeerSyncState::DownloadingJustification(Hash::random()),
+				_ => PeerSyncState::DownloadingFinalityProof(Hash::random())
+			};
+			ArbitraryPeerSyncState(s)
+		}
 	}
+
+	#[derive(Debug, Clone)]
+	struct ArbitraryPeerSync(PeerSync);
+
+	impl Arbitrary for ArbitraryPeerSync {
+		fn arbitrary(g: &mut G) -> Self {
+			let ps = PeerSync {
+				common_number: g.gen(),
+				best_hash: Hash::random(),
+				best_number: g.gen(),
+				state: ArbitraryPeerSyncState::arbitrary(g).0,
+				recently_announced: Default::default()
+			};
+			ArbitraryPeerSync(ps)
+		}
+	}
+
+	#[derive(Debug, Clone)]
+	struct ArbitraryPeers(HashMap>);
+
+	impl Arbitrary for ArbitraryPeers {
+		fn arbitrary(g: &mut G) -> Self {
+			let mut peers = HashMap::with_capacity(g.size());
+			for _ in 0 .. g.size() {
+				peers.insert(PeerId::random(), ArbitraryPeerSync::arbitrary(g).0);
+			}
+			ArbitraryPeers(peers)
+		}
+	}
+
 }
-- 
GitLab


From 70c37a20458e796b3a6f56051f611679553b96c7 Mon Sep 17 00:00:00 2001
From: Pierre Krieger 
Date: Tue, 18 Jun 2019 10:36:42 +0200
Subject: [PATCH 129/140] Move libp2p tests to custom_proto (#2884)

---
 core/network/src/custom_proto/handler.rs      |   2 +-
 core/network/src/custom_proto/mod.rs          |   1 +
 .../src/{service => custom_proto}/tests.rs    | 293 ++++++++++--------
 core/network/src/custom_proto/upgrade.rs      |  13 -
 core/network/src/service.rs                   |   2 -
 5 files changed, 161 insertions(+), 150 deletions(-)
 rename core/network/src/{service => custom_proto}/tests.rs (55%)

diff --git a/core/network/src/custom_proto/handler.rs b/core/network/src/custom_proto/handler.rs
index 0400c27f82..0ec60e79cd 100644
--- a/core/network/src/custom_proto/handler.rs
+++ b/core/network/src/custom_proto/handler.rs
@@ -585,7 +585,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage {
 			ProtocolState::Init { .. } | ProtocolState::Opening { .. } |
 			ProtocolState::Normal { .. } => KeepAlive::Yes,
 			ProtocolState::Disabled { .. } | ProtocolState::Poisoned |
-      ProtocolState::KillAsap => KeepAlive::No,
+	  		ProtocolState::KillAsap => KeepAlive::No,
 		}
 	}
 
diff --git a/core/network/src/custom_proto/mod.rs b/core/network/src/custom_proto/mod.rs
index a4fdebbb31..22c66c1654 100644
--- a/core/network/src/custom_proto/mod.rs
+++ b/core/network/src/custom_proto/mod.rs
@@ -20,3 +20,4 @@ pub use self::upgrade::CustomMessage;
 mod behaviour;
 mod handler;
 mod upgrade;
+mod tests;
diff --git a/core/network/src/service/tests.rs b/core/network/src/custom_proto/tests.rs
similarity index 55%
rename from core/network/src/service/tests.rs
rename to core/network/src/custom_proto/tests.rs
index f18f471e7a..3eb9eb77ac 100644
--- a/core/network/src/service/tests.rs
+++ b/core/network/src/custom_proto/tests.rs
@@ -16,79 +16,176 @@
 
 #![cfg(test)]
 
-use futures::{future, stream, prelude::*, try_ready};
-use libp2p::core::swarm::ExpandedSwarm;
+use futures::{future, prelude::*, try_ready};
+use libp2p::core::{nodes::Substream, swarm::Swarm};
+use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox};
+use libp2p::core::{ProtocolsHandler, protocols_handler::IntoProtocolsHandler};
+use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction};
+use libp2p::core::swarm::PollParameters;
+use libp2p::{PeerId, Multiaddr, Transport};
 use rand::seq::SliceRandom;
-use runtime_primitives::traits::Block as BlockT;
 use std::{io, time::Duration, time::Instant};
 use test_client::runtime::Block;
-use crate::protocol::message::generic::Message;
-use crate::{Multiaddr, multiaddr::Protocol, build_multiaddr};
-use crate::custom_proto::CustomProtoOut;
-use super::{start_service, Swarm};
+use crate::protocol::message::{Message as MessageAlias, generic::Message};
+use crate::custom_proto::{CustomProto, CustomProtoOut, CustomMessage};
 
-/// Builds two services. The second one and further have the first one as its bootstrap node.
+/// Builds two nodes that have each other as bootstrap nodes.
 /// This is to be used only for testing, and a panic will happen if something goes wrong.
-fn build_nodes(num: usize, base_port: u16) -> Vec> {
-	let mut result: Vec> = Vec::with_capacity(num);
-	let mut first_addr = None::;
+fn build_nodes()
+-> (
+	Swarm, CustomProtoWithAddr>,
+	Swarm, CustomProtoWithAddr>
+) {
+	let mut out = Vec::with_capacity(2);
+
+	let keypairs: Vec<_> = (0..2).map(|_| libp2p::identity::Keypair::generate_ed25519()).collect();
+	let addrs: Vec = (0..2)
+		.map(|_| format!("/memory/{}", rand::random::()).parse().unwrap())
+		.collect();
+
+	for index in 0 .. 2 {
+		let transport = libp2p::core::transport::MemoryTransport
+			.with_upgrade(libp2p::secio::SecioConfig::new(keypairs[index].clone()))
+			.and_then(move |out, endpoint| {
+				let peer_id = out.remote_key.into_peer_id();
+				libp2p::core::upgrade::apply(out.stream, libp2p::yamux::Config::default(), endpoint)
+					.map(|muxer| (peer_id, libp2p::core::muxing::StreamMuxerBox::new(muxer)))
+			})
+			.with_timeout(Duration::from_secs(20))
+			.map_err(|err| io::Error::new(io::ErrorKind::Other, err))
+			.boxed();
+
+		let (peerset, _) = peerset::Peerset::from_config(peerset::PeersetConfig {
+			in_peers: 25,
+			out_peers: 25,
+			bootnodes: keypairs
+				.iter()
+				.enumerate()
+				.filter_map(|(n, p)| if n != index { Some(p.public().into_peer_id()) } else { None })
+				.collect(),
+			reserved_only: false,
+			reserved_nodes: Vec::new(),
+		});
+
+		let behaviour = CustomProtoWithAddr {
+			inner: CustomProto::new(&b"test"[..], &[1], peerset),
+			addrs: addrs
+				.iter()
+				.enumerate()
+				.filter_map(|(n, a)| if n != index {
+					Some((keypairs[n].public().into_peer_id(), a.clone()))
+				} else {
+					None
+				})
+				.collect(),
+		};
 
-	for index in 0 .. num {
-		let mut boot_nodes = Vec::new();
+		let mut swarm = libp2p::core::swarm::Swarm::new(
+			transport,
+			behaviour,
+			keypairs[index].public().into_peer_id()
+		);
+		Swarm::listen_on(&mut swarm, addrs[index].clone()).unwrap();
+		out.push(swarm);
+	}
 
-		if let Some(first_addr) = first_addr.as_ref() {
-			boot_nodes.push(first_addr.clone()
-				.with(Protocol::P2p(ExpandedSwarm::local_peer_id(&result[0]).clone().into()))
-				.to_string());
-		}
+	// Final output
+	let mut out_iter = out.into_iter();
+	let first = out_iter.next().unwrap();
+	let second = out_iter.next().unwrap();
+	(first, second)
+}
 
-		let config = crate::config::NetworkConfiguration {
-			listen_addresses: vec![build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(base_port + index as u16)]],
-			boot_nodes,
-			..crate::config::NetworkConfiguration::default()
-		};
+/// Wraps around the `CustomBehaviour` network behaviour, and adds hardcoded node addresses to it.
+struct CustomProtoWithAddr {
+	inner: CustomProto>,
+	addrs: Vec<(PeerId, Multiaddr)>,
+}
 
-		if first_addr.is_none() {
-			first_addr = Some(config.listen_addresses.iter().next().unwrap().clone());
-		}
+impl std::ops::Deref for CustomProtoWithAddr {
+	type Target = CustomProto>;
 
-		result.push(start_service::(config, &b"tst"[..], &[1]).unwrap().0);
+	fn deref(&self) -> &Self::Target {
+		&self.inner
 	}
+}
 
-	result
+impl std::ops::DerefMut for CustomProtoWithAddr {
+	fn deref_mut(&mut self) -> &mut Self::Target {
+		&mut self.inner
+	}
 }
 
-#[test]
-fn basic_two_nodes_connectivity() {
-	let (mut service1, mut service2) = {
-		let mut l = build_nodes::(2, 50400).into_iter();
-		let a = l.next().unwrap();
-		let b = l.next().unwrap();
-		(a, b)
-	};
+impl NetworkBehaviour for CustomProtoWithAddr {
+	type ProtocolsHandler =
+		> as NetworkBehaviour>::ProtocolsHandler;
+	type OutEvent = > as NetworkBehaviour>::OutEvent;
 
-	let fut1 = future::poll_fn(move || -> io::Result<_> {
-		match try_ready!(service1.poll()) {
-			Some(CustomProtoOut::CustomProtocolOpen { version, .. }) => {
-				assert_eq!(version, 1);
-				Ok(Async::Ready(()))
-			},
-			_ => panic!(),
-		}
-	});
+	fn new_handler(&mut self) -> Self::ProtocolsHandler {
+		self.inner.new_handler()
+	}
 
-	let fut2 = future::poll_fn(move || -> io::Result<_> {
-		match try_ready!(service2.poll()) {
-			Some(CustomProtoOut::CustomProtocolOpen { version, .. }) => {
-				assert_eq!(version, 1);
-				Ok(Async::Ready(()))
-			},
-			_ => panic!(),
+	fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec {
+		let mut list = self.inner.addresses_of_peer(peer_id);
+		for (p, a) in self.addrs.iter() {
+			if p == peer_id {
+				list.push(a.clone());
+			}
 		}
-	});
+		list
+	}
 
-	let combined = fut1.select(fut2).map_err(|(err, _)| err);
-	let _ = tokio::runtime::Runtime::new().unwrap().block_on_all(combined).unwrap();
+	fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) {
+		self.inner.inject_connected(peer_id, endpoint)
+	}
+
+	fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) {
+		self.inner.inject_disconnected(peer_id, endpoint)
+	}
+
+	fn inject_node_event(
+		&mut self,
+		peer_id: PeerId,
+		event: <::Handler as ProtocolsHandler>::OutEvent
+	) {
+		self.inner.inject_node_event(peer_id, event)
+	}
+
+	fn poll(
+		&mut self,
+		params: &mut PollParameters
+	) -> Async<
+		NetworkBehaviourAction<
+			<::Handler as ProtocolsHandler>::InEvent,
+			Self::OutEvent
+		>
+	> {
+		self.inner.poll(params)
+	}
+
+	fn inject_replaced(&mut self, peer_id: PeerId, closed_endpoint: ConnectedPoint, new_endpoint: ConnectedPoint) {
+		self.inner.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.inner.inject_addr_reach_failure(peer_id, addr, error)
+	}
+
+	fn inject_dial_failure(&mut self, peer_id: &PeerId) {
+		self.inner.inject_dial_failure(peer_id)
+	}
+
+	fn inject_new_listen_addr(&mut self, addr: &Multiaddr) {
+		self.inner.inject_new_listen_addr(addr)
+	}
+
+	fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) {
+		self.inner.inject_expired_listen_addr(addr)
+	}
+
+	fn inject_new_external_addr(&mut self, addr: &Multiaddr) {
+		self.inner.inject_new_external_addr(addr)
+	}
 }
 
 #[test]
@@ -100,19 +197,14 @@ fn two_nodes_transfer_lots_of_packets() {
 	// substreams allowed by the multiplexer.
 	const NUM_PACKETS: u32 = 5000;
 
-	let (mut service1, mut service2) = {
-		let mut l = build_nodes::(2, 50450).into_iter();
-		let a = l.next().unwrap();
-		let b = l.next().unwrap();
-		(a, b)
-	};
+	let (mut service1, mut service2) = build_nodes::>();
 
 	let fut1 = future::poll_fn(move || -> io::Result<_> {
 		loop {
 			match try_ready!(service1.poll()) {
 				Some(CustomProtoOut::CustomProtocolOpen { peer_id, .. }) => {
 					for n in 0 .. NUM_PACKETS {
-						service1.user_protocol_mut().send_packet(
+						service1.send_packet(
 							&peer_id,
 							Message::ChainSpecific(vec![(n % 256) as u8])
 						);
@@ -144,71 +236,9 @@ fn two_nodes_transfer_lots_of_packets() {
 	let _ = tokio::runtime::Runtime::new().unwrap().block_on(combined).unwrap();
 }
 
-#[test]
-fn many_nodes_connectivity() {
-	// Creates many nodes, then make sure that they are all connected to each other.
-	// Note: if you increase this number, keep in mind that there's a limit to the number of
-	// simultaneous connections which will make the test fail if it is reached. This can be
-	// increased in the `NetworkConfiguration`.
-	const NUM_NODES: usize = 25;
-
-	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 {
-					match try_ready!(node.poll()) {
-						Some(CustomProtoOut::CustomProtocolOpen { .. }) => {
-							num_connecs += 1;
-							assert!(num_connecs < NUM_NODES);
-							if num_connecs == NUM_NODES - 1 {
-								return Ok(Async::Ready(Some(true)))
-							}
-						}
-						Some(CustomProtoOut::CustomProtocolClosed { .. }) => {
-							let was_success = num_connecs == NUM_NODES - 1;
-							num_connecs -= 1;
-							if was_success && num_connecs < NUM_NODES - 1 {
-								return Ok(Async::Ready(Some(false)))
-							}
-						}
-						_ => panic!(),
-					}
-				}
-			})
-		})
-		.collect::>();
-
-	let mut successes = 0;
-	let combined = future::poll_fn(move || -> io::Result<_> {
-		for node in futures.iter_mut() {
-			match node.poll()? {
-				Async::Ready(Some(true)) => successes += 1,
-				Async::Ready(Some(false)) => successes -= 1,
-				Async::Ready(None) => unreachable!(),
-				Async::NotReady => ()
-			}
-		}
-
-		if successes == NUM_NODES {
-			Ok(Async::Ready(()))
-		} else {
-			Ok(Async::NotReady)
-		}
-	});
-
-	tokio::runtime::Runtime::new().unwrap().block_on(combined).unwrap();
-}
-
 #[test]
 fn basic_two_nodes_requests_in_parallel() {
-	let (mut service1, mut service2) = {
-		let mut l = build_nodes::(2, 50550).into_iter();
-		let a = l.next().unwrap();
-		let b = l.next().unwrap();
-		(a, b)
-	};
+	let (mut service1, mut service2) = build_nodes::>();
 
 	// Generate random messages with or without a request id.
 	let mut to_send = {
@@ -230,7 +260,7 @@ fn basic_two_nodes_requests_in_parallel() {
 			match try_ready!(service1.poll()) {
 				Some(CustomProtoOut::CustomProtocolOpen { peer_id, .. }) => {
 					for msg in to_send.drain(..) {
-						service1.user_protocol_mut().send_packet(&peer_id, msg);
+						service1.send_packet(&peer_id, msg);
 					}
 				},
 				_ => panic!(),
@@ -263,12 +293,7 @@ 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)
-	};
+	let (mut service1, mut service2) = build_nodes::>();
 
 	// 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();
@@ -290,7 +315,7 @@ fn reconnect_after_disconnect() {
 						ServiceState::NotConnected => {
 							service1_state = ServiceState::FirstConnec;
 							if service2_state == ServiceState::FirstConnec {
-								service1.user_protocol_mut().disconnect_peer(ExpandedSwarm::local_peer_id(&service2));
+								service1.disconnect_peer(Swarm::local_peer_id(&service2));
 							}
 						},
 						ServiceState::Disconnected => service1_state = ServiceState::ConnectedAgain,
@@ -314,7 +339,7 @@ fn reconnect_after_disconnect() {
 						ServiceState::NotConnected => {
 							service2_state = ServiceState::FirstConnec;
 							if service1_state == ServiceState::FirstConnec {
-								service1.user_protocol_mut().disconnect_peer(ExpandedSwarm::local_peer_id(&service2));
+								service1.disconnect_peer(Swarm::local_peer_id(&service2));
 							}
 						},
 						ServiceState::Disconnected => service2_state = ServiceState::ConnectedAgain,
diff --git a/core/network/src/custom_proto/upgrade.rs b/core/network/src/custom_proto/upgrade.rs
index 0df280ad1a..9ede475349 100644
--- a/core/network/src/custom_proto/upgrade.rs
+++ b/core/network/src/custom_proto/upgrade.rs
@@ -141,19 +141,6 @@ pub trait CustomMessage {
 		where Self: Sized;
 }
 
-// This trait implementation exist mostly for testing convenience. This should eventually be
-// removed.
-
-impl CustomMessage for Vec {
-	fn into_bytes(self) -> Vec {
-		self
-	}
-
-	fn from_bytes(bytes: &[u8]) -> Result {
-		Ok(bytes.to_vec())
-	}
-}
-
 /// Event produced by the `RegisteredProtocolSubstream`.
 #[derive(Debug, Clone)]
 pub enum RegisteredProtocolEvent {
diff --git a/core/network/src/service.rs b/core/network/src/service.rs
index 59618aa5b4..a825becbe5 100644
--- a/core/network/src/service.rs
+++ b/core/network/src/service.rs
@@ -44,8 +44,6 @@ use crate::config::Params;
 use crate::error::Error;
 use crate::protocol::specialization::NetworkSpecialization;
 
-mod tests;
-
 /// Interval at which we send status updates on the status stream.
 const STATUS_INTERVAL: Duration = Duration::from_millis(5000);
 /// Interval at which we update the `peers` field on the main thread.
-- 
GitLab


From ddcf41bfe9caa85ca3b137dde0341e98b44e2ece Mon Sep 17 00:00:00 2001
From: gabriel klawitter 
Date: Tue, 18 Jun 2019 12:20:53 +0200
Subject: [PATCH 130/140] Ci publish rustdocs GitHub (#2895)

* ci: publish rustdocs to github repo substrate-developer-hub/rustdocs
---
 .gitlab-ci.yml | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0f0f0489f7..25ccb0912a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -313,6 +313,48 @@ publish-s3-doc:
     - aws s3 ls s3://${BUCKET}/${PREFIX}/
         --human-readable --summarize
 
+
+publish-gh-doc:
+  stage:                           publish
+  image:                           parity/tools:latest
+  allow_failure:                   true
+  dependencies:
+    - build-rust-doc-release
+  cache:                           {}
+  <<:                              *build-only
+  <<:                              *kubernetes-build
+  variables:
+    GIT_STRATEGY:                  none
+    GITHUB_API:                    "https://api.github.com"
+  script:
+    - test -r ./crate-docs/index.html || (
+        echo "./crate-docs/index.html not present, build:rust:doc:release job not complete";
+        exit 1
+      )
+    - test "${GITHUB_USER}" -a "${GITHUB_EMAIL}" -a "${GITHUB_TOKEN}" || (
+        echo "environment variables for github insufficient";
+        exit 1
+      )
+    - |
+      cat > ${HOME}/.gitconfig <&1 | sed -r "s|(${GITHUB_USER}):[a-f0-9]+@|\1:REDACTED@|g"
+  after_script:
+    - rm -vrf ${HOME}/.gitconfig
+
+
+
 .deploy-template:                  &deploy
   stage:                           kubernetes
   when:                            manual
-- 
GitLab


From 8085a61fe5e655d420a93966d0728ea6dbf21fa6 Mon Sep 17 00:00:00 2001
From: thiolliere 
Date: Tue, 18 Jun 2019 17:06:37 +0200
Subject: [PATCH 131/140] fix construct_runtime (#2898)

---
 node/runtime/src/lib.rs     |  4 ++--
 srml/support/src/runtime.rs | 27 +++++++++++++--------------
 2 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs
index 15b81b4cc5..67a5b450a9 100644
--- a/node/runtime/src/lib.rs
+++ b/node/runtime/src/lib.rs
@@ -247,7 +247,7 @@ construct_runtime!(
 		NodeBlock = node_primitives::Block,
 		UncheckedExtrinsic = UncheckedExtrinsic
 	{
-		System: system::{default, Config},
+		System: system,
 		Aura: aura::{Module, Config, Inherent(Timestamp)},
 		Timestamp: timestamp::{Module, Call, Storage, Config, Inherent},
 		Indices: indices,
@@ -261,7 +261,7 @@ construct_runtime!(
 		FinalityTracker: finality_tracker::{Module, Call, Inherent},
 		Grandpa: grandpa::{Module, Call, Storage, Config, Event},
 		Treasury: treasury,
-		Contract: contract::{Module, Call, Storage, Config, Event},
+		Contract: contract,
 		Sudo: sudo,
 	}
 );
diff --git a/srml/support/src/runtime.rs b/srml/support/src/runtime.rs
index 27955f2f51..6bccac0d4e 100644
--- a/srml/support/src/runtime.rs
+++ b/srml/support/src/runtime.rs
@@ -109,7 +109,8 @@ macro_rules! construct_runtime {
 	) => {
 		$crate::construct_runtime!(
 			{ $( $preset )* };
-			{ $( $expanded )* $name: $module::{Module, Call, Storage, Event, Config}, };
+			{ $( $expanded )* };
+			$name: $module::{default},
 			$( $rest )*
 		);
 	};
@@ -117,27 +118,25 @@ macro_rules! construct_runtime {
 		{ $( $preset:tt )* };
 		{ $( $expanded:tt )* };
 		$name:ident: $module:ident::{
-			default,
-			$(
+			default
+			$(,
 				$modules:ident
 					$( <$modules_generic:ident $(, $modules_instance:ident)?> )*
 					$( ( $( $modules_args:ident ),* ) )*
-			),*
+			)*
 		},
 		$( $rest:tt )*
 	) => {
 		$crate::construct_runtime!(
 			{ $( $preset )* };
-			{
-				$( $expanded )*
-				$name: $module::{
-					Module, Call, Storage, Event, Config,
-					$(
-						$modules $( <$modules_generic $(, $modules_instance)?> )*
-						$( ( $( $modules_args ),* ) )*
-					),*
-				},
-			};
+			{ $( $expanded )* };
+			$name: $module::{
+				Module, Call, Storage, Event, Config
+				$(,
+					$modules $( <$modules_generic $(, $modules_instance)?> )*
+					$( ( $( $modules_args ),* ) )*
+				)*
+			},
 			$( $rest )*
 		);
 	};
-- 
GitLab


From d69baf1f821d3fea6695d0ccf145dea2dc2a186d Mon Sep 17 00:00:00 2001
From: Fredrik Harrysson 
Date: Tue, 18 Jun 2019 22:38:13 +0200
Subject: [PATCH 132/140] Add documentation to the main sync code (#2879)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Added some documentation and question on the main sync code

* Remove strange formatting change

Co-Authored-By: André Silva 

* Improve comment per suggestion

* Remove comment about re-using PeerInfo, no real reason and no real consensus if it's better or worse.

* Fix redundancy in comment

Co-Authored-By: André Silva 

* Explaining more things and fixing review comments.

* Better explanation of MAJOR_SYNC_BLOCKS
* Explains the ancestor search strategy a bit
* Corrects explanation of what a stale block is
* Adds a bit of context for `request_ancestry` function

* Revert code change to not confuse the PR
---
 core/network/src/protocol/sync.rs | 85 ++++++++++++++++++++++++++-----
 1 file changed, 71 insertions(+), 14 deletions(-)

diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs
index a6d87f33ff..591d5e4669 100644
--- a/core/network/src/protocol/sync.rs
+++ b/core/network/src/protocol/sync.rs
@@ -53,15 +53,17 @@ use std::collections::HashSet;
 mod blocks;
 mod extra_requests;
 
-// Maximum blocks to request in a single packet.
+/// Maximum blocks to request in a single packet.
 const MAX_BLOCKS_TO_REQUEST: usize = 128;
-// Maximum blocks to store in the import queue.
+/// Maximum blocks to store in the import queue.
 const MAX_IMPORTING_BLOCKS: usize = 2048;
-// Number of blocks in the queue that prevents ancestry search.
+/// We use a heuristic that with a high likelihood, by the time `MAJOR_SYNC_BLOCKS` have been
+/// imported we'll be on the same chain as (or at least closer to) the peer so we want to delay the
+/// ancestor search to not waste time doing that when we're so far behind.
 const MAJOR_SYNC_BLOCKS: usize = 5;
-// Number of recently announced blocks to track for each peer.
+/// 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.
+/// 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);
@@ -90,15 +92,24 @@ pub trait Context {
 }
 
 #[derive(Debug, Clone)]
+/// All the data we have about a Peer that we are trying to sync with
 pub(crate) struct PeerSync {
+	/// The common number is the block number that is a common point of ancestry for both our chains
+	/// (as far as we know)
 	pub common_number: NumberFor,
+	/// The hash of the best block that we've seen for this peer
 	pub best_hash: B::Hash,
+	/// The number of the best block that we've seen for this peer
 	pub best_number: NumberFor,
+	/// The state of syncing this peer is in for us, generally categories into `Available` or "busy"
+	/// with something as defined by `PeerSyncState`.
 	pub state: PeerSyncState,
+	/// A queue of blocks that this peer has announced to us, should only contain
+	/// `ANNOUNCE_HISTORY_SIZE` entries.
 	pub recently_announced: VecDeque,
 }
 
-/// Peer sync status.
+/// The sync status of a peer we are trying to sync with
 #[derive(Debug)]
 pub(crate) struct PeerInfo {
 	/// Their best block hash.
@@ -108,6 +119,8 @@ pub(crate) struct PeerInfo {
 }
 
 #[derive(Copy, Clone, Eq, PartialEq, Debug)]
+/// The ancestor search state expresses which algorithm, and its stateful parameters, we are using to
+/// try to find an ancestor block
 pub(crate) enum AncestorSearchState {
 	/// Use exponential backoff to find an ancestor, then switch to binary search.
 	/// We keep track of the exponent.
@@ -118,26 +131,45 @@ pub(crate) enum AncestorSearchState {
 }
 
 #[derive(Copy, Clone, Eq, PartialEq, Debug)]
+/// The state of syncing between a Peer and ourselves. Generally two categories, "busy" or
+/// `Available`. If busy, the Enum defines what we are busy with.
 pub(crate) enum PeerSyncState {
+	/// Searching for ancestors the Peer has in common with us.
 	AncestorSearch(NumberFor, AncestorSearchState),
+	/// Available for sync requests.
 	Available,
+	/// Actively downloading new blocks, starting from the given Number.
 	DownloadingNew(NumberFor),
+	/// Downloading a stale block with given Hash. Stale means that it's a block with a number that
+	/// is lower than our best number. It might be from a fork and not necessarily already imported.
 	DownloadingStale(B::Hash),
+	/// Downloading justification for given block hash.
 	DownloadingJustification(B::Hash),
+	/// Downloading finality proof for given block hash.
 	DownloadingFinalityProof(B::Hash),
 }
 
-/// Relay chain sync strategy.
+/// The main data structure to contain all the state for a chains active syncing strategy.
 pub struct ChainSync {
+	/// The active peers that we are using to sync and their PeerSync status
 	peers: HashMap>,
+	/// A `BlockCollection` of blocks that are being downloaded from peers
 	blocks: BlockCollection,
+	/// The best block number in our queue of blocks to import
 	best_queued_number: NumberFor,
+	/// The best block hash in our queue of blocks to import
 	best_queued_hash: B::Hash,
+	/// The role of this node, e.g. light or full
 	role: Roles,
+	/// What block attributes we require for this node, usually derived from what role we are, but
+	/// could be customized
 	required_block_attributes: message::BlockAttributes,
 	extra_finality_proofs: ExtraRequests,
 	extra_justifications: ExtraRequests,
+	/// A set of hashes of blocks that are being downloaded or have been downloaded and are queued
+	/// for import.
 	queue_blocks: HashSet,
+	/// The best block number that we are currently importing
 	best_importing_number: NumberFor,
 	request_builder: Option>,
 }
@@ -203,10 +235,14 @@ impl ChainSync {
 		}
 	}
 
+	/// Returns the number for the best seen blocks among connected peers, if any
 	fn best_seen_block(&self) -> Option> {
 		self.peers.values().max_by_key(|p| p.best_number).map(|p| p.best_number)
 	}
 
+	/// Returns the SyncState that we are currently in based on a provided `best_seen` block number.
+	/// A chain is classified as downloading if the provided best block is more than `MAJOR_SYNC_BLOCKS`
+	/// behind the best queued block.
 	fn state(&self, best_seen: &Option>) -> SyncState {
 		match best_seen {
 			&Some(n) if n > self.best_queued_number && n - self.best_queued_number > 5.into() => SyncState::Downloading,
@@ -266,7 +302,9 @@ impl ChainSync {
 				protocol.disconnect_peer(who);
 			},
 			(Ok(BlockStatus::Unknown), _) if self.queue_blocks.len() > MAJOR_SYNC_BLOCKS => {
-				// when actively syncing the common point moves too fast.
+				// If there are more than `MAJOR_SYNC_BLOCKS` in the import queue then we have
+				// enough to do in the import queue that it's not worth kicking off
+				// an ancestor search, which is what we do in the next match case below.
 				debug!(
 					target:"sync",
 					"New peer with unknown best hash {} ({}), assuming common block.",
@@ -329,6 +367,13 @@ impl ChainSync {
 		}
 	}
 
+	/// This function handles the ancestor search strategy used. The goal is to find a common point
+	/// that both our chains agree on that is as close to the tip as possible.
+	/// The way this works is we first have an exponential backoff strategy, where we try to step
+	/// forward until we find a block hash mismatch. The size of the step doubles each step we take.
+	///
+	/// When we've found a block hash mismatch we then fall back to a binary search between the two
+	/// last known points to find the common block closest to the tip.
 	fn handle_ancestor_search_state(
 		state: AncestorSearchState,
 		curr_block_num: NumberFor,
@@ -690,7 +735,7 @@ impl ChainSync {
 		self.request_builder = Some(builder)
 	}
 
-	/// Notify about successful import of the given block.
+	/// Log that a block has been successfully imported
 	pub fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) {
 		trace!(target: "sync", "Block imported successfully {} ({})", number, hash);
 	}
@@ -714,6 +759,8 @@ impl ChainSync {
 		}
 	}
 
+	/// Called when a block has been queued for import. Updates our internal state for best queued
+	/// block and then goes through all peers to update our view of their state as well.
 	fn block_queued(&mut self, hash: &B::Hash, number: NumberFor) {
 		if number > self.best_queued_number {
 			self.best_queued_number = number;
@@ -743,7 +790,8 @@ impl ChainSync {
 		}
 	}
 
-	/// Sets the new head of chain.
+	/// Signal that `best_header` has been queued for import and update the `ChainSync` state with
+	/// that information.
 	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())
@@ -751,8 +799,9 @@ impl ChainSync {
 
 	/// Call when a node announces a new block.
 	///
-	/// If true is returned, then the caller MUST try to import passed header (call `on_block_data).
+	/// If true is returned, then the caller MUST try to import passed header (call `on_block_data`).
 	/// The network request isn't sent in this case.
+	/// Both hash and header is passed as an optimization to avoid rehashing the header.
 	#[must_use]
 	pub(crate) fn on_block_announce(
 		&mut self,
@@ -791,6 +840,8 @@ impl ChainSync {
 		if let PeerSyncState::AncestorSearch(_, _) = peer.state {
 			return false;
 		}
+		// We assume that the announced block is the latest they have seen, and so our common number
+		// is either one further ahead or it's the one they just announced, if we know about it.
 		if header.parent_hash() == &self.best_queued_hash || known_parent {
 			peer.common_number = number - One::one();
 		} else if known {
@@ -805,8 +856,7 @@ impl ChainSync {
 
 		// stale block case
 		let requires_additional_data = !self.role.is_light();
-		let stale = number <= self.best_queued_number;
-		if stale {
+		if number <= self.best_queued_number {
 			if !(known_parent || self.is_already_downloading(header.parent_hash())) {
 				if protocol.client().block_status(&BlockId::Number(*header.number()))
 					.unwrap_or(BlockStatus::Unknown) == BlockStatus::InChainPruned
@@ -879,10 +929,14 @@ impl ChainSync {
 		true
 	}
 
+	/// Convenience function to iterate through all peers and see if there are any that we are
+	/// downloading this hash from.
 	fn is_already_downloading(&self, hash: &B::Hash) -> bool {
 		self.peers.iter().any(|(_, p)| p.state == PeerSyncState::DownloadingStale(*hash))
 	}
 
+	/// Returns true if the block with given hash exists in the import queue with known status or is
+	/// already imported.
 	fn is_known(&self, protocol: &mut dyn Context, hash: &B::Hash) -> bool {
 		block_status(&*protocol.client(), &self.queue_blocks, *hash).ok().map_or(false, |s| s != BlockStatus::Unknown)
 	}
@@ -1025,6 +1079,8 @@ impl ChainSync {
 		}
 	}
 
+	/// Request the ancestry for a block. Sends a request for header and justification for the given
+	/// block number. Used during ancestry search.
 	fn request_ancestry(protocol: &mut dyn Context, who: PeerId, block: NumberFor) {
 		trace!(target: "sync", "Requesting ancestry block #{} from {}", block, who);
 		let request = message::generic::BlockRequest {
@@ -1039,7 +1095,8 @@ impl ChainSync {
 	}
 }
 
-/// Get block status, taking into account import queue.
+/// Returns the BlockStatus for given block hash, looking first in the import queue and then in the
+/// provided chain.
 fn block_status(
 	chain: &dyn crate::chain::Client,
 	queue_blocks: &HashSet,
-- 
GitLab


From d752299c04824ff76a68dd9a2ce901e7d28fbbe8 Mon Sep 17 00:00:00 2001
From: Pierre Krieger 
Date: Wed, 19 Jun 2019 03:03:38 +0200
Subject: [PATCH 133/140] Fix the failing networking tests (#2904)

---
 core/network/src/custom_proto/tests.rs | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/core/network/src/custom_proto/tests.rs b/core/network/src/custom_proto/tests.rs
index 3eb9eb77ac..37d4db29e6 100644
--- a/core/network/src/custom_proto/tests.rs
+++ b/core/network/src/custom_proto/tests.rs
@@ -58,11 +58,15 @@ fn build_nodes()
 		let (peerset, _) = peerset::Peerset::from_config(peerset::PeersetConfig {
 			in_peers: 25,
 			out_peers: 25,
-			bootnodes: keypairs
-				.iter()
-				.enumerate()
-				.filter_map(|(n, p)| if n != index { Some(p.public().into_peer_id()) } else { None })
-				.collect(),
+			bootnodes: if index == 0 {
+				keypairs
+					.iter()
+					.skip(1)
+					.map(|keypair| keypair.public().into_peer_id())
+					.collect()
+			} else {
+				vec![]
+			},
 			reserved_only: false,
 			reserved_nodes: Vec::new(),
 		});
-- 
GitLab


From 1595a5e50a1ef94f03c274e1017f6f86fd9a52be Mon Sep 17 00:00:00 2001
From: Pierre Krieger 
Date: Wed, 19 Jun 2019 03:50:48 +0200
Subject: [PATCH 134/140] Import queue API revamp (#2856)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* ImportQueue methods are now mut

* Link methods are now mut

* Remove Arc from BasicSyncQueue

* Fix tests

* Remove BasicSyncQueue

* Change the import queue API

* Add buffered_link

* Remove obsolete tests

* Comments and style improvement pass

* Fix grandpa and comment cleanup

* Update core/consensus/common/src/import_queue.rs

Co-Authored-By: André Silva 
---
 core/consensus/common/src/block_import.rs |    4 +-
 core/consensus/common/src/import_queue.rs | 1075 +++++++--------------
 core/consensus/common/src/lib.rs          |    2 +-
 core/finality-grandpa/src/import.rs       |    2 +-
 core/finality-grandpa/src/light_import.rs |    4 +-
 core/network/src/service.rs               |  157 ++-
 core/network/src/test/block_import.rs     |    3 +-
 core/network/src/test/mod.rs              |  138 ++-
 core/service/src/chain_ops.rs             |   41 +-
 9 files changed, 567 insertions(+), 859 deletions(-)

diff --git a/core/consensus/common/src/block_import.rs b/core/consensus/common/src/block_import.rs
index 363ba18713..6ce4acdf39 100644
--- a/core/consensus/common/src/block_import.rs
+++ b/core/consensus/common/src/block_import.rs
@@ -195,7 +195,7 @@ pub trait JustificationImport {
 	type Error: ::std::error::Error + Send + 'static;
 
 	/// Called by the import queue when it is started.
-	fn on_start(&self, _link: &dyn crate::import_queue::Link) { }
+	fn on_start(&self, _link: &mut dyn crate::import_queue::Link) { }
 
 	/// Import a Block justification and finalize the given block.
 	fn import_justification(
@@ -211,7 +211,7 @@ pub trait FinalityProofImport {
 	type Error: std::error::Error + Send + 'static;
 
 	/// Called by the import queue when it is started.
-	fn on_start(&self, _link: &dyn crate::import_queue::Link) { }
+	fn on_start(&self, _link: &mut dyn crate::import_queue::Link) { }
 
 	/// Import a Block justification and finalize the given block. Returns finalized block or error.
 	fn import_finality_proof(
diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs
index c2ffcd4239..1753d63ff0 100644
--- a/core/consensus/common/src/import_queue.rs
+++ b/core/consensus/common/src/import_queue.rs
@@ -26,8 +26,8 @@
 //! queues to be instantiated simply.
 
 use std::{sync::Arc, thread, collections::HashMap};
-use crossbeam_channel::{self as channel, Receiver, Sender};
-use parking_lot::Mutex;
+use crossbeam_channel::{self as channel, Sender};
+use futures::{prelude::*, sync::mpsc};
 use runtime_primitives::{Justification, traits::{
 	Block as BlockT, Header as HeaderT, NumberFor,
 }};
@@ -90,154 +90,63 @@ pub trait Verifier: Send + Sync {
 }
 
 /// Blocks import queue API.
-pub trait ImportQueue: Send + Sync {
-	/// Start background work for the queue as necessary.
-	///
-	/// This is called automatically by the network service when synchronization
-	/// begins.
-	fn start(&self, _link: Box>) -> Result<(), std::io::Error> {
-		Ok(())
-	}
+///
+/// The `import_*` methods can be called in order to send elements for the import queue to verify.
+/// Afterwards, call `poll_actions` to determine how to respond to these elements.
+pub trait ImportQueue: Send {
 	/// Import bunch of blocks.
-	fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>);
+	fn import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>);
 	/// Import a block justification.
-	fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification);
+	fn import_justification(
+		&mut 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);
-}
-
-/// Basic block import queue that performs import in the caller thread.
-pub struct BasicSyncQueue> {
-	data: Arc>,
-}
-
-struct BasicSyncQueueData> {
-	link: Mutex>>>,
-	block_import: SharedBlockImport,
-	verifier: Arc,
-	justification_import: Option>,
-	finality_proof_import: Option>,
-}
-
-impl> BasicSyncQueue {
-	pub fn new(
-		block_import: SharedBlockImport,
-		verifier: Arc,
-		justification_import: Option>,
-		finality_proof_import: Option>,
-	) -> Self {
-		BasicSyncQueue {
-			data: Arc::new(BasicSyncQueueData {
-				link: Mutex::new(None),
-				block_import,
-				verifier,
-				justification_import,
-				finality_proof_import,
-			}),
-		}
-	}
-}
-
-impl> ImportQueue for BasicSyncQueue {
-	fn start(&self, link: Box>) -> Result<(), std::io::Error> {
-		if let Some(justification_import) = self.data.justification_import.as_ref() {
-			justification_import.on_start(&*link);
-		}
-		*self.data.link.lock() = Some(link);
-		Ok(())
-	}
-
-	fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>) {
-		if blocks.is_empty() {
-			return;
-		}
-
-		let (imported, count, results) = import_many_blocks(
-			&*self.data.block_import,
-			origin,
-			blocks,
-			self.data.verifier.clone(),
-		);
-
-		let link_ref = self.data.link.lock();
-		let link = match link_ref.as_ref() {
-			Some(link) => link,
-			None => {
-				trace!(target: "sync", "Trying to import blocks before starting import queue");
-				return;
-			},
-		};
-
-		process_import_results(&**link, results);
-
-		trace!(target: "sync", "Imported {} of {}", imported, count);
-	}
-
-	fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification) {
-		import_single_justification(
-			&*self.data.link.lock(),
-			&self.data.justification_import,
-			who,
-			hash,
-			number,
-			justification,
-		)
-	}
-
-	fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) {
-		let result = import_single_finality_proof(
-			&self.data.finality_proof_import,
-			&*self.data.verifier,
-			&who,
-			hash,
-			number,
-			finality_proof,
-		);
-		if let Some(link) = self.data.link.lock().as_ref() {
-			link.finality_proof_imported(who, (hash, number), result);
-		}
-	}
+	fn import_finality_proof(
+		&mut self,
+		who: Origin,
+		hash: B::Hash,
+		number: NumberFor,
+		finality_proof: Vec
+	);
+	/// Polls for actions to perform on the network.
+	///
+	/// This method should behave in a way similar to `Future::poll`. It can register the current
+	/// task and notify later when more actions are ready to be polled. To continue the comparison,
+	/// it is as if this method always returned `Ok(Async::NotReady)`.
+	fn poll_actions(&mut self, link: &mut dyn Link);
 }
 
-/// Interface to a basic block import queue that is importing blocks
-/// sequentially in a separate thread, with pluggable verification.
-#[derive(Clone)]
+/// Interface to a basic block import queue that is importing blocks sequentially in a separate
+/// thread, with pluggable verification.
 pub struct BasicQueue {
-	sender: Option>>,
+	/// Channel to send messages to the background thread.
+	sender: Option>>,
+	/// Results coming from the worker thread.
+	result_port: BufferedLinkReceiver,
+	/// Sent through the link as soon as possible.
+	finality_proof_request_builder: Option>,
 }
 
 impl Drop for BasicQueue {
 	fn drop(&mut self) {
 		if let Some(sender) = self.sender.take() {
 			let (shutdown_sender, shutdown_receiver) = channel::unbounded();
-			if sender.send(BlockImportMsg::Shutdown(shutdown_sender)).is_ok() {
+			if sender.send(ToWorkerMsg::Shutdown(shutdown_sender)).is_ok() {
 				let _ = shutdown_receiver.recv();
 			}
 		}
 	}
 }
 
-/// "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" 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", "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").
-///
-/// 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.
+	///
+	/// This creates a background thread, and calls `on_start` on the justification importer and
+	/// finality proof importer.
 	pub fn new>(
 		verifier: Arc,
 		block_import: SharedBlockImport,
@@ -245,24 +154,19 @@ impl BasicQueue {
 		finality_proof_import: Option>,
 		finality_proof_request_builder: Option>,
 	) -> Self {
-		let (result_sender, result_port) = channel::unbounded();
+		let (result_sender, result_port) = buffered_link();
 		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,
+			block_import,
 			justification_import,
 			finality_proof_import,
-			finality_proof_request_builder,
 		);
 
 		Self {
-			sender: Some(importer_sender),
+			sender: Some(worker_sender),
+			result_port,
+			finality_proof_request_builder,
 		}
 	}
 
@@ -273,291 +177,116 @@ impl BasicQueue {
 	#[cfg(any(test, feature = "test-helpers"))]
 	pub fn synchronize(&self) {
 		if let Some(ref sender) = self.sender {
-			let _ = sender.send(BlockImportMsg::Synchronize);
+			let _ = sender.send(ToWorkerMsg::Synchronize);
 		}
 	}
 }
 
 impl ImportQueue for BasicQueue {
-	fn start(&self, link: Box>) -> Result<(), std::io::Error> {
-		let connect_err = || Err(std::io::Error::new(
-			std::io::ErrorKind::Other,
-			"Failed to connect import queue threads",
-		));
-		if let Some(ref sender) = self.sender {
-			let (start_sender, start_port) = channel::unbounded();
-			let _ = sender.send(BlockImportMsg::Start(link, start_sender));
-			start_port.recv().unwrap_or_else(|_| connect_err())
-		} else {
-			connect_err()
-		}
-	}
-
-	fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>) {
+	fn import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) {
 		if blocks.is_empty() {
 			return;
 		}
 
 		if let Some(ref sender) = self.sender {
-			let _ = sender.send(BlockImportMsg::ImportBlocks(origin, blocks));
+			trace!(target: "sync", "Scheduling {} blocks for import", blocks.len());
+			let _ = sender.send(ToWorkerMsg::ImportBlocks(origin, blocks));
 		}
 	}
 
-	fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification) {
+	fn import_justification(
+		&mut self,
+		who: Origin,
+		hash: B::Hash,
+		number: NumberFor,
+		justification: Justification
+	) {
 		if let Some(ref sender) = self.sender {
-			let _ = sender.send(BlockImportMsg::ImportJustification(who.clone(), hash, number, justification));
+			let _ = sender.send(ToWorkerMsg::ImportJustification(who.clone(), hash, number, justification));
 		}
 	}
 
-	fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) {
+	fn import_finality_proof(&mut self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) {
 		if let Some(ref sender) = self.sender {
-			let _ = sender.send(BlockImportMsg::ImportFinalityProof(who, hash, number, finality_proof));
+			trace!(target: "sync", "Scheduling finality proof of {}/{} for import", number, hash);
+			let _ = sender.send(ToWorkerMsg::ImportFinalityProof(who, hash, number, finality_proof));
 		}
 	}
-}
 
-pub enum BlockImportMsg {
-	ImportBlocks(BlockOrigin, Vec>),
-	ImportJustification(Origin, B::Hash, NumberFor, Justification),
-	ImportFinalityProof(Origin, B::Hash, NumberFor, Vec),
-	Start(Box>, Sender>),
-	Shutdown(Sender<()>),
-	#[cfg(any(test, feature = "test-helpers"))]
-	Synchronize,
+	fn poll_actions(&mut self, link: &mut dyn Link) {
+		if let Some(fprb) = self.finality_proof_request_builder.take() {
+			link.set_finality_proof_request_builder(fprb);
+		}
+
+		self.result_port.poll_actions(link);
+	}
 }
 
-#[cfg_attr(test, derive(Debug))]
-pub enum BlockImportWorkerMsg {
+/// Message destinated to the background worker.
+#[derive(Debug)]
+enum ToWorkerMsg {
 	ImportBlocks(BlockOrigin, Vec>),
-	ImportedBlocks(
-		Vec<(
-			Result>, BlockImportError>,
-			B::Hash,
-		)>,
-	),
+	ImportJustification(Origin, B::Hash, NumberFor, Justification),
 	ImportFinalityProof(Origin, B::Hash, NumberFor, Vec),
-	ImportedFinalityProof(Origin, (B::Hash, NumberFor), Result<(B::Hash, NumberFor), ()>),
 	Shutdown(Sender<()>),
 	#[cfg(any(test, feature = "test-helpers"))]
 	Synchronize,
 }
 
-enum ImportMsgType {
-	FromWorker(BlockImportWorkerMsg),
-	FromNetwork(BlockImportMsg),
-}
-
-struct BlockImporter {
-	port: Receiver>,
-	result_port: Receiver>,
-	worker_sender: Option>>,
-	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())
-			.spawn(move || {
-				let mut importer = BlockImporter {
-					port,
-					result_port,
-					worker_sender: Some(worker_sender),
-					link: None,
-					verifier,
-					justification_import,
-					finality_proof_import,
-					finality_proof_request_builder,
-				};
-				while importer.run() {
-					// Importing until all senders have been dropped...
-				}
-			})
-			.expect("ImportQueue thread spawning failed");
-		sender
-	}
-
-	fn run(&mut self) -> bool {
-		trace!(target: "import_queue", "Running import queue");
-		let msg = select! {
-			recv(self.port) -> msg => {
-				match msg {
-					// Our sender has been dropped, quitting.
-					Err(_) => return false,
-					Ok(msg) => ImportMsgType::FromNetwork(msg)
-				}
-			},
-			recv(self.result_port) -> msg => {
-				match msg {
-					Err(_) => unreachable!("1. We hold a sender to the Worker, 2. it should not quit until that sender is dropped; qed"),
-					Ok(msg) => ImportMsgType::FromWorker(msg),
-				}
-			}
-		};
-		match msg {
-			ImportMsgType::FromNetwork(msg) => self.handle_network_msg(msg),
-			ImportMsgType::FromWorker(msg) => self.handle_worker_msg(msg),
-		}
-	}
-
-	fn handle_network_msg(&mut self, msg: BlockImportMsg) -> bool {
-		match msg {
-			BlockImportMsg::ImportBlocks(origin, incoming_blocks) => {
-				self.handle_import_blocks(origin, incoming_blocks)
-			},
-			BlockImportMsg::ImportJustification(who, hash, number, justification) => {
-				import_single_justification(
-					&self.link,
-					&self.justification_import,
-					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::Shutdown(result_sender) => {
-				// stop worker thread
-				if let Some(worker_sender) = self.worker_sender.take() {
-					let (sender, receiver) = channel::unbounded();
-					if worker_sender.send(BlockImportWorkerMsg::Shutdown(sender)).is_ok() {
-						let _ = receiver.recv();
-					}
-				}
-				// send shutdown notification
-				let _ = result_sender.send(());
-				return false;
-			},
-			#[cfg(any(test, feature = "test-helpers"))]
-			BlockImportMsg::Synchronize => {
-				trace!(target: "sync", "Received synchronization message");
-				if let Some(ref worker_sender) = self.worker_sender {
-					let _ = worker_sender.send(BlockImportWorkerMsg::Synchronize);
-				}
-			},
-		}
-		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::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(_, _, _, _)
-				| BlockImportWorkerMsg::Shutdown(_)
-					=> unreachable!("Import Worker does not send Import*/Shutdown messages; qed"),
-		};
-
-		process_import_results(&**link, results);
-		true
-	}
-
-	fn handle_import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) {
-		if let Some(ref worker_sender) = self.worker_sender {
-			trace!(target: "sync", "Scheduling finality proof of {}/{} for import", number, hash);
-			let _ = worker_sender.send(BlockImportWorkerMsg::ImportFinalityProof(who, hash, number, finality_proof));
-		}
-	}
-
-	fn handle_import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) {
-		if let Some(ref worker_sender) = self.worker_sender {
-			trace!(target: "sync", "Scheduling {} blocks for import", blocks.len());
-			let _ = worker_sender.send(BlockImportWorkerMsg::ImportBlocks(origin, blocks));
-		}
-	}
-}
-
 struct BlockImportWorker> {
-	result_sender: Sender>,
+	result_sender: BufferedLinkSender,
 	block_import: SharedBlockImport,
+	justification_import: Option>,
 	finality_proof_import: Option>,
 	verifier: Arc,
 }
 
 impl> BlockImportWorker {
-	pub fn new(
-		result_sender: Sender>,
+	fn new(
+		result_sender: BufferedLinkSender,
 		verifier: Arc,
 		block_import: SharedBlockImport,
+		justification_import: Option>,
 		finality_proof_import: Option>,
-	) -> Sender> {
+	) -> Sender> {
 		let (sender, port) = channel::bounded(4);
 		let _ = thread::Builder::new()
 			.name("ImportQueueWorker".into())
 			.spawn(move || {
-				let worker = BlockImportWorker {
+				let mut worker = BlockImportWorker {
 					result_sender,
 					verifier,
+					justification_import,
 					block_import,
 					finality_proof_import,
 				};
+				if let Some(justification_import) = worker.justification_import.as_ref() {
+					justification_import.on_start(&mut worker.result_sender);
+				}
+				if let Some(finality_proof_import) = worker.finality_proof_import.as_ref() {
+					finality_proof_import.on_start(&mut worker.result_sender);
+				}
 				for msg in port.iter() {
 					// Working until all senders have been dropped...
 					match msg {
-						BlockImportWorkerMsg::ImportBlocks(origin, blocks) => {
+						ToWorkerMsg::ImportBlocks(origin, blocks) => {
 							worker.import_a_batch_of_blocks(origin, blocks);
 						},
-						BlockImportWorkerMsg::ImportFinalityProof(who, hash, number, proof) => {
+						ToWorkerMsg::ImportFinalityProof(who, hash, number, proof) => {
 							worker.import_finality_proof(who, hash, number, proof);
 						},
-						BlockImportWorkerMsg::Shutdown(result_sender) => {
+						ToWorkerMsg::ImportJustification(who, hash, number, justification) => {
+							worker.import_justification(who, hash, number, justification);
+						}
+						ToWorkerMsg::Shutdown(result_sender) => {
 							let _ = result_sender.send(());
 							break;
 						},
 						#[cfg(any(test, feature = "test-helpers"))]
-						BlockImportWorkerMsg::Synchronize => {
+						ToWorkerMsg::Synchronize => {
 							trace!(target: "sync", "Sending sync message");
-							let _ = worker.result_sender.send(BlockImportWorkerMsg::Synchronize);
+							worker.result_sender.synchronized();
 						},
-						BlockImportWorkerMsg::ImportedBlocks(_)
-							| BlockImportWorkerMsg::ImportedFinalityProof(_, _, _)
-								=> unreachable!("Import Worker does not receive the Imported* messages; qed"),
 					}
 				}
 			})
@@ -565,7 +294,7 @@ impl> BlockImportWorker {
 		sender
 	}
 
-	fn import_a_batch_of_blocks(&self, origin: BlockOrigin, blocks: Vec>) {
+	fn import_a_batch_of_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) {
 		let (imported, count, results) = import_many_blocks(
 			&*self.block_import,
 			origin,
@@ -573,26 +302,124 @@ impl> BlockImportWorker {
 			self.verifier.clone(),
 		);
 
-		let _ = self
-			.result_sender
-			.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 = import_single_finality_proof(
-			&self.finality_proof_import,
-			&*self.verifier,
-			&who,
-			hash,
-			number,
-			finality_proof,
-		);
+		let mut has_error = false;
+		let mut hashes = vec![];
+		for (result, hash) in results {
+			hashes.push(hash);
+
+			if has_error {
+				continue;
+			}
+
+			if result.is_err() {
+				has_error = true;
+			}
+
+			match result {
+				Ok(BlockImportResult::ImportedKnown(number)) => self.result_sender.block_imported(&hash, number),
+				Ok(BlockImportResult::ImportedUnknown(number, aux, who)) => {
+					self.result_sender.block_imported(&hash, number);
+
+					if aux.clear_justification_requests {
+						trace!(
+							target: "sync",
+							"Block imported clears all pending justification requests {}: {:?}",
+							number,
+							hash
+						);
+						self.result_sender.clear_justification_requests();
+					}
+
+					if aux.needs_justification {
+						trace!(target: "sync", "Block imported but requires justification {}: {:?}", number, hash);
+						self.result_sender.request_justification(&hash, number);
+					}
+
+					if aux.bad_justification {
+						if let Some(peer) = who {
+							info!("Sent block with bad justification to import");
+							self.result_sender.report_peer(peer, BAD_JUSTIFICATION_REPUTATION_CHANGE);
+						}
+					}
+
+					if aux.needs_finality_proof {
+						trace!(target: "sync", "Block imported but requires finality proof {}: {:?}", number, hash);
+						self.result_sender.request_finality_proof(&hash, number);
+					}
+				},
+				Err(BlockImportError::IncompleteHeader(who)) => {
+					if let Some(peer) = who {
+						info!("Peer sent block with incomplete header to import");
+						self.result_sender.report_peer(peer, INCOMPLETE_HEADER_REPUTATION_CHANGE);
+						self.result_sender.restart();
+					}
+				},
+				Err(BlockImportError::VerificationFailed(who, e)) => {
+					if let Some(peer) = who {
+						info!("Verification failed from peer: {}", e);
+						self.result_sender.report_peer(peer, VERIFICATION_FAIL_REPUTATION_CHANGE);
+						self.result_sender.restart();
+					}
+				},
+				Err(BlockImportError::BadBlock(who)) => {
+					if let Some(peer) = who {
+						info!("Bad block");
+						self.result_sender.report_peer(peer, BAD_BLOCK_REPUTATION_CHANGE);
+						self.result_sender.restart();
+					}
+				},
+				Err(BlockImportError::UnknownParent) | Err(BlockImportError::Error) => {
+					self.result_sender.restart();
+				},
+			};
+		}
 
-		let _ = self
-			.result_sender
-			.send(BlockImportWorkerMsg::ImportedFinalityProof(who, (hash, number), result));
+		self.result_sender.blocks_processed(hashes, has_error);
+	}
+
+	fn import_finality_proof(&mut 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(()));
+
+		trace!(target: "sync", "Imported finality proof for {}/{}", number, hash);
+		self.result_sender.finality_proof_imported(who, (hash, number), result);
+	}
+
+	fn import_justification(
+		&mut self,
+		who: Origin,
+		hash: B::Hash,
+		number: NumberFor,
+		justification: Justification
+	) {
+		let success = self.justification_import.as_ref().map(|justification_import| {
+			justification_import.import_justification(hash, number, justification)
+				.map_err(|e| {
+					debug!(
+						target: "sync",
+						"Justification import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}",
+						e,
+						hash,
+						number,
+						who,
+					);
+					e
+				}).is_ok()
+		}).unwrap_or(false);
+
+		self.result_sender.justification_imported(who, &hash, number, success);
 	}
 }
 
@@ -600,37 +427,177 @@ impl> BlockImportWorker {
 /// algorithm.
 pub trait Link: Send {
 	/// Block imported.
-	fn block_imported(&self, _hash: &B::Hash, _number: NumberFor) {}
+	fn block_imported(&mut self, _hash: &B::Hash, _number: NumberFor) {}
 	/// Batch of blocks imported, with or without error.
-	fn blocks_processed(&self, _processed_blocks: Vec, _has_error: bool) {}
+	fn blocks_processed(&mut self, _processed_blocks: Vec, _has_error: bool) {}
 	/// Justification import result.
-	fn justification_imported(&self, _who: Origin, _hash: &B::Hash, _number: NumberFor, _success: bool) {}
+	fn justification_imported(&mut self, _who: Origin, _hash: &B::Hash, _number: NumberFor, _success: bool) {}
 	/// Clear all pending justification requests.
-	fn clear_justification_requests(&self) {}
+	fn clear_justification_requests(&mut self) {}
 	/// Request a justification for the given block.
-	fn request_justification(&self, _hash: &B::Hash, _number: NumberFor) {}
+	fn request_justification(&mut self, _hash: &B::Hash, _number: NumberFor) {}
 	/// 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,
+		&mut 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) {}
+	fn request_finality_proof(&mut self, _hash: &B::Hash, _number: NumberFor) {}
 	/// Remember finality proof request builder on start.
-	fn set_finality_proof_request_builder(&self, _request_builder: SharedFinalityProofRequestBuilder) {}
+	fn set_finality_proof_request_builder(&mut self, _request_builder: SharedFinalityProofRequestBuilder) {}
 	/// Adjusts the reputation of the given peer.
-	fn report_peer(&self, _who: Origin, _reputation_change: i32) {}
+	fn report_peer(&mut self, _who: Origin, _reputation_change: i32) {}
 	/// Restart sync.
-	fn restart(&self) {}
+	fn restart(&mut self) {}
 	/// Synchronization request has been processed.
 	#[cfg(any(test, feature = "test-helpers"))]
-	fn synchronized(&self) {}
+	fn synchronized(&mut self) {}
+}
+
+/// Wraps around an unbounded channel from the `futures` crate. The sender implements `Link` and
+/// can be used to buffer commands, and the receiver can be used to poll said commands and transfer
+/// them to another link.
+pub fn buffered_link() -> (BufferedLinkSender, BufferedLinkReceiver) {
+	let (tx, rx) = mpsc::unbounded();
+	let tx = BufferedLinkSender { tx };
+	let rx = BufferedLinkReceiver { rx };
+	(tx, rx)
+}
+
+/// See [`buffered_link`].
+pub struct BufferedLinkSender {
+	tx: mpsc::UnboundedSender>,
+}
+
+/// Internal buffered message.
+enum BlockImportWorkerMsg {
+	BlockImported(B::Hash, NumberFor),
+	BlocksProcessed(Vec, bool),
+	JustificationImported(Origin, B::Hash, NumberFor, bool),
+	ClearJustificationRequests,
+	RequestJustification(B::Hash, NumberFor),
+	FinalityProofImported(Origin, (B::Hash, NumberFor), Result<(B::Hash, NumberFor), ()>),
+	RequestFinalityProof(B::Hash, NumberFor),
+	SetFinalityProofRequestBuilder(SharedFinalityProofRequestBuilder),
+	ReportPeer(Origin, i32),
+	Restart,
+	#[cfg(any(test, feature = "test-helpers"))]
+	Synchronized,
+}
+
+impl Link for BufferedLinkSender {
+	fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) {
+		let _ = self.tx.unbounded_send(BlockImportWorkerMsg::BlockImported(hash.clone(), number));
+	}
+
+	fn blocks_processed(&mut self, processed_blocks: Vec, has_error: bool) {
+		let _ = self.tx.unbounded_send(BlockImportWorkerMsg::BlocksProcessed(processed_blocks, has_error));
+	}
+
+	fn justification_imported(
+		&mut self,
+		who: Origin,
+		hash: &B::Hash,
+		number: NumberFor,
+		success: bool
+	) {
+		let msg = BlockImportWorkerMsg::JustificationImported(who, hash.clone(), number, success);
+		let _ = self.tx.unbounded_send(msg);
+	}
+
+	fn clear_justification_requests(&mut self) {
+		let _ = self.tx.unbounded_send(BlockImportWorkerMsg::ClearJustificationRequests);
+	}
+
+	fn request_justification(&mut self, hash: &B::Hash, number: NumberFor) {
+		let _ = self.tx.unbounded_send(BlockImportWorkerMsg::RequestJustification(hash.clone(), number));
+	}
+
+	fn finality_proof_imported(
+		&mut self,
+		who: Origin,
+		request_block: (B::Hash, NumberFor),
+		finalization_result: Result<(B::Hash, NumberFor), ()>,
+	) {
+		let msg = BlockImportWorkerMsg::FinalityProofImported(who, request_block, finalization_result);
+		let _ = self.tx.unbounded_send(msg);
+	}
+
+	fn request_finality_proof(&mut self, hash: &B::Hash, number: NumberFor) {
+		let _ = self.tx.unbounded_send(BlockImportWorkerMsg::RequestFinalityProof(hash.clone(), number));
+	}
+
+	fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) {
+		let _ = self.tx.unbounded_send(BlockImportWorkerMsg::SetFinalityProofRequestBuilder(request_builder));
+	}
+
+	fn report_peer(&mut self, who: Origin, reputation_change: i32) {
+		let _ = self.tx.unbounded_send(BlockImportWorkerMsg::ReportPeer(who, reputation_change));
+	}
+
+	fn restart(&mut self) {
+		let _ = self.tx.unbounded_send(BlockImportWorkerMsg::Restart);
+	}
+
+	#[cfg(any(test, feature = "test-helpers"))]
+	fn synchronized(&mut self) {
+		let _ = self.tx.unbounded_send(BlockImportWorkerMsg::Synchronized);
+	}
+}
+
+/// See [`buffered_link`].
+pub struct BufferedLinkReceiver {
+	rx: mpsc::UnboundedReceiver>,
+}
+
+impl BufferedLinkReceiver {
+	/// Polls for the buffered link actions. Any enqueued action will be propagated to the link
+	/// passed as parameter.
+	///
+	/// This method should behave in a way similar to `Future::poll`. It can register the current
+	/// task and notify later when more actions are ready to be polled. To continue the comparison,
+	/// it is as if this method always returned `Ok(Async::NotReady)`.
+	pub fn poll_actions(&mut self, link: &mut dyn Link) {
+		loop {
+			let msg = if let Ok(Async::Ready(Some(msg))) = self.rx.poll() {
+				msg
+			} else {
+				break
+			};
+
+			match msg {
+				BlockImportWorkerMsg::BlockImported(hash, number) =>
+					link.block_imported(&hash, number),
+				BlockImportWorkerMsg::BlocksProcessed(blocks, has_error) =>
+					link.blocks_processed(blocks, has_error),
+				BlockImportWorkerMsg::JustificationImported(who, hash, number, success) =>
+					link.justification_imported(who, &hash, number, success),
+				BlockImportWorkerMsg::ClearJustificationRequests =>
+					link.clear_justification_requests(),
+				BlockImportWorkerMsg::RequestJustification(hash, number) =>
+					link.request_justification(&hash, number),
+				BlockImportWorkerMsg::FinalityProofImported(who, block, result) =>
+					link.finality_proof_imported(who, block, result),
+				BlockImportWorkerMsg::RequestFinalityProof(hash, number) =>
+					link.request_finality_proof(&hash, number),
+				BlockImportWorkerMsg::SetFinalityProofRequestBuilder(builder) =>
+					link.set_finality_proof_request_builder(builder),
+				BlockImportWorkerMsg::ReportPeer(who, reput) =>
+					link.report_peer(who, reput),
+				BlockImportWorkerMsg::Restart =>
+					link.restart(),
+				#[cfg(any(test, feature = "test-helpers"))]
+				BlockImportWorkerMsg::Synchronized =>
+					link.synchronized(),
+			}
+		}
+	}
 }
 
 /// Block import successful result.
@@ -657,140 +624,6 @@ pub enum BlockImportError {
 	Error,
 }
 
-/// Imports single notification and send notification to the link (if provided).
-fn import_single_justification(
-	link: &Option>>,
-	justification_import: &Option>,
-	who: Origin,
-	hash: B::Hash,
-	number: NumberFor,
-	justification: Justification,
-) {
-	let success = justification_import.as_ref().map(|justification_import| {
-		justification_import.import_justification(hash, number, justification)
-			.map_err(|e| {
-				debug!(
-					target: "sync",
-					"Justification import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}",
-					e,
-					hash,
-					number,
-					who,
-				);
-				e
-			}).is_ok()
-	}).unwrap_or(false);
-
-	if let Some(ref link) = link {
-		link.justification_imported(who, &hash, number, success);
-	}
-}
-
-/// Imports single finality_proof.
-fn import_single_finality_proof>(
-	finality_proof_import: &Option>,
-	verifier: &V,
-	who: &Origin,
-	hash: B::Hash,
-	number: NumberFor,
-	finality_proof: Vec,
-) -> Result<(B::Hash, NumberFor), ()> {
-	let result = finality_proof_import.as_ref().map(|finality_proof_import| {
-		finality_proof_import.import_finality_proof(hash, number, finality_proof, verifier)
-			.map_err(|e| {
-				debug!(
-					"Finality proof import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}",
-					e,
-					hash,
-					number,
-					who,
-				);
-			})
-	}).unwrap_or(Err(()));
-
-	trace!(target: "sync", "Imported finality proof for {}/{}", number, hash);
-
-	result
-}
-
-/// Process result of block(s) import.
-fn process_import_results(
-	link: &dyn Link,
-	results: Vec<(
-		Result>, BlockImportError>,
-		B::Hash,
-	)>,
-)
-{
-	let mut has_error = false;
-	let mut hashes = vec![];
-	for (result, hash) in results {
-		hashes.push(hash);
-
-		if has_error {
-			continue;
-		}
-
-		if result.is_err() {
-			has_error = true;
-		}
-
-		match result {
-			Ok(BlockImportResult::ImportedKnown(number)) => link.block_imported(&hash, number),
-			Ok(BlockImportResult::ImportedUnknown(number, aux, who)) => {
-				link.block_imported(&hash, number);
-
-				if aux.clear_justification_requests {
-					trace!(target: "sync", "Block imported clears all pending justification requests {}: {:?}", number, hash);
-					link.clear_justification_requests();
-				}
-
-				if aux.needs_justification {
-					trace!(target: "sync", "Block imported but requires justification {}: {:?}", number, hash);
-					link.request_justification(&hash, number);
-				}
-
-				if aux.bad_justification {
-					if let Some(peer) = who {
-						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 {
-					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 {
-					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 {
-					info!("Bad block");
-					link.report_peer(peer, BAD_BLOCK_REPUTATION_CHANGE);
-					link.restart();
-				}
-			},
-			Err(BlockImportError::UnknownParent) | Err(BlockImportError::Error) => {
-				link.restart();
-			},
-		};
-	}
-	link.blocks_processed(hashes, has_error);
-}
-
 /// Import several blocks at once, returning import result for each block.
 fn import_many_blocks>(
 	import_handle: &dyn BlockImport,
@@ -915,193 +748,3 @@ pub fn import_single_block>(
 
 	import_error(import_handle.import_block(import_block, cache))
 }
-
-#[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,
-	}
-
-	#[derive(Clone)]
-	struct TestLink {
-		sender: Sender,
-	}
-
-	impl TestLink {
-		fn new(sender: Sender) -> TestLink {
-			TestLink {
-				sender,
-			}
-		}
-	}
-
-	impl Link for TestLink {
-		fn block_imported(&self, _hash: &Hash, _number: NumberFor) {
-			let _ = self.sender.send(LinkMsg::BlockImported);
-		}
-		fn finality_proof_imported(
-			&self,
-			_: Origin,
-			_: (Hash, NumberFor),
-			_: Result<(Hash, NumberFor), ()>,
-		) {
-			let _ = self.sender.send(LinkMsg::FinalityProofImported);
-		}
-		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, 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));
-
-		// Ensure the importer handles Start before any result messages.
-		let _ = start_ack_port.recv();
-
-		// Send a known
-		let results = vec![(Ok(BlockImportResult::ImportedKnown(Default::default())), Default::default())];
-		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::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::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,
-				needs_finality_proof: false,
-			},
-			Some(peer_id.clone()))), Default::default())];
-		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::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::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::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::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
-		match worker_receiver.recv().unwrap() {
-			BlockImportWorkerMsg::ImportFinalityProof(
-				cwho,
-				chash,
-				1,
-				cproof,
-			) => {
-				assert_eq!(cwho, who);
-				assert_eq!(chash, Default::default());
-				assert_eq!(cproof, vec![42]);
-			},
-			_ => unreachable!("Unexpected work request received"),
-		}
-
-		// 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 e29c4b2089..5982003c15 100644
--- a/core/consensus/common/src/lib.rs
+++ b/core/consensus/common/src/lib.rs
@@ -26,7 +26,7 @@
 // our error-chain could potentially blow up otherwise
 #![recursion_limit="128"]
 
-#[macro_use] extern crate crossbeam_channel;
+extern crate crossbeam_channel;
 #[macro_use] extern crate log;
 
 use std::sync::Arc;
diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs
index ed57c68250..227daff552 100644
--- a/core/finality-grandpa/src/import.rs
+++ b/core/finality-grandpa/src/import.rs
@@ -76,7 +76,7 @@ impl, RA, PRA, SC> JustificationImport
 {
 	type Error = ConsensusError;
 
-	fn on_start(&self, link: &dyn consensus_common::import_queue::Link) {
+	fn on_start(&self, link: &mut dyn consensus_common::import_queue::Link) {
 		let chain_info = self.inner.info().chain;
 
 		// request justifications for all pending changes for which change blocks have already been imported
diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs
index 4fb93ae303..25a3f84f6d 100644
--- a/core/finality-grandpa/src/light_import.rs
+++ b/core/finality-grandpa/src/light_import.rs
@@ -144,7 +144,7 @@ impl, RA> FinalityProofImport
 {
 	type Error = ConsensusError;
 
-	fn on_start(&self, link: &dyn consensus_common::import_queue::Link) {
+	fn on_start(&self, link: &mut dyn consensus_common::import_queue::Link) {
 		let chain_info = self.client.info().chain;
 
 		let data = self.data.read();
@@ -572,7 +572,7 @@ pub mod tests {
 	{
 		type Error = ConsensusError;
 
-		fn on_start(&self, link: &dyn consensus_common::import_queue::Link) {
+		fn on_start(&self, link: &mut dyn consensus_common::import_queue::Link) {
 			self.0.on_start(link)
 		}
 
diff --git a/core/network/src/service.rs b/core/network/src/service.rs
index a825becbe5..83ac5c9778 100644
--- a/core/network/src/service.rs
+++ b/core/network/src/service.rs
@@ -74,79 +74,6 @@ pub trait TransactionPool: Send + Sync {
 	fn on_broadcasted(&self, propagations: HashMap>);
 }
 
-/// A link implementation that connects to the network.
-#[derive(Clone)]
-pub struct NetworkLink> {
-	/// The protocol sender
-	pub(crate) protocol_sender: mpsc::UnboundedSender>,
-	/// The network sender
-	pub(crate) network_sender: mpsc::UnboundedSender>,
-}
-
-impl> Link for NetworkLink {
-	fn block_imported(&self, hash: &B::Hash, number: NumberFor) {
-		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.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.unbounded_send(ProtocolMsg::JustificationImportResult(hash.clone(), number, success));
-		if !success {
-			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.unbounded_send(ProtocolMsg::ClearJustificationRequests);
-	}
-
-	fn request_justification(&self, hash: &B::Hash, number: NumberFor) {
-		let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestJustification(hash.clone(), number));
-	}
-
-	fn request_finality_proof(&self, hash: &B::Hash, number: NumberFor) {
-		let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestFinalityProof(
-			hash.clone(),
-			number,
-		));
-	}
-
-	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.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 {
@@ -197,13 +124,6 @@ impl, H: ExHashT> NetworkWorker
 		let (protocol_sender, protocol_rx) = mpsc::unbounded();
 		let status_sinks = Arc::new(Mutex::new(Vec::new()));
 
-		// connect the import-queue to the network service.
-		let link = NetworkLink {
-			protocol_sender: protocol_sender.clone(),
-			network_sender: network_chan.clone(),
-		};
-		params.import_queue.start(Box::new(link))?;
-
 		// 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));
@@ -592,7 +512,7 @@ impl, H: ExHashT> Future for Ne
 	type Error = io::Error;
 
 	fn poll(&mut self) -> Poll {
-		// Implementation of `protocol::NetworkOut` using the available local variables.
+		// Implementation of `protocol::NetworkOut` trait using the available local variables.
 		struct Context<'a, B: BlockT>(&'a mut Swarm, &'a PeersetHandle);
 		impl<'a, B: BlockT> NetworkOut for Context<'a, B> {
 			fn report_peer(&mut self, who: PeerId, reputation: i32) {
@@ -606,11 +526,74 @@ impl, H: ExHashT> Future for Ne
 			}
 		}
 
+		// Implementation of `import_queue::Link` trait using the available local variables.
+		struct NetworkLink<'a, B: BlockT, S: NetworkSpecialization, H: ExHashT> {
+			protocol: &'a mut Protocol,
+			context: Context<'a, B>,
+		}
+		impl<'a, B: BlockT, S: NetworkSpecialization, H: ExHashT> Link for NetworkLink<'a, B, S, H> {
+			fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) {
+				self.protocol.block_imported(&hash, number)
+			}
+			fn blocks_processed(&mut self, hashes: Vec, has_error: bool) {
+				self.protocol.blocks_processed(&mut self.context, hashes, has_error)
+			}
+			fn justification_imported(&mut self, who: PeerId, hash: &B::Hash, number: NumberFor, success: bool) {
+				self.protocol.justification_import_result(hash.clone(), number, success);
+				if !success {
+					info!("Invalid justification provided by {} for #{}", who, hash);
+					self.context.0.user_protocol_mut().disconnect_peer(&who);
+					self.context.1.report_peer(who, i32::min_value());
+				}
+			}
+			fn clear_justification_requests(&mut self) {
+				self.protocol.clear_justification_requests()
+			}
+			fn request_justification(&mut self, hash: &B::Hash, number: NumberFor) {
+				self.protocol.request_justification(&mut self.context, hash, number)
+			}
+			fn request_finality_proof(&mut self, hash: &B::Hash, number: NumberFor) {
+				self.protocol.request_finality_proof(&mut self.context, hash, number)
+			}
+			fn finality_proof_imported(
+				&mut self,
+				who: PeerId,
+				request_block: (B::Hash, NumberFor),
+				finalization_result: Result<(B::Hash, NumberFor), ()>,
+			) {
+				let success = finalization_result.is_ok();
+				self.protocol.finality_proof_import_result(request_block, finalization_result);
+				if !success {
+					info!("Invalid finality proof provided by {} for #{}", who, request_block.0);
+					self.context.0.user_protocol_mut().disconnect_peer(&who);
+					self.context.1.report_peer(who, i32::min_value());
+				}
+			}
+			fn report_peer(&mut self, who: PeerId, reputation_change: i32) {
+				self.context.1.report_peer(who, reputation_change)
+			}
+			fn restart(&mut self) {
+				self.protocol.restart(&mut self.context)
+			}
+			fn set_finality_proof_request_builder(&mut self, builder: SharedFinalityProofRequestBuilder) {
+				self.protocol.set_finality_proof_request_builder(builder)
+			}
+		}
+
 		while let Ok(Async::Ready(_)) = self.status_interval.poll() {
 			let status = self.protocol.status();
 			self.status_sinks.lock().retain(|sink| sink.unbounded_send(status.clone()).is_ok());
 		}
 
+		{
+			let mut network_service = self.network_service.lock();
+			let mut link = NetworkLink {
+				protocol: &mut self.protocol,
+				context: Context(&mut network_service, &self.peerset),
+			};
+			self.import_queue.poll_actions(&mut link);
+		}
+
 		while let Ok(Async::Ready(_)) = self.connected_peers_interval.poll() {
 			let infos = self.protocol.peers_info().map(|(id, info)| {
 				(id.clone(), ConnectedPeer { peer_info: info.clone() })
@@ -618,10 +601,14 @@ impl, H: ExHashT> Future for Ne
 			*self.peers.write() = infos;
 		}
 
-		match self.protocol.poll(&mut Context(&mut self.network_service.lock(), &self.peerset), &*self.transaction_pool) {
-			Ok(Async::Ready(v)) => void::unreachable(v),
-			Ok(Async::NotReady) => {}
-			Err(err) => void::unreachable(err),
+		{
+			let mut network_service = self.network_service.lock();
+			let mut ctxt = Context(&mut *network_service, &self.peerset);
+			match self.protocol.poll(&mut ctxt, &*self.transaction_pool) {
+				Ok(Async::Ready(v)) => void::unreachable(v),
+				Ok(Async::NotReady) => {}
+				Err(err) => void::unreachable(err),
+			}
 		}
 
 		// Check for new incoming on-demand requests.
diff --git a/core/network/src/test/block_import.rs b/core/network/src/test/block_import.rs
index f10338a62d..b5a03ae23a 100644
--- a/core/network/src/test/block_import.rs
+++ b/core/network/src/test/block_import.rs
@@ -77,8 +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, None, None);
-		queue.start(Box::new(TestLink{})).unwrap();
+		let mut queue = BasicQueue::new(verifier, Arc::new(test_client::new()), None, None, None);
 		drop(queue);
 	}
 }
diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs
index 216944acc2..95646cd74b 100644
--- a/core/network/src/test/mod.rs
+++ b/core/network/src/test/mod.rs
@@ -41,6 +41,7 @@ use consensus::{Error as ConsensusError, well_known_cache_keys::{self, Id as Cac
 use consensus::{BlockOrigin, ForkChoiceStrategy, ImportBlock, JustificationImport};
 use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient, TopicNotification};
 use futures::{prelude::*, sync::{mpsc, oneshot}};
+use log::info;
 use crate::message::Message;
 use libp2p::PeerId;
 use parking_lot::{Mutex, RwLock};
@@ -49,7 +50,7 @@ use crate::protocol::{Context, Protocol, ProtocolConfig, ProtocolStatus, CustomM
 use runtime_primitives::generic::{BlockId, OpaqueDigestItemId};
 use runtime_primitives::traits::{Block as BlockT, Header, NumberFor};
 use runtime_primitives::{Justification, ConsensusEngineId};
-use crate::service::{NetworkLink, NetworkMsg, ProtocolMsg, TransactionPool};
+use crate::service::{NetworkMsg, ProtocolMsg, TransactionPool};
 use crate::specialization::NetworkSpecialization;
 use test_client::{self, AccountKeyring};
 
@@ -97,6 +98,79 @@ pub struct NoopLink { }
 
 impl Link for NoopLink { }
 
+/// A link implementation that connects to the network.
+#[derive(Clone)]
+pub struct NetworkLink> {
+	/// The protocol sender
+	pub(crate) protocol_sender: mpsc::UnboundedSender>,
+	/// The network sender
+	pub(crate) network_sender: mpsc::UnboundedSender>,
+}
+
+impl> Link for NetworkLink {
+	fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) {
+		let _ = self.protocol_sender.unbounded_send(ProtocolMsg::BlockImportedSync(hash.clone(), number));
+	}
+
+	fn blocks_processed(&mut self, processed_blocks: Vec, has_error: bool) {
+		let _ = self.protocol_sender.unbounded_send(ProtocolMsg::BlocksProcessed(processed_blocks, has_error));
+	}
+
+	fn justification_imported(&mut self, who: PeerId, hash: &B::Hash, number: NumberFor, success: bool) {
+		let _ = self.protocol_sender.unbounded_send(ProtocolMsg::JustificationImportResult(hash.clone(), number, success));
+		if !success {
+			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(&mut self) {
+		let _ = self.protocol_sender.unbounded_send(ProtocolMsg::ClearJustificationRequests);
+	}
+
+	fn request_justification(&mut self, hash: &B::Hash, number: NumberFor) {
+		let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestJustification(hash.clone(), number));
+	}
+
+	fn request_finality_proof(&mut self, hash: &B::Hash, number: NumberFor) {
+		let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestFinalityProof(
+			hash.clone(),
+			number,
+		));
+	}
+
+	fn finality_proof_imported(
+		&mut 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(&mut self, who: PeerId, reputation_change: i32) {
+		let _ = self.network_sender.unbounded_send(NetworkMsg::ReportPeer(who, reputation_change));
+	}
+
+	fn restart(&mut self) {
+		let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RestartSync);
+	}
+
+	fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) {
+		let _ = self.protocol_sender.unbounded_send(ProtocolMsg::SetFinalityProofRequestBuilder(request_builder));
+	}
+}
+
 /// The test specialization.
 #[derive(Clone)]
 pub struct DummySpecialization;
@@ -232,24 +306,24 @@ impl> TestLink {
 }
 
 impl> Link for TestLink {
-	fn block_imported(&self, hash: &Hash, number: NumberFor) {
+	fn block_imported(&mut self, hash: &Hash, number: NumberFor) {
 		self.link.block_imported(hash, number);
 	}
 
-	fn blocks_processed(&self, processed_blocks: Vec, has_error: bool) {
+	fn blocks_processed(&mut self, processed_blocks: Vec, has_error: bool) {
 		self.link.blocks_processed(processed_blocks, has_error);
 	}
 
-	fn justification_imported(&self, who: PeerId, hash: &Hash, number:NumberFor, success: bool) {
+	fn justification_imported(&mut self, who: PeerId, hash: &Hash, number:NumberFor, success: bool) {
 		self.link.justification_imported(who, hash, number, success);
 	}
 
-	fn request_justification(&self, hash: &Hash, number: NumberFor) {
+	fn request_justification(&mut self, hash: &Hash, number: NumberFor) {
 		self.link.request_justification(hash, number);
 	}
 
 	fn finality_proof_imported(
-		&self,
+		&mut self,
 		who: PeerId,
 		request_block: (Hash, NumberFor),
 		finalization_result: Result<(Hash, NumberFor), ()>,
@@ -257,19 +331,19 @@ impl> Link for TestLink {
 		self.link.finality_proof_imported(who, request_block, finalization_result);
 	}
 
-	fn request_finality_proof(&self, hash: &Hash, number: NumberFor) {
+	fn request_finality_proof(&mut self, hash: &Hash, number: NumberFor) {
 		self.link.request_finality_proof(hash, number);
 	}
 
-	fn set_finality_proof_request_builder(&self, request_builder: SharedFinalityProofRequestBuilder) {
+	fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) {
 		self.link.set_finality_proof_request_builder(request_builder);
 	}
 
-	fn report_peer(&self, who: PeerId, reputation_change: i32) {
+	fn report_peer(&mut self, who: PeerId, reputation_change: i32) {
 		self.link.report_peer(who, reputation_change);
 	}
 
-	fn restart(&self) {
+	fn restart(&mut self) {
 		self.link.restart();
 	}
 
@@ -278,7 +352,7 @@ impl> Link for TestLink {
 	/// 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) {
+	fn synchronized(&mut self) {
 		drop(self.network_to_protocol_sender.unbounded_send(FromNetworkMsg::Synchronize))
 	}
 }
@@ -292,7 +366,7 @@ pub struct Peer> {
 	/// we allow it to be unused.
 	#[cfg_attr(not(test), allow(unused))]
 	protocol_status: Arc>>,
-	import_queue: Box>,
+	import_queue: Arc>>>,
 	pub data: D,
 	best_hash: Mutex>,
 	finalized_hash: Mutex>,
@@ -437,7 +511,7 @@ impl> Peer {
 	fn new(
 		protocol_status: Arc>>,
 		client: PeersClient,
-		import_queue: Box>,
+		import_queue: Arc>>>,
 		use_tokio: bool,
 		network_to_protocol_sender: mpsc::UnboundedSender>,
 		protocol_sender: mpsc::UnboundedSender>,
@@ -451,12 +525,6 @@ impl> Peer {
 			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 {
 			protocol_status,
 			peer_id: PeerId::random(),
@@ -535,7 +603,7 @@ impl> Peer {
 	/// Synchronize with import queue.
 	#[cfg(any(test, feature = "test-helpers"))]
 	pub fn import_queue_sync(&self) {
-		self.import_queue.synchronize();
+		self.import_queue.lock().synchronize();
 		let _ = self.net_proto_channel.wait_sync();
 	}
 
@@ -663,7 +731,7 @@ impl> Peer {
 			);
 			let header = block.header.clone();
 			at = hash;
-			self.import_queue.import_blocks(
+			self.import_queue.lock().import_blocks(
 				origin,
 				vec![IncomingBlock {
 					origin: None,
@@ -806,10 +874,12 @@ pub trait TestNetFactory: Sized {
 	fn add_peer(
 		&mut self,
 		protocol_status: Arc>>,
-		import_queue: Box>,
+		import_queue: Arc>>>,
 		tx_pool: EmptyTransactionPool,
 		finality_proof_provider: Option>>,
 		mut protocol: Protocol,
+		protocol_sender: mpsc::UnboundedSender>,
+		network_to_protocol_sender: mpsc::UnboundedSender>,
 		network_sender: mpsc::UnboundedSender>,
 		mut network_to_protocol_rx: mpsc::UnboundedReceiver>,
 		mut protocol_rx: mpsc::UnboundedReceiver>,
@@ -831,6 +901,12 @@ pub trait TestNetFactory: Sized {
 			}
 
 			tokio::runtime::current_thread::run(futures::future::poll_fn(move || {
+				import_queue.lock().poll_actions(&mut TestLink::new(
+					protocol_sender.clone(),
+					network_to_protocol_sender.clone(),
+					network_sender.clone(),
+				));
+
 				while let Async::Ready(msg) = network_to_protocol_rx.poll().unwrap() {
 					let outcome = match msg {
 						Some(FromNetworkMsg::PeerConnected(peer_id)) => {
@@ -858,11 +934,11 @@ pub trait TestNetFactory: Sized {
 
 					match outcome {
 						CustomMessageOutcome::BlockImport(origin, blocks) =>
-							import_queue.import_blocks(origin, blocks),
+							import_queue.lock().import_blocks(origin, blocks),
 						CustomMessageOutcome::JustificationImport(origin, hash, nb, justification) =>
-							import_queue.import_justification(origin, hash, nb, justification),
+							import_queue.lock().import_justification(origin, hash, nb, justification),
 						CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) =>
-							import_queue.import_finality_proof(origin, hash, nb, proof),
+							import_queue.lock().import_finality_proof(origin, hash, nb, proof),
 						CustomMessageOutcome::None => {}
 					}
 				}
@@ -959,13 +1035,13 @@ pub trait TestNetFactory: Sized {
 			= self.make_block_import(PeersClient::Full(client.clone()));
 		let (network_sender, network_port) = mpsc::unbounded();
 
-		let import_queue = Box::new(BasicQueue::new(
+		let import_queue = Arc::new(Mutex::new(Box::new(BasicQueue::new(
 			verifier,
 			block_import,
 			justification_import,
 			finality_proof_import,
 			finality_proof_request_builder,
-		));
+		))));
 		let specialization = self::SpecializationFactory::create();
 
 		let (network_to_protocol_sender, network_to_protocol_rx) = mpsc::unbounded();
@@ -985,6 +1061,8 @@ pub trait TestNetFactory: Sized {
 			EmptyTransactionPool,
 			self.make_finality_proof_provider(PeersClient::Full(client.clone())),
 			protocol,
+			protocol_sender.clone(),
+			network_to_protocol_sender.clone(),
 			network_sender.clone(),
 			network_to_protocol_rx,
 			protocol_rx,
@@ -1013,13 +1091,13 @@ pub trait TestNetFactory: Sized {
 			= self.make_block_import(PeersClient::Light(client.clone()));
 		let (network_sender, network_port) = mpsc::unbounded();
 
-		let import_queue = Box::new(BasicQueue::new(
+		let import_queue = Arc::new(Mutex::new(Box::new(BasicQueue::new(
 			verifier,
 			block_import,
 			justification_import,
 			finality_proof_import,
 			finality_proof_request_builder,
-		));
+		))));
 		let specialization = self::SpecializationFactory::create();
 
 		let (network_to_protocol_sender, network_to_protocol_rx) = mpsc::unbounded();
@@ -1039,6 +1117,8 @@ pub trait TestNetFactory: Sized {
 			EmptyTransactionPool,
 			self.make_finality_proof_provider(PeersClient::Light(client.clone())),
 			protocol,
+			protocol_sender.clone(),
+			network_to_protocol_sender.clone(),
 			network_sender.clone(),
 			network_to_protocol_rx,
 			protocol_rx,
diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs
index a0d17bd7a5..6c4a03ee7b 100644
--- a/core/service/src/chain_ops.rs
+++ b/core/service/src/chain_ops.rs
@@ -17,7 +17,7 @@
 //! Chain utilities.
 
 use std::{self, io::{Read, Write}};
-use futures::Future;
+use futures::prelude::*;
 use log::{info, warn};
 
 use runtime_primitives::generic::{SignedBlock, BlockId};
@@ -99,21 +99,20 @@ pub fn export_blocks(
 }
 
 struct WaitLink {
-	wait_send: std::sync::mpsc::Sender<()>,
+	imported_blocks: u64,
 }
 
 impl WaitLink {
-	fn new(wait_send: std::sync::mpsc::Sender<()>) -> WaitLink {
+	fn new() -> WaitLink {
 		WaitLink {
-			wait_send,
+			imported_blocks: 0,
 		}
 	}
 }
 
 impl Link for WaitLink {
-	fn block_imported(&self, _hash: &B::Hash, _number: NumberFor) {
-		self.wait_send.send(())
-			.expect("Unable to notify main process; if the main process panicked then this thread would already be dead as well. qed.");
+	fn block_imported(&mut self, _hash: &B::Hash, _number: NumberFor) {
+		self.imported_blocks += 1;
 	}
 }
 
@@ -128,11 +127,7 @@ pub fn import_blocks(
 	let client = new_client::(&config)?;
 	// FIXME #1134 this shouldn't need a mutable config.
 	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);
-	queue.start(Box::new(wait_link))?;
+	let mut queue = components::FullComponents::::build_import_queue(&mut config, client.clone(), select_chain)?;
 
 	let (exit_send, exit_recv) = std::sync::mpsc::channel();
 	::std::thread::spawn(move || {
@@ -179,19 +174,23 @@ pub fn import_blocks(
 		}
 	}
 
-	let mut blocks_imported = 0;
-	while blocks_imported < count {
-		wait_recv.recv()
-			.expect("Importing thread has panicked. Then the main process will die before this can be reached. qed.");
-		blocks_imported += 1;
-		if blocks_imported % 1000 == 0 {
+	let mut link = WaitLink::new();
+	tokio::run(futures::future::poll_fn(move || {
+		let blocks_before = link.imported_blocks;
+		queue.poll_actions(&mut link);
+		if link.imported_blocks / 1000 != blocks_before / 1000 {
 			info!(
 				"#{} blocks were imported (#{} left)",
-				blocks_imported,
-				count - blocks_imported
+				link.imported_blocks,
+				count - link.imported_blocks
 			);
 		}
-	}
+		if link.imported_blocks >= count {
+			Ok(Async::Ready(()))
+		} else {
+			Ok(Async::NotReady)
+		}
+	}));
 
 	info!("Imported {} blocks. Best: #{}", block_count, client.info().chain.best_number);
 
-- 
GitLab


From 495addaac8fe68c10d5414512c605c2818b12b4a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= 
Date: Wed, 19 Jun 2019 15:07:40 +0200
Subject: [PATCH 135/140] Activate `std` feature of `session` in `babe` (#2907)

---
 srml/babe/Cargo.toml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml
index d961b724ff..4b82a6c6bc 100644
--- a/srml/babe/Cargo.toml
+++ b/srml/babe/Cargo.toml
@@ -35,4 +35,5 @@ std = [
 	"timestamp/std",
 	"inherents/std",
 	"babe-primitives/std",
+	"session/std",
 ]
-- 
GitLab


From b6c2180d3e438e2a2b2df6620ba3ee71a0174fe7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= 
Date: Wed, 19 Jun 2019 15:08:59 +0200
Subject: [PATCH 136/140] Remove `UserError` and switch to `error::Error`
 (#2899)

* Remove `UserError` and switch to `error::Error`

* More cleanup

* Update core/executor/src/error.rs

Co-Authored-By: Sergei Pepyakin 

* Fix typo

* Update core/executor/src/allocator.rs

Co-Authored-By: Stanislav Tkach 
---
 core/executor/src/allocator.rs     |  77 +++---
 core/executor/src/error.rs         |  21 +-
 core/executor/src/sandbox.rs       |  83 +++---
 core/executor/src/wasm_executor.rs | 405 +++++++++++++++--------------
 core/executor/src/wasm_utils.rs    | 112 +++++---
 5 files changed, 381 insertions(+), 317 deletions(-)

diff --git a/core/executor/src/allocator.rs b/core/executor/src/allocator.rs
index bf01dd2e90..9e61a2c6ef 100644
--- a/core/executor/src/allocator.rs
+++ b/core/executor/src/allocator.rs
@@ -17,9 +17,8 @@
 //! This module implements a freeing-bump allocator.
 //! See more details at https://github.com/paritytech/substrate/issues/1615.
 
-use crate::wasm_utils::UserError;
+use crate::error::{Error, Result};
 use log::trace;
-use wasmi::Error;
 use wasmi::MemoryRef;
 use wasmi::memory_units::Bytes;
 
@@ -34,9 +33,6 @@ const ALIGNMENT: u32 = 8;
 const N: usize = 22;
 const MAX_POSSIBLE_ALLOCATION: u32 = 16777216; // 2^24 bytes
 
-pub const OUT_OF_SPACE: &str = "Requested allocation size does not fit into remaining heap space";
-pub const REQUESTED_SIZE_TOO_LARGE: &str = "Requested size to allocate is too large";
-
 pub struct FreeingBumpHeapAllocator {
 	bumper: u32,
 	heads: [u32; N],
@@ -46,8 +42,12 @@ pub struct FreeingBumpHeapAllocator {
 	total_size: u32,
 }
 
-impl FreeingBumpHeapAllocator {
+/// Create an allocator error.
+fn error(msg: &'static str) -> Error {
+	Error::Allocator(msg)
+}
 
+impl FreeingBumpHeapAllocator {
 	/// Creates a new allocation heap which follows a freeing-bump strategy.
 	/// The maximum size which can be allocated at once is 16 MiB.
 	///
@@ -87,23 +87,22 @@ impl FreeingBumpHeapAllocator {
 
 	/// Gets requested number of bytes to allocate and returns a pointer.
 	/// The maximum size which can be allocated at once is 16 MiB.
-	pub fn allocate(&mut self, size: u32) -> Result {
+	pub fn allocate(&mut self, size: u32) -> Result {
 		if size > MAX_POSSIBLE_ALLOCATION {
-			return Err(UserError(REQUESTED_SIZE_TOO_LARGE));
+			return Err(Error::RequestedAllocationTooLarge);
 		}
 
 		let size = size.max(8);
 		let item_size = size.next_power_of_two();
 		if item_size + 8 + self.total_size > self.max_heap_size {
-			return Err(UserError(OUT_OF_SPACE));
+			return Err(Error::AllocatorOutOfSpace);
 		}
 
 		let list_index = (item_size.trailing_zeros() - 3) as usize;
 		let ptr: u32 = if self.heads[list_index] != 0 {
 			// Something from the free list
 			let item = self.heads[list_index];
-			let four_bytes = self.get_heap_4bytes(item)
-				.map_err(|_| UserError("Unable to get bytes at pointer taken from list of free items"))?;
+			let four_bytes = self.get_heap_4bytes(item)?;
 			self.heads[list_index] = FreeingBumpHeapAllocator::le_bytes_to_u32(four_bytes);
 			item + 8
 		} else {
@@ -111,13 +110,9 @@ impl FreeingBumpHeapAllocator {
 			self.bump(item_size + 8) + 8
 		};
 
-		for i in 1..8 {
-			self.set_heap(ptr - i, 255)
-				.map_err(|_| UserError("Unable to successively write bytes into heap at pointer prefix"))?;
-		}
+		(1..8).try_for_each(|i| self.set_heap(ptr - i, 255))?;
 
-		self.set_heap(ptr - 8, list_index as u8)
-			.map_err(|_| UserError("Unable to write byte into heap at pointer prefix"))?;
+		self.set_heap(ptr - 8, list_index as u8)?;
 
 		self.total_size = self.total_size + item_size + 8;
 		trace!(target: "wasm-heap", "Heap size is {} bytes after allocation", self.total_size);
@@ -126,31 +121,24 @@ impl FreeingBumpHeapAllocator {
 	}
 
 	/// Deallocates the space which was allocated for a pointer.
-	pub fn deallocate(&mut self, ptr: u32) -> Result<(), UserError> {
+	pub fn deallocate(&mut self, ptr: u32) -> Result<()> {
 		let ptr = ptr - self.ptr_offset;
 		if ptr < 8 {
-			return Err(UserError("Invalid pointer for deallocation"));
+			return Err(error("Invalid pointer for deallocation"));
 		}
 
-		let list_index = self.get_heap_byte(ptr - 8)
-			.map_err(|_| UserError("Unable to access pointer prefix"))? as usize;
-		for i in 1..8 {
-			let heap_byte = self.get_heap_byte(ptr - i)
-				.map_err(|_| UserError("Unable to write single bytes into heap at pointer"))?;
-			debug_assert!(heap_byte == 255)
-		}
+		let list_index = usize::from(self.get_heap_byte(ptr - 8)?);
+		(1..8).try_for_each(|i| self.get_heap_byte(ptr - i).map(|byte| assert!(byte == 255)))?;
 		let tail = self.heads[list_index];
 		self.heads[list_index] = ptr - 8;
 
-		let mut slice = self.get_heap_4bytes(ptr - 8)
-			.map_err(|_| UserError("Unable to get 4 bytes from heap at pointer prefix"))?;
+		let mut slice = self.get_heap_4bytes(ptr - 8)?;
 		FreeingBumpHeapAllocator::write_u32_into_le_bytes(tail, &mut slice);
-		self.set_heap_4bytes(ptr - 8, slice)
-			.map_err(|_| UserError("Unable to write 4 bytes into heap at pointer prefix"))?;
+		self.set_heap_4bytes(ptr - 8, slice)?;
 
 		let item_size = FreeingBumpHeapAllocator::get_item_size_from_index(list_index);
 		self.total_size = self.total_size.checked_sub(item_size as u32 + 8)
-			.ok_or_else(|| UserError("Unable to subtract from total heap size without overflow"))?;
+			.ok_or_else(|| error("Unable to subtract from total heap size without overflow"))?;
 		trace!(target: "wasm-heap", "Heap size is {} bytes after deallocation", self.total_size);
 
 		Ok(())
@@ -176,24 +164,24 @@ impl FreeingBumpHeapAllocator {
 		1 << 3 << index
 	}
 
-	fn get_heap_4bytes(&mut self, ptr: u32) -> Result<[u8; 4], Error> {
+	fn get_heap_4bytes(&mut self, ptr: u32) -> Result<[u8; 4]> {
 		let mut arr = [0u8; 4];
 		self.heap.get_into(self.ptr_offset + ptr, &mut arr)?;
 		Ok(arr)
 	}
 
-	fn get_heap_byte(&mut self, ptr: u32) -> Result {
+	fn get_heap_byte(&mut self, ptr: u32) -> Result {
 		let mut arr = [0u8; 1];
 		self.heap.get_into(self.ptr_offset + ptr, &mut arr)?;
 		Ok(arr[0])
 	}
 
-	fn set_heap(&mut self, ptr: u32, value: u8) -> Result<(), Error> {
-		self.heap.set(self.ptr_offset + ptr, &[value])
+	fn set_heap(&mut self, ptr: u32, value: u8) -> Result<()> {
+		self.heap.set(self.ptr_offset + ptr, &[value]).map_err(Into::into)
 	}
 
-	fn set_heap_4bytes(&mut self, ptr: u32, value: [u8; 4]) -> Result<(), Error> {
-		self.heap.set(self.ptr_offset + ptr, &value)
+	fn set_heap_4bytes(&mut self, ptr: u32, value: [u8; 4]) -> Result<()> {
+		self.heap.set(self.ptr_offset + ptr, &value).map_err(Into::into)
 	}
 
 }
@@ -353,7 +341,10 @@ mod tests {
 		// then
 		assert_eq!(ptr.is_err(), true);
 		if let Err(err) = ptr {
-			assert_eq!(err, UserError(OUT_OF_SPACE));
+			match err {
+				Error::AllocatorOutOfSpace => {},
+				_ => panic!("Expected out of space error"),
+			}
 		}
 	}
 
@@ -372,7 +363,10 @@ mod tests {
 		// there is no room for another half page incl. its 8 byte prefix
 		assert_eq!(ptr2.is_err(), true);
 		if let Err(err) = ptr2 {
-			assert_eq!(err, UserError(OUT_OF_SPACE));
+			match err {
+				Error::AllocatorOutOfSpace => {},
+				_ => panic!("Expected out of space error"),
+			}
 		}
 	}
 
@@ -402,7 +396,10 @@ mod tests {
 		// then
 		assert_eq!(ptr.is_err(), true);
 		if let Err(err) = ptr {
-			assert_eq!(err, UserError(REQUESTED_SIZE_TOO_LARGE));
+			match err {
+				Error::RequestedAllocationTooLarge => {},
+				e => panic!("Expected out of space error, got: {:?}", e),
+			}
 		}
 	}
 
diff --git a/core/executor/src/error.rs b/core/executor/src/error.rs
index fdcb6cbc0e..a81fc1b148 100644
--- a/core/executor/src/error.rs
+++ b/core/executor/src/error.rs
@@ -55,9 +55,20 @@ pub enum Error {
 	/// Runtime failed.
 	#[display(fmt="Runtime error")]
 	Runtime,
-	/// Runtime failed.
+	/// Invalid memory reference.
 	#[display(fmt="Invalid memory reference")]
 	InvalidMemoryReference,
+	/// Some other error occurred
+	Other(&'static str),
+	/// Some error occurred in the allocator
+	#[display(fmt="Error in allocator: {}", _0)]
+	Allocator(&'static str),
+	/// The allocator run out of space.
+	#[display(fmt="Allocator run out of space")]
+	AllocatorOutOfSpace,
+	/// Someone tried to allocate more memory than the allowed maximum per allocation.
+	#[display(fmt="Requested allocation size is too large")]
+	RequestedAllocationTooLarge,
 }
 
 impl std::error::Error for Error {
@@ -72,3 +83,11 @@ impl std::error::Error for Error {
 }
 
 impl state_machine::Error for Error {}
+
+impl wasmi::HostError for Error {}
+
+impl From<&'static str> for Error {
+	fn from(err: &'static str) -> Error {
+		Error::Other(err)
+	}
+}
diff --git a/core/executor/src/sandbox.rs b/core/executor/src/sandbox.rs
index 377294f7b1..ceb5f44a26 100644
--- a/core/executor/src/sandbox.rs
+++ b/core/executor/src/sandbox.rs
@@ -18,16 +18,13 @@
 
 //! This module implements sandboxing support in the runtime.
 
-use std::collections::HashMap;
-use std::rc::Rc;
+use crate::error::{Result, Error};
+use std::{collections::HashMap, rc::Rc};
 use parity_codec::{Decode, Encode};
 use primitives::sandbox as sandbox_primitives;
-use crate::wasm_utils::UserError;
-use wasmi;
-use wasmi::memory_units::Pages;
 use wasmi::{
 	Externals, FuncRef, ImportResolver, MemoryInstance, MemoryRef, Module, ModuleInstance,
-	ModuleRef, RuntimeArgs, RuntimeValue, Trap, TrapKind
+	ModuleRef, RuntimeArgs, RuntimeValue, Trap, TrapKind, memory_units::Pages,
 };
 
 /// Index of a function inside the supervisor.
@@ -75,18 +72,18 @@ impl ImportResolver for Imports {
 		module_name: &str,
 		field_name: &str,
 		signature: &::wasmi::Signature,
-	) -> Result {
+	) -> std::result::Result {
 		let key = (
 			module_name.as_bytes().to_owned(),
 			field_name.as_bytes().to_owned(),
 		);
 		let idx = *self.func_map.get(&key).ok_or_else(|| {
-			::wasmi::Error::Instantiation(format!(
+			wasmi::Error::Instantiation(format!(
 				"Export {}:{} not found",
 				module_name, field_name
 			))
 		})?;
-		Ok(::wasmi::FuncInstance::alloc_host(signature.clone(), idx.0))
+		Ok(wasmi::FuncInstance::alloc_host(signature.clone(), idx.0))
 	}
 
 	fn resolve_memory(
@@ -94,7 +91,7 @@ impl ImportResolver for Imports {
 		module_name: &str,
 		field_name: &str,
 		_memory_type: &::wasmi::MemoryDescriptor,
-	) -> Result {
+	) -> std::result::Result {
 		let key = (
 			module_name.as_bytes().to_vec(),
 			field_name.as_bytes().to_vec(),
@@ -102,7 +99,7 @@ impl ImportResolver for Imports {
 		let mem = self.memories_map
 			.get(&key)
 			.ok_or_else(|| {
-				::wasmi::Error::Instantiation(format!(
+				wasmi::Error::Instantiation(format!(
 					"Export {}:{} not found",
 					module_name, field_name
 				))
@@ -116,8 +113,8 @@ impl ImportResolver for Imports {
 		module_name: &str,
 		field_name: &str,
 		_global_type: &::wasmi::GlobalDescriptor,
-	) -> Result<::wasmi::GlobalRef, ::wasmi::Error> {
-		Err(::wasmi::Error::Instantiation(format!(
+	) -> std::result::Result {
+		Err(wasmi::Error::Instantiation(format!(
 			"Export {}:{} not found",
 			module_name, field_name
 		)))
@@ -128,8 +125,8 @@ impl ImportResolver for Imports {
 		module_name: &str,
 		field_name: &str,
 		_table_type: &::wasmi::TableDescriptor,
-	) -> Result<::wasmi::TableRef, ::wasmi::Error> {
-		Err(::wasmi::Error::Instantiation(format!(
+	) -> std::result::Result {
+		Err(wasmi::Error::Instantiation(format!(
 			"Export {}:{} not found",
 			module_name, field_name
 		)))
@@ -153,7 +150,7 @@ pub trait SandboxCapabilities {
 	/// Returns `Err` if allocation not possible or errors during heap management.
 	///
 	/// Returns pointer to the allocated block.
-	fn allocate(&mut self, len: u32) -> Result;
+	fn allocate(&mut self, len: u32) -> Result;
 
 	/// Deallocate space specified by the pointer that was previously returned by [`allocate`].
 	///
@@ -162,21 +159,21 @@ pub trait SandboxCapabilities {
 	/// Returns `Err` if deallocation not possible or because of errors in heap management.
 	///
 	/// [`allocate`]: #tymethod.allocate
-	fn deallocate(&mut self, ptr: u32) -> Result<(), UserError>;
+	fn deallocate(&mut self, ptr: u32) -> Result<()>;
 
 	/// Write `data` into the supervisor memory at offset specified by `ptr`.
 	///
 	/// # Errors
 	///
 	/// Returns `Err` if `ptr + data.len()` is out of bounds.
-	fn write_memory(&mut self, ptr: u32, data: &[u8]) -> Result<(), UserError>;
+	fn write_memory(&mut self, ptr: u32, data: &[u8]) -> Result<()>;
 
 	/// Read `len` bytes from the supervisor memory.
 	///
 	/// # Errors
 	///
 	/// Returns `Err` if `ptr + len` is out of bounds.
-	fn read_memory(&self, ptr: u32, len: u32) -> Result, UserError>;
+	fn read_memory(&self, ptr: u32, len: u32) -> Result>;
 }
 
 /// Implementation of [`Externals`] that allows execution of guest module with
@@ -190,12 +187,12 @@ pub struct GuestExternals<'a, FE: SandboxCapabilities + Externals + 'a> {
 }
 
 fn trap(msg: &'static str) -> Trap {
-	TrapKind::Host(Box::new(UserError(msg))).into()
+	TrapKind::Host(Box::new(Error::Other(msg))).into()
 }
 
-fn deserialize_result(serialized_result: &[u8]) -> Result, Trap> {
+fn deserialize_result(serialized_result: &[u8]) -> std::result::Result, Trap> {
 	use self::sandbox_primitives::{HostError, ReturnValue};
-	let result_val = Result::::decode(&mut &serialized_result[..])
+	let result_val = std::result::Result::::decode(&mut &serialized_result[..])
 		.ok_or_else(|| trap("Decoding Result failed!"))?;
 
 	match result_val {
@@ -212,7 +209,7 @@ impl<'a, FE: SandboxCapabilities + Externals + 'a> Externals for GuestExternals<
 		&mut self,
 		index: usize,
 		args: RuntimeArgs,
-	) -> Result, Trap> {
+	) -> std::result::Result, Trap> {
 		// Make `index` typesafe again.
 		let index = GuestFuncIndex(index);
 
@@ -331,7 +328,7 @@ impl SandboxInstance {
 		args: &[RuntimeValue],
 		supervisor_externals: &mut FE,
 		state: u32,
-	) -> Result, wasmi::Error> {
+	) -> std::result::Result, wasmi::Error> {
 		with_guest_externals(
 			supervisor_externals,
 			self,
@@ -362,7 +359,7 @@ pub enum InstantiationError {
 fn decode_environment_definition(
 	raw_env_def: &[u8],
 	memories: &[Option],
-) -> Result<(Imports, GuestToSupervisorFunctionMapping), InstantiationError> {
+) -> std::result::Result<(Imports, GuestToSupervisorFunctionMapping), InstantiationError> {
 	let env_def = sandbox_primitives::EnvironmentDefinition::decode(&mut &raw_env_def[..])
 		.ok_or_else(|| InstantiationError::EnvironmentDefintionCorrupted)?;
 
@@ -420,7 +417,7 @@ pub fn instantiate(
 	wasm: &[u8],
 	raw_env_def: &[u8],
 	state: u32,
-) -> Result {
+) -> std::result::Result {
 	let (imports, guest_to_supervisor_mapping) =
 		decode_environment_definition(raw_env_def, &supervisor_externals.store().memories)?;
 
@@ -476,7 +473,7 @@ impl Store {
 	///
 	/// Returns `Err` if the memory couldn't be created.
 	/// Typically happens if `initial` is more than `maximum`.
-	pub fn new_memory(&mut self, initial: u32, maximum: u32) -> Result {
+	pub fn new_memory(&mut self, initial: u32, maximum: u32) -> Result {
 		let maximum = match maximum {
 			sandbox_primitives::MEM_UNLIMITED => None,
 			specified_limit => Some(Pages(specified_limit as usize)),
@@ -486,8 +483,7 @@ impl Store {
 			MemoryInstance::alloc(
 				Pages(initial as usize),
 				maximum,
-			)
-			.map_err(|_| UserError("Sandboxed memory allocation error"))?;
+			)?;
 
 		let mem_idx = self.memories.len();
 		self.memories.push(Some(mem));
@@ -500,12 +496,12 @@ impl Store {
 	///
 	/// Returns `Err` If `instance_idx` isn't a valid index of an instance or
 	/// instance is already torndown.
-	pub fn instance(&self, instance_idx: u32) -> Result, UserError> {
+	pub fn instance(&self, instance_idx: u32) -> Result> {
 		self.instances
 			.get(instance_idx as usize)
 			.cloned()
-			.ok_or_else(|| UserError("Trying to access a non-existent instance"))?
-			.ok_or_else(|| UserError("Trying to access a torndown instance"))
+			.ok_or_else(|| "Trying to access a non-existent instance")?
+			.ok_or_else(|| "Trying to access a torndown instance".into())
 	}
 
 	/// Returns reference to a memory instance by `memory_idx`.
@@ -514,12 +510,12 @@ impl Store {
 	///
 	/// Returns `Err` If `memory_idx` isn't a valid index of an memory or
 	/// if memory has been torn down.
-	pub fn memory(&self, memory_idx: u32) -> Result {
+	pub fn memory(&self, memory_idx: u32) -> Result {
 		self.memories
 			.get(memory_idx as usize)
 			.cloned()
-			.ok_or_else(|| UserError("Trying to access a non-existent sandboxed memory"))?
-			.ok_or_else(|| UserError("Trying to access a torndown sandboxed memory"))
+			.ok_or_else(|| "Trying to access a non-existent sandboxed memory")?
+			.ok_or_else(|| "Trying to access a torndown sandboxed memory".into())
 	}
 
 	/// Tear down the memory at the specified index.
@@ -528,10 +524,10 @@ impl Store {
 	///
 	/// Returns `Err` if `memory_idx` isn't a valid index of an memory or
 	/// if it has been torn down.
-	pub fn memory_teardown(&mut self, memory_idx: u32) -> Result<(), UserError> {
+	pub fn memory_teardown(&mut self, memory_idx: u32) -> Result<()> {
 		match self.memories.get_mut(memory_idx as usize) {
-			None => Err(UserError("Trying to teardown a non-existent sandboxed memory")),
-			Some(None) => Err(UserError("Double teardown of a sandboxed memory")),
+			None => Err("Trying to teardown a non-existent sandboxed memory".into()),
+			Some(None) => Err("Double teardown of a sandboxed memory".into()),
 			Some(memory) => {
 				*memory = None;
 				Ok(())
@@ -545,10 +541,10 @@ impl Store {
 	///
 	/// Returns `Err` if `instance_idx` isn't a valid index of an instance or
 	/// if it has been torn down.
-	pub fn instance_teardown(&mut self, instance_idx: u32) -> Result<(), UserError> {
+	pub fn instance_teardown(&mut self, instance_idx: u32) -> Result<()> {
 		match self.instances.get_mut(instance_idx as usize) {
-			None => Err(UserError("Trying to teardown a non-existent instance")),
-			Some(None) => Err(UserError("Double teardown of an instance")),
+			None => Err("Trying to teardown a non-existent instance".into()),
+			Some(None) => Err("Double teardown of an instance".into()),
 			Some(instance) => {
 				*instance = None;
 				Ok(())
@@ -565,9 +561,8 @@ impl Store {
 
 #[cfg(test)]
 mod tests {
+	use super::*;
 	use primitives::{Blake2Hasher};
-	use crate::allocator;
-	use crate::sandbox::trap;
 	use crate::wasm_executor::WasmExecutor;
 	use state_machine::TestExternalities as CoreTestExternalities;
 	use wabt;
@@ -647,7 +642,7 @@ mod tests {
 		if let Err(err) = res {
 			assert_eq!(
 				format!("{}", err),
-				format!("{}", wasmi::Error::Trap(trap(allocator::OUT_OF_SPACE)))
+				format!("{}", wasmi::Error::Trap(Error::AllocatorOutOfSpace.into()))
 			);
 		}
 	}
diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs
index 22a871bf2f..cbb47195de 100644
--- a/core/executor/src/wasm_executor.rs
+++ b/core/executor/src/wasm_executor.rs
@@ -16,20 +16,16 @@
 
 //! Rust implementation of Substrate contracts.
 
-use std::collections::HashMap;
-use std::convert::TryFrom;
-use std::str;
+use std::{collections::HashMap, convert::TryFrom, str};
 use tiny_keccak;
 use secp256k1;
 
 use wasmi::{
 	Module, ModuleInstance, MemoryInstance, MemoryRef, TableRef, ImportsBuilder, ModuleRef,
+	memory_units::Pages, RuntimeValue::{I32, I64, self},
 };
-use wasmi::RuntimeValue::{I32, I64, self};
-use wasmi::memory_units::{Pages};
 use state_machine::{Externalities, ChildStorageKey};
 use crate::error::{Error, Result};
-use crate::wasm_utils::UserError;
 use primitives::{blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair};
 use primitives::offchain;
 use primitives::hexdisplay::HexDisplay;
@@ -78,42 +74,41 @@ impl<'e, E: Externalities> sandbox::SandboxCapabilities for Functi
 	fn store_mut(&mut self) -> &mut sandbox::Store {
 		&mut self.sandbox_store
 	}
-	fn allocate(&mut self, len: u32) -> ::std::result::Result {
+	fn allocate(&mut self, len: u32) -> Result {
 		self.heap.allocate(len)
 	}
-	fn deallocate(&mut self, ptr: u32) -> ::std::result::Result<(), UserError> {
+	fn deallocate(&mut self, ptr: u32) -> Result<()> {
 		self.heap.deallocate(ptr)
 	}
-	fn write_memory(&mut self, ptr: u32, data: &[u8]) -> ::std::result::Result<(), UserError> {
-		self.memory.set(ptr, data).map_err(|_| UserError("Invalid attempt to write_memory"))
+	fn write_memory(&mut self, ptr: u32, data: &[u8]) -> Result<()> {
+		self.memory.set(ptr, data).map_err(Into::into)
 	}
-	fn read_memory(&self, ptr: u32, len: u32) -> ::std::result::Result, UserError> {
-		self.memory.get(ptr, len as usize).map_err(|_| UserError("Invalid attempt to write_memory"))
+	fn read_memory(&self, ptr: u32, len: u32) -> Result> {
+		self.memory.get(ptr, len as usize).map_err(Into::into)
 	}
 }
 
 trait WritePrimitive {
-	fn write_primitive(&self, offset: u32, t: T) -> ::std::result::Result<(), UserError>;
+	fn write_primitive(&self, offset: u32, t: T) -> Result<()>;
 }
 
 impl WritePrimitive for MemoryInstance {
-	fn write_primitive(&self, offset: u32, t: u32) -> ::std::result::Result<(), UserError> {
+	fn write_primitive(&self, offset: u32, t: u32) -> Result<()> {
 		use byteorder::{LittleEndian, ByteOrder};
 		let mut r = [0u8; 4];
 		LittleEndian::write_u32(&mut r, t);
-		self.set(offset, &r).map_err(|_| UserError("Invalid attempt to write_primitive"))
+		self.set(offset, &r).map_err(Into::into)
 	}
 }
 
 trait ReadPrimitive {
-	fn read_primitive(&self, offset: u32) -> ::std::result::Result;
+	fn read_primitive(&self, offset: u32) -> Result;
 }
 
 impl ReadPrimitive for MemoryInstance {
-	fn read_primitive(&self, offset: u32) -> ::std::result::Result {
+	fn read_primitive(&self, offset: u32) -> Result {
 		use byteorder::{LittleEndian, ByteOrder};
-		let result = self.get(offset, 4)
-			.map_err(|_| UserError("Invalid attempt to read_primitive"))?;
+		let result = self.get(offset, 4)?;
 		Ok(LittleEndian::read_u32(&result))
 	}
 }
@@ -167,14 +162,14 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 	},
 	ext_set_storage(key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32) => {
 		let key = this.memory.get(key_data, key_len as usize)
-			.map_err(|_| UserError("Invalid attempt to determine key in ext_set_storage"))?;
+			.map_err(|_| "Invalid attempt to determine key in ext_set_storage")?;
 		let value = this.memory.get(value_data, value_len as usize)
-			.map_err(|_| UserError("Invalid attempt to determine value in ext_set_storage"))?;
+			.map_err(|_| "Invalid attempt to determine value in ext_set_storage")?;
 		if let Some(_preimage) = this.hash_lookup.get(&key) {
 			debug_trace!(
 				target: "wasm-trace",
 				"*** Setting storage: %{} -> {}   [k={}]",
-				::primitives::hexdisplay::ascii_format(&_preimage),
+				primitives::hexdisplay::ascii_format(&_preimage),
 				HexDisplay::from(&value),
 				HexDisplay::from(&key),
 			);
@@ -182,7 +177,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			debug_trace!(
 				target: "wasm-trace",
 				"*** Setting storage:  {} -> {}   [k={}]",
-				::primitives::hexdisplay::ascii_format(&key),
+				primitives::hexdisplay::ascii_format(&key),
 				HexDisplay::from(&value),
 				HexDisplay::from(&key),
 			);
@@ -199,32 +194,30 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		value_len: u32
 	) => {
 		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_set_child_storage"))?;
+			.map_err(|_| "Invalid attempt to determine storage_key in ext_set_child_storage")?;
 		let key = this.memory.get(key_data, key_len as usize)
-			.map_err(|_| UserError("Invalid attempt to determine key in ext_set_child_storage"))?;
+			.map_err(|_| "Invalid attempt to determine key in ext_set_child_storage")?;
 		let value = this.memory.get(value_data, value_len as usize)
-			.map_err(|_| UserError("Invalid attempt to determine value in ext_set_child_storage"))?;
+			.map_err(|_| "Invalid attempt to determine value in ext_set_child_storage")?;
 		if let Some(_preimage) = this.hash_lookup.get(&key) {
 			debug_trace!(
 				target: "wasm-trace", "*** Setting child storage: {} -> %{} -> {}   [k={}]",
-				::primitives::hexdisplay::ascii_format(&storage_key),
-				::primitives::hexdisplay::ascii_format(&_preimage),
+				primitives::hexdisplay::ascii_format(&storage_key),
+				primitives::hexdisplay::ascii_format(&_preimage),
 				HexDisplay::from(&value),
 				HexDisplay::from(&key)
 			);
 		} else {
 			debug_trace!(
 				target: "wasm-trace", "*** Setting child storage: {} ->  {} -> {}   [k={}]",
-				::primitives::hexdisplay::ascii_format(&storage_key),
-				::primitives::hexdisplay::ascii_format(&key),
+				primitives::hexdisplay::ascii_format(&storage_key),
+				primitives::hexdisplay::ascii_format(&key),
 				HexDisplay::from(&value),
 				HexDisplay::from(&key)
 			);
 		}
 		let storage_key = ChildStorageKey::from_vec(storage_key)
-			.ok_or_else(||
-				UserError("ext_set_child_storage: child storage key is invalid")
-			)?;
+			.ok_or_else(|| "ext_set_child_storage: child storage key is invalid")?;
 		this.ext.set_child_storage(storage_key, key, value);
 		Ok(())
 	},
@@ -237,39 +230,43 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		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_clear_child_storage"))?;
+		).map_err(|_| "Invalid attempt to determine storage_key in ext_clear_child_storage")?;
 		let key = this.memory.get(key_data, key_len as usize)
-			.map_err(|_| UserError("Invalid attempt to determine key in ext_clear_child_storage"))?;
-		debug_trace!(target: "wasm-trace", "*** Clearing child storage: {} -> {}   [k={}]",
-			::primitives::hexdisplay::ascii_format(&storage_key),
+			.map_err(|_| "Invalid attempt to determine key in ext_clear_child_storage")?;
+		debug_trace!(
+			target: "wasm-trace", "*** Clearing child storage: {} -> {}   [k={}]",
+			primitives::hexdisplay::ascii_format(&storage_key),
 			if let Some(_preimage) = this.hash_lookup.get(&key) {
-				format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
+				format!("%{}", primitives::hexdisplay::ascii_format(&_preimage))
 			} else {
-				format!(" {}", ::primitives::hexdisplay::ascii_format(&key))
-			}, HexDisplay::from(&key)
+				format!(" {}", primitives::hexdisplay::ascii_format(&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")
-			)?;
+			.ok_or_else(|| "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) => {
 		let key = this.memory.get(key_data, key_len as usize)
-			.map_err(|_| UserError("Invalid attempt to determine key in ext_clear_storage"))?;
-		debug_trace!(target: "wasm-trace", "*** Clearing storage: {}   [k={}]",
+			.map_err(|_| "Invalid attempt to determine key in ext_clear_storage")?;
+		debug_trace!(
+			target: "wasm-trace", "*** Clearing storage: {}   [k={}]",
 			if let Some(_preimage) = this.hash_lookup.get(&key) {
 				format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
 			} else {
 				format!(" {}", ::primitives::hexdisplay::ascii_format(&key))
-			}, HexDisplay::from(&key));
+			},
+			HexDisplay::from(&key)
+		);
 		this.ext.clear_storage(&key);
 		Ok(())
 	},
 	ext_exists_storage(key_data: *const u8, key_len: u32) -> u32 => {
 		let key = this.memory.get(key_data, key_len as usize)
-			.map_err(|_| UserError("Invalid attempt to determine key in ext_exists_storage"))?;
+			.map_err(|_| "Invalid attempt to determine key in ext_exists_storage")?;
 		Ok(if this.ext.exists_storage(&key) { 1 } else { 0 })
 	},
 	ext_exists_child_storage(
@@ -281,18 +278,16 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		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_exists_child_storage"))?;
+		).map_err(|_| "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"))?;
+			.map_err(|_| "Invalid attempt to determine key in ext_exists_child_storage")?;
 		let storage_key = ChildStorageKey::from_vec(storage_key)
-			.ok_or_else(||
-				UserError("ext_exists_child_storage: child storage key is not valid")
-			)?;
+			.ok_or_else(|| "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"))?;
+			.map_err(|_| "Invalid attempt to determine prefix in ext_clear_prefix")?;
 		this.ext.clear_prefix(&prefix);
 		Ok(())
 	},
@@ -300,11 +295,9 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		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_kill_child_storage"))?;
+		).map_err(|_| "Invalid attempt to determine storage_key in ext_kill_child_storage")?;
 		let storage_key = ChildStorageKey::from_vec(storage_key)
-			.ok_or_else(||
-				UserError("ext_exists_child_storage: child storage key is not valid")
-			)?;
+			.ok_or_else(|| "ext_exists_child_storage: child storage key is not valid")?;
 		this.ext.kill_child_storage(storage_key);
 		Ok(())
 	},
@@ -313,10 +306,11 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		let key = this.memory.get(
 			key_data,
 			key_len as usize
-		).map_err(|_| UserError("Invalid attempt to determine key in ext_get_allocated_storage"))?;
+		).map_err(|_| "Invalid attempt to determine key in ext_get_allocated_storage")?;
 		let maybe_value = this.ext.storage(&key);
 
-		debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {}   [k={}]",
+		debug_trace!(
+			target: "wasm-trace", "*** Getting storage: {} == {}   [k={}]",
 			if let Some(_preimage) = this.hash_lookup.get(&key) {
 				format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
 			} else {
@@ -327,19 +321,19 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			} else {
 				""
 			},
-			HexDisplay::from(&key)
+			HexDisplay::from(&key),
 		);
 
 		if let Some(value) = maybe_value {
 			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_get_allocated_storage"))?;
+				.map_err(|_| "Invalid attempt to set memory in ext_get_allocated_storage")?;
 			this.memory.write_primitive(written_out, value.len() as u32)
-				.map_err(|_| UserError("Invalid attempt to write written_out in ext_get_allocated_storage"))?;
+				.map_err(|_| "Invalid attempt to write written_out in ext_get_allocated_storage")?;
 			Ok(offset)
 		} else {
 			this.memory.write_primitive(written_out, u32::max_value())
-				.map_err(|_| UserError("Invalid attempt to write failed written_out in ext_get_allocated_storage"))?;
+				.map_err(|_| "Invalid attempt to write failed written_out in ext_get_allocated_storage")?;
 			Ok(0)
 		}
 	},
@@ -354,22 +348,21 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		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_get_allocated_child_storage"))?;
+		).map_err(|_| "Invalid attempt to determine storage_key in ext_get_allocated_child_storage")?;
 		let key = this.memory.get(
 			key_data,
 			key_len as usize
-		).map_err(|_| UserError("Invalid attempt to determine key in ext_get_allocated_child_storage"))?;
+		).map_err(|_| "Invalid attempt to determine key in ext_get_allocated_child_storage")?;
 
 		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")
-				)?;
+				.ok_or_else(|| "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),
+		debug_trace!(
+			target: "wasm-trace", "*** Getting child storage: {} -> {} == {}   [k={}]",
+			primitives::hexdisplay::ascii_format(&storage_key),
 			if let Some(_preimage) = this.hash_lookup.get(&key) {
 				format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
 			} else {
@@ -380,19 +373,19 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			} else {
 				""
 			},
-			HexDisplay::from(&key)
+			HexDisplay::from(&key),
 		);
 
 		if let Some(value) = maybe_value {
 			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_get_allocated_child_storage"))?;
+				.map_err(|_| "Invalid attempt to set memory in ext_get_allocated_child_storage")?;
 			this.memory.write_primitive(written_out, value.len() as u32)
-				.map_err(|_| UserError("Invalid attempt to write written_out in ext_get_allocated_child_storage"))?;
+				.map_err(|_| "Invalid attempt to write written_out in ext_get_allocated_child_storage")?;
 			Ok(offset)
 		} else {
 			this.memory.write_primitive(written_out, u32::max_value())
-				.map_err(|_| UserError("Invalid attempt to write failed written_out in ext_get_allocated_child_storage"))?;
+				.map_err(|_| "Invalid attempt to write failed written_out in ext_get_allocated_child_storage")?;
 			Ok(0)
 		}
 	},
@@ -405,27 +398,28 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		value_offset: u32
 	) -> u32 => {
 		let key = this.memory.get(key_data, key_len as usize)
-			.map_err(|_| UserError("Invalid attempt to get key in ext_get_storage_into"))?;
+			.map_err(|_| "Invalid attempt to get key in ext_get_storage_into")?;
 		let maybe_value = this.ext.storage(&key);
-		debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {}   [k={}]",
+		debug_trace!(
+			target: "wasm-trace", "*** Getting storage: {} == {}   [k={}]",
 			if let Some(_preimage) = this.hash_lookup.get(&key) {
-				format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
+				format!("%{}", primitives::hexdisplay::ascii_format(&_preimage))
 			} else {
-				format!(" {}", ::primitives::hexdisplay::ascii_format(&key))
+				format!(" {}", primitives::hexdisplay::ascii_format(&key))
 			},
 			if let Some(ref b) = maybe_value {
 				&format!("{}", HexDisplay::from(b))
 			} else {
 				""
 			},
-			HexDisplay::from(&key)
+			HexDisplay::from(&key),
 		);
 
 		if let Some(value) = maybe_value {
 			let value = &value[value_offset as usize..];
-			let written = ::std::cmp::min(value_len as usize, value.len());
+			let written = std::cmp::min(value_len as usize, value.len());
 			this.memory.set(value_data, &value[..written])
-				.map_err(|_| UserError("Invalid attempt to set value in ext_get_storage_into"))?;
+				.map_err(|_| "Invalid attempt to set value in ext_get_storage_into")?;
 			Ok(written as u32)
 		} else {
 			Ok(u32::max_value())
@@ -444,21 +438,20 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		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_get_child_storage_into"))?;
+		).map_err(|_| "Invalid attempt to determine storage_key in ext_get_child_storage_into")?;
 		let key = this.memory.get(
 			key_data,
 			key_len as usize
-		).map_err(|_| UserError("Invalid attempt to get key in ext_get_child_storage_into"))?;
+		).map_err(|_| "Invalid attempt to get key in ext_get_child_storage_into")?;
 
 		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")
-				)?;
+				.ok_or_else(|| "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),
+		debug_trace!(
+			target: "wasm-trace", "*** Getting storage: {} -> {} == {}   [k={}]",
+			primitives::hexdisplay::ascii_format(&storage_key),
 			if let Some(_preimage) = this.hash_lookup.get(&key) {
 				format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
 			} else {
@@ -469,14 +462,14 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			} else {
 				""
 			},
-			HexDisplay::from(&key)
+			HexDisplay::from(&key),
 		);
 
 		if let Some(value) = maybe_value {
 			let value = &value[value_offset as usize..];
 			let written = ::std::cmp::min(value_len as usize, value.len());
 			this.memory.set(value_data, &value[..written])
-				.map_err(|_| UserError("Invalid attempt to set value in ext_get_child_storage_into"))?;
+				.map_err(|_| "Invalid attempt to set value in ext_get_child_storage_into")?;
 			Ok(written as u32)
 		} else {
 			Ok(u32::max_value())
@@ -485,7 +478,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 	ext_storage_root(result: *mut u8) => {
 		let r = this.ext.storage_root();
 		this.memory.set(result, r.as_ref())
-			.map_err(|_| UserError("Invalid attempt to set memory in ext_storage_root"))?;
+			.map_err(|_| "Invalid attempt to set memory in ext_storage_root")?;
 		Ok(())
 	},
 	ext_child_storage_root(
@@ -494,33 +487,31 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		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"))?;
+			.map_err(|_| "Invalid attempt to determine storage_key in ext_child_storage_root")?;
 		let storage_key = ChildStorageKey::from_slice(&*storage_key)
-			.ok_or_else(||
-				UserError("ext_child_storage_root: child storage key is not valid")
-			)?;
+			.ok_or_else(|| "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"))?;
+			.map_err(|_| "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"))?;
+			.map_err(|_| "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, result: *mut u8) -> u32 => {
 		let mut parent_hash = H256::default();
 		if parent_hash_len != parent_hash.as_ref().len() as u32 {
-			return Err(UserError("Invalid parent_hash_len in ext_storage_changes_root").into());
+			return Err("Invalid parent_hash_len in ext_storage_changes_root".into());
 		}
 		let raw_parent_hash = this.memory.get(parent_hash_data, parent_hash_len as usize)
-			.map_err(|_| UserError("Invalid attempt to get parent_hash in ext_storage_changes_root"))?;
+			.map_err(|_| "Invalid attempt to get parent_hash in ext_storage_changes_root")?;
 		parent_hash.as_mut().copy_from_slice(&raw_parent_hash[..]);
 		let r = this.ext.storage_changes_root(parent_hash)
-			.map_err(|_| UserError("Invaid parent_hash passed to ext_storage_changes_root"))?;
+			.map_err(|_| "Invaid parent_hash passed to ext_storage_changes_root")?;
 		if let Some(r) = r {
 			this.memory.set(result, &r[..])
-				.map_err(|_| UserError("Invalid attempt to set memory in ext_storage_changes_root"))?;
+				.map_err(|_| "Invalid attempt to set memory in ext_storage_changes_root")?;
 			Ok(1)
 		} else {
 			Ok(0)
@@ -534,17 +525,21 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 	) => {
 		let values = (0..lens_len)
 			.map(|i| this.memory.read_primitive(lens_data + i * 4))
-			.collect::<::std::result::Result, UserError>>()?
+			.collect::>>()?
 			.into_iter()
 			.scan(0u32, |acc, v| { let o = *acc; *acc += v; Some((o, v)) })
 			.map(|(offset, len)|
 				this.memory.get(values_data + offset, len as usize)
-					.map_err(|_| UserError("Invalid attempt to get memory in ext_blake2_256_enumerated_trie_root"))
+					.map_err(|_|
+						Error::from(
+							"Invalid attempt to get memory in ext_blake2_256_enumerated_trie_root"
+						)
+					)
 			)
-			.collect::<::std::result::Result, UserError>>()?;
+			.collect::>>()?;
 		let r = ordered_trie_root::(values.into_iter());
 		this.memory.set(result, &r[..])
-			.map_err(|_| UserError("Invalid attempt to set memory in ext_blake2_256_enumerated_trie_root"))?;
+			.map_err(|_| "Invalid attempt to set memory in ext_blake2_256_enumerated_trie_root")?;
 		Ok(())
 	},
 	ext_chain_id() -> u64 => {
@@ -558,22 +553,24 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			hashed
 		} else {
 			let key = this.memory.get(data, len as usize)
-				.map_err(|_| UserError("Invalid attempt to get key in ext_twox_64"))?;
+				.map_err(|_| "Invalid attempt to get key in ext_twox_64")?;
 			let hashed_key = twox_64(&key);
-			debug_trace!(target: "xxhash", "XXhash: {} -> {}",
+
+			debug_trace!(
+				target: "xxhash", "XXhash: {} -> {}",
 				if let Ok(_skey) = str::from_utf8(&key) {
 					_skey
 				} else {
 					&format!("{}", HexDisplay::from(&key))
 				},
-				HexDisplay::from(&hashed_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"))?;
+		this.memory.set(out, &result).map_err(|_| "Invalid attempt to set result in ext_twox_64")?;
 		Ok(())
 	},
 	ext_twox_128(data: *const u8, len: u32, out: *mut u8) => {
@@ -584,22 +581,23 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			hashed
 		} else {
 			let key = this.memory.get(data, len as usize)
-				.map_err(|_| UserError("Invalid attempt to get key in ext_twox_128"))?;
+				.map_err(|_| "Invalid attempt to get key in ext_twox_128")?;
 			let hashed_key = twox_128(&key);
-			debug_trace!(target: "xxhash", "XXhash: {} -> {}",
+			debug_trace!(
+				target: "xxhash", "XXhash: {} -> {}",
 				&if let Ok(_skey) = str::from_utf8(&key) {
 					*_skey
 				} else {
 					format!("{}", HexDisplay::from(&key))
 				},
-				HexDisplay::from(&hashed_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_128"))?;
+			.map_err(|_| "Invalid attempt to set result in ext_twox_128")?;
 		Ok(())
 	},
 	ext_twox_256(data: *const u8, len: u32, out: *mut u8) => {
@@ -607,11 +605,10 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			twox_256(&[0u8; 0])
 		} else {
 			let mem = this.memory.get(data, len as usize)
-				.map_err(|_| UserError("Invalid attempt to get data in ext_twox_256"))?;
+				.map_err(|_| "Invalid attempt to get data in ext_twox_256")?;
 			twox_256(&mem)
 		};
-		this.memory.set(out, &result)
-			.map_err(|_| UserError("Invalid attempt to set result in ext_twox_256"))?;
+		this.memory.set(out, &result).map_err(|_| "Invalid attempt to set result in ext_twox_256")?;
 		Ok(())
 	},
 	ext_blake2_128(data: *const u8, len: u32, out: *mut u8) => {
@@ -621,14 +618,14 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			hashed
 		} else {
 			let key = this.memory.get(data, len as usize)
-				.map_err(|_| UserError("Invalid attempt to get key in ext_blake2_128"))?;
+				.map_err(|_| "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"))?;
+			.map_err(|_| "Invalid attempt to set result in ext_blake2_128")?;
 		Ok(())
 	},
 	ext_blake2_256(data: *const u8, len: u32, out: *mut u8) => {
@@ -636,11 +633,10 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			blake2_256(&[0u8; 0])
 		} else {
 			let mem = this.memory.get(data, len as usize)
-				.map_err(|_| UserError("Invalid attempt to get data in ext_blake2_256"))?;
+				.map_err(|_| "Invalid attempt to get data in ext_blake2_256")?;
 			blake2_256(&mem)
 		};
-		this.memory.set(out, &result)
-			.map_err(|_| UserError("Invalid attempt to set result in ext_blake2_256"))?;
+		this.memory.set(out, &result).map_err(|_| "Invalid attempt to set result in ext_blake2_256")?;
 		Ok(())
 	},
 	ext_keccak_256(data: *const u8, len: u32, out: *mut u8) => {
@@ -648,22 +644,21 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			tiny_keccak::keccak256(&[0u8; 0])
 		} else {
 			let mem = this.memory.get(data, len as usize)
-				.map_err(|_| UserError("Invalid attempt to get data in ext_keccak_256"))?;
+				.map_err(|_| "Invalid attempt to get data in ext_keccak_256")?;
 			tiny_keccak::keccak256(&mem)
 		};
-		this.memory.set(out, &result)
-			.map_err(|_| UserError("Invalid attempt to set result in ext_keccak_256"))?;
+		this.memory.set(out, &result).map_err(|_| "Invalid attempt to set result in ext_keccak_256")?;
 		Ok(())
 	},
 	ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => {
 		let mut sig = [0u8; 64];
 		this.memory.get_into(sig_data, &mut sig[..])
-			.map_err(|_| UserError("Invalid attempt to get signature in ext_ed25519_verify"))?;
+			.map_err(|_| "Invalid attempt to get signature in ext_ed25519_verify")?;
 		let mut pubkey = [0u8; 32];
 		this.memory.get_into(pubkey_data, &mut pubkey[..])
-			.map_err(|_| UserError("Invalid attempt to get pubkey in ext_ed25519_verify"))?;
+			.map_err(|_| "Invalid attempt to get pubkey in ext_ed25519_verify")?;
 		let msg = this.memory.get(msg_data, msg_len as usize)
-			.map_err(|_| UserError("Invalid attempt to get message in ext_ed25519_verify"))?;
+			.map_err(|_| "Invalid attempt to get message in ext_ed25519_verify")?;
 
 		Ok(if ed25519::Pair::verify_weak(&sig, &msg, &pubkey) {
 			0
@@ -674,12 +669,12 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 	ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => {
 		let mut sig = [0u8; 64];
 		this.memory.get_into(sig_data, &mut sig[..])
-			.map_err(|_| UserError("Invalid attempt to get signature in ext_sr25519_verify"))?;
+			.map_err(|_| "Invalid attempt to get signature in ext_sr25519_verify")?;
 		let mut pubkey = [0u8; 32];
 		this.memory.get_into(pubkey_data, &mut pubkey[..])
-			.map_err(|_| UserError("Invalid attempt to get pubkey in ext_sr25519_verify"))?;
+			.map_err(|_| "Invalid attempt to get pubkey in ext_sr25519_verify")?;
 		let msg = this.memory.get(msg_data, msg_len as usize)
-			.map_err(|_| UserError("Invalid attempt to get message in ext_sr25519_verify"))?;
+			.map_err(|_| "Invalid attempt to get message in ext_sr25519_verify")?;
 
 		Ok(if sr25519::Pair::verify_weak(&sig, &msg, &pubkey) {
 			0
@@ -690,7 +685,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 	ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32 => {
 		let mut sig = [0u8; 65];
 		this.memory.get_into(sig_data, &mut sig[..])
-			.map_err(|_| UserError("Invalid attempt to get signature in ext_secp256k1_ecdsa_recover"))?;
+			.map_err(|_| "Invalid attempt to get signature in ext_secp256k1_ecdsa_recover")?;
 		let rs = match secp256k1::Signature::parse_slice(&sig[0..64]) {
 			Ok(rs) => rs,
 			_ => return Ok(1),
@@ -703,7 +698,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 
 		let mut msg = [0u8; 32];
 		this.memory.get_into(msg_data, &mut msg[..])
-			.map_err(|_| UserError("Invalid attempt to get message in ext_secp256k1_ecdsa_recover"))?;
+			.map_err(|_| "Invalid attempt to get message in ext_secp256k1_ecdsa_recover")?;
 
 		let pubkey = match secp256k1::recover(&secp256k1::Message::parse(&msg), &rs, &v) {
 			Ok(pk) => pk,
@@ -711,27 +706,27 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		};
 
 		this.memory.set(pubkey_data, &pubkey.serialize()[1..65])
-			.map_err(|_| UserError("Invalid attempt to set pubkey in ext_secp256k1_ecdsa_recover"))?;
+			.map_err(|_| "Invalid attempt to set pubkey in ext_secp256k1_ecdsa_recover")?;
 
 		Ok(0)
 	},
 	ext_submit_transaction(msg_data: *const u8, len: u32) -> u32 => {
 		let extrinsic = this.memory.get(msg_data, len as usize)
-			.map_err(|_| UserError("OOB while ext_submit_transaction: wasm"))?;
+			.map_err(|_| "OOB while ext_submit_transaction: wasm")?;
 
 		let res = this.ext.offchain()
 			.map(|api| api.submit_transaction(extrinsic))
-			.ok_or_else(|| UserError("Calling unavailable API ext_submit_transaction: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_submit_transaction: wasm")?;
 
 		Ok(if res.is_ok() { 0 } else { 1 })
 	},
 	ext_new_crypto_key(crypto: u32) -> u32 => {
 		let kind = offchain::CryptoKind::try_from(crypto)
-			.map_err(|_| UserError("crypto kind OOB while ext_new_crypto_key: wasm"))?;
+			.map_err(|_| "crypto kind OOB while ext_new_crypto_key: wasm")?;
 
 		let res = this.ext.offchain()
 			.map(|api| api.new_crypto_key(kind))
-			.ok_or_else(|| UserError("Calling unavailable API ext_new_crypto_key: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_new_crypto_key: wasm")?;
 
 		match res {
 			Ok(key_id) => Ok(key_id.0 as u32),
@@ -740,79 +735,79 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 	},
 	ext_encrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8 => {
 		let key = u32_to_key(key)
-			.map_err(|_| UserError("key OOB while ext_encrypt: wasm"))?;
+			.map_err(|_| "Key OOB while ext_encrypt: wasm")?;
 		let message = this.memory.get(data, data_len as usize)
-			.map_err(|_| UserError("OOB while ext_encrypt: wasm"))?;
+			.map_err(|_| "OOB while ext_encrypt: wasm")?;
 
 		let res = this.ext.offchain()
 			.map(|api| api.encrypt(key, &*message))
-			.ok_or_else(|| UserError("Calling unavailable API ext_encrypt: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_encrypt: wasm")?;
 
 		let (offset,len) = match res {
 			Ok(encrypted) => {
 				let len = encrypted.len() as u32;
 				let offset = this.heap.allocate(len)? as u32;
 				this.memory.set(offset, &encrypted)
-					.map_err(|_| UserError("Invalid attempt to set memory in ext_encrypt"))?;
+					.map_err(|_| "Invalid attempt to set memory in ext_encrypt")?;
 				(offset, len)
 			},
 			Err(()) => (0, u32::max_value()),
 		};
 
 		this.memory.write_primitive(msg_len, len)
-			.map_err(|_| UserError("Invalid attempt to write msg_len in ext_encrypt"))?;
+			.map_err(|_| "Invalid attempt to write msg_len in ext_encrypt")?;
 
 		Ok(offset)
 	},
 	ext_decrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8 => {
 		let key = u32_to_key(key)
-			.map_err(|_| UserError("key OOB while ext_decrypt: wasm"))?;
+			.map_err(|_| "Key OOB while ext_decrypt: wasm")?;
 		let message = this.memory.get(data, data_len as usize)
-			.map_err(|_| UserError("OOB while ext_decrypt: wasm"))?;
+			.map_err(|_| "OOB while ext_decrypt: wasm")?;
 
 		let res = this.ext.offchain()
 			.map(|api| api.decrypt(key, &*message))
-			.ok_or_else(|| UserError("Calling unavailable API ext_decrypt: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_decrypt: wasm")?;
 
 		let (offset,len) = match res {
 			Ok(decrypted) => {
 				let len = decrypted.len() as u32;
 				let offset = this.heap.allocate(len)? as u32;
 				this.memory.set(offset, &decrypted)
-					.map_err(|_| UserError("Invalid attempt to set memory in ext_decrypt"))?;
+					.map_err(|_| "Invalid attempt to set memory in ext_decrypt")?;
 				(offset, len)
 			},
 			Err(()) => (0, u32::max_value()),
 		};
 
 		this.memory.write_primitive(msg_len, len)
-			.map_err(|_| UserError("Invalid attempt to write msg_len in ext_decrypt"))?;
+			.map_err(|_| "Invalid attempt to write msg_len in ext_decrypt")?;
 
 		Ok(offset)
 	},
 	ext_sign(key: u32, data: *const u8, data_len: u32, sig_data_len: *mut u32) -> *mut u8  => {
 		let key = u32_to_key(key)
-			.map_err(|_| UserError("key OOB while ext_sign: wasm"))?;
+			.map_err(|_| "Key OOB while ext_sign: wasm")?;
 		let message = this.memory.get(data, data_len as usize)
-			.map_err(|_| UserError("OOB while ext_sign: wasm"))?;
+			.map_err(|_| "OOB while ext_sign: wasm")?;
 
 		let res = this.ext.offchain()
 			.map(|api| api.sign(key, &*message))
-			.ok_or_else(|| UserError("Calling unavailable API ext_sign: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_sign: wasm")?;
 
 		let (offset,len) = match res {
 			Ok(signature) => {
 				let len = signature.len() as u32;
 				let offset = this.heap.allocate(len)? as u32;
 				this.memory.set(offset, &signature)
-					.map_err(|_| UserError("Invalid attempt to set memory in ext_sign"))?;
+					.map_err(|_| "Invalid attempt to set memory in ext_sign")?;
 				(offset, len)
 			},
 			Err(()) => (0, u32::max_value()),
 		};
 
 		this.memory.write_primitive(sig_data_len, len)
-			.map_err(|_| UserError("Invalid attempt to write sig_data_len in ext_sign"))?;
+			.map_err(|_| "Invalid attempt to write sig_data_len in ext_sign")?;
 
 		Ok(offset)
 	},
@@ -824,15 +819,15 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		signature_len: u32
 	) -> u32 => {
 		let key = u32_to_key(key)
-			.map_err(|_| UserError("key OOB while ext_verify: wasm"))?;
+			.map_err(|_| "Key OOB while ext_verify: wasm")?;
 		let message = this.memory.get(msg, msg_len as usize)
-			.map_err(|_| UserError("OOB while ext_verify: wasm"))?;
+			.map_err(|_| "OOB while ext_verify: wasm")?;
 		let signature = this.memory.get(signature, signature_len as usize)
-			.map_err(|_| UserError("OOB while ext_verify: wasm"))?;
+			.map_err(|_| "OOB while ext_verify: wasm")?;
 
 		let res = this.ext.offchain()
 			.map(|api| api.verify(key, &*message, &*signature))
-			.ok_or_else(|| UserError("Calling unavailable API ext_verify: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_verify: wasm")?;
 
 		match res {
 			Ok(true) => Ok(0),
@@ -843,56 +838,56 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 	ext_timestamp() -> u64 => {
 		let timestamp = this.ext.offchain()
 			.map(|api| api.timestamp())
-			.ok_or_else(|| UserError("Calling unavailable API ext_timestamp: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_timestamp: wasm")?;
 		Ok(timestamp.unix_millis())
 	},
 	ext_sleep_until(deadline: u64) => {
 		this.ext.offchain()
 			.map(|api| api.sleep_until(offchain::Timestamp::from_unix_millis(deadline)))
-			.ok_or_else(|| UserError("Calling unavailable API ext_sleep_until: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_sleep_until: wasm")?;
 		Ok(())
 	},
 	ext_random_seed(seed_data: *mut u8) => {
 		// NOTE the runtime as assumptions about seed size.
 		let seed: [u8; 32] = this.ext.offchain()
 			.map(|api| api.random_seed())
-			.ok_or_else(|| UserError("Calling unavailable API ext_random_seed: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_random_seed: wasm")?;
 
 		this.memory.set(seed_data, &seed)
-			.map_err(|_| UserError("Invalid attempt to set value in ext_random_seed"))?;
+			.map_err(|_| "Invalid attempt to set value in ext_random_seed")?;
 		Ok(())
 	},
 	ext_local_storage_set(key: *const u8, key_len: u32, value: *const u8, value_len: u32) => {
 		let key = this.memory.get(key, key_len as usize)
-			.map_err(|_| UserError("OOB while ext_local_storage_set: wasm"))?;
+			.map_err(|_| "OOB while ext_local_storage_set: wasm")?;
 		let value = this.memory.get(value, value_len as usize)
-			.map_err(|_| UserError("OOB while ext_local_storage_set: wasm"))?;
+			.map_err(|_| "OOB while ext_local_storage_set: wasm")?;
 
 		this.ext.offchain()
 			.map(|api| api.local_storage_set(&key, &value))
-			.ok_or_else(|| UserError("Calling unavailable API ext_local_storage_set: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_local_storage_set: wasm")?;
 
 		Ok(())
 	},
 	ext_local_storage_get(key: *const u8, key_len: u32, value_len: *mut u32) -> *mut u8 => {
 		let key = this.memory.get(key, key_len as usize)
-			.map_err(|_| UserError("OOB while ext_local_storage_get: wasm"))?;
+			.map_err(|_| "OOB while ext_local_storage_get: wasm")?;
 
 		let maybe_value = this.ext.offchain()
 			.map(|api| api.local_storage_get(&key))
-			.ok_or_else(|| UserError("Calling unavailable API ext_local_storage_get: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_local_storage_get: wasm")?;
 
 		let (offset, len) = if let Some(value) = maybe_value {
 			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_local_storage_get"))?;
+				.map_err(|_| "Invalid attempt to set memory in ext_local_storage_get")?;
 			(offset, value.len() as u32)
 		} else {
 			(0, u32::max_value())
 		};
 
 		this.memory.write_primitive(value_len, len)
-			.map_err(|_| UserError("Invalid attempt to write value_len in ext_local_storage_get"))?;
+			.map_err(|_| "Invalid attempt to write value_len in ext_local_storage_get")?;
 
 		Ok(offset)
 	},
@@ -905,20 +900,20 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		meta_len: u32
 	) -> u32 => {
 		let method = this.memory.get(method, method_len as usize)
-			.map_err(|_| UserError("OOB while ext_http_request_start: wasm"))?;
+			.map_err(|_| "OOB while ext_http_request_start: wasm")?;
 		let url = this.memory.get(url, url_len as usize)
-			.map_err(|_| UserError("OOB while ext_http_request_start: wasm"))?;
+			.map_err(|_| "OOB while ext_http_request_start: wasm")?;
 		let meta = this.memory.get(meta, meta_len as usize)
-			.map_err(|_| UserError("OOB while ext_http_request_start: wasm"))?;
+			.map_err(|_| "OOB while ext_http_request_start: wasm")?;
 
 		let method_str = str::from_utf8(&method)
-			.map_err(|_| UserError("invalid str while ext_http_request_start: wasm"))?;
+			.map_err(|_| "invalid str while ext_http_request_start: wasm")?;
 		let url_str = str::from_utf8(&url)
-			.map_err(|_| UserError("invalid str while ext_http_request_start: wasm"))?;
+			.map_err(|_| "invalid str while ext_http_request_start: wasm")?;
 
 		let id = this.ext.offchain()
 			.map(|api| api.http_request_start(method_str, url_str, &*meta))
-			.ok_or_else(|| UserError("Calling unavailable API ext_http_request_start: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_http_request_start: wasm")?;
 
 		if let Ok(id) = id {
 			Ok(id.0 as u32)
@@ -934,14 +929,14 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		value_len: u32
 	) -> u32 => {
 		let name = this.memory.get(name, name_len as usize)
-			.map_err(|_| UserError("OOB while ext_http_request_add_header: wasm"))?;
+			.map_err(|_| "OOB while ext_http_request_add_header: wasm")?;
 		let value = this.memory.get(value, value_len as usize)
-			.map_err(|_| UserError("OOB while ext_http_request_add_header: wasm"))?;
+			.map_err(|_| "OOB while ext_http_request_add_header: wasm")?;
 
 		let name_str = str::from_utf8(&name)
-			.map_err(|_| UserError("invalid str while ext_http_request_add_header: wasm"))?;
+			.map_err(|_| "Invalid str while ext_http_request_add_header: wasm")?;
 		let value_str = str::from_utf8(&value)
-			.map_err(|_| UserError("invalid str while ext_http_request_add_header: wasm"))?;
+			.map_err(|_| "Invalid str while ext_http_request_add_header: wasm")?;
 
 		let res = this.ext.offchain()
 			.map(|api| api.http_request_add_header(
@@ -949,7 +944,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 				&name_str,
 				&value_str,
 			))
-			.ok_or_else(|| UserError("Calling unavailable API ext_http_request_add_header: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_http_request_add_header: wasm")?;
 
 		Ok(if res.is_ok() { 0 } else { 1 })
 	},
@@ -960,7 +955,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		deadline: u64
 	) -> u32 => {
 		let chunk = this.memory.get(chunk, chunk_len as usize)
-			.map_err(|_| UserError("OOB while ext_http_request_write_body: wasm"))?;
+			.map_err(|_| "OOB while ext_http_request_write_body: wasm")?;
 
 		let res = this.ext.offchain()
 			.map(|api| api.http_request_write_body(
@@ -968,7 +963,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 				&chunk,
 				deadline_to_timestamp(deadline)
 			))
-			.ok_or_else(|| UserError("Calling unavailable API ext_http_request_write_body: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_http_request_write_body: wasm")?;
 
 		Ok(match res {
 			Ok(()) => 0,
@@ -985,13 +980,13 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 			.map(|i|
 				 this.memory.read_primitive(ids + i * 4)
 					.map(|id: u32| offchain::HttpRequestId(id as u16))
-					.map_err(|_| UserError("OOB while ext_http_response_wait: wasm"))
+					.map_err(|_| "OOB while ext_http_response_wait: wasm")
 			)
 			.collect::<::std::result::Result, _>>()?;
 
 		let res = this.ext.offchain()
 			.map(|api| api.http_response_wait(&ids, deadline_to_timestamp(deadline)))
-			.ok_or_else(|| UserError("Calling unavailable API ext_http_response_wait: wasm"))?
+			.ok_or_else(|| "Calling unavailable API ext_http_response_wait: wasm")?
 			.into_iter()
 			.map(|status| status.into())
 			.enumerate()
@@ -1000,7 +995,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 
 		for (i, status) in res {
 			this.memory.write_primitive(statuses + i as u32 * 4, status)
-				.map_err(|_| UserError("Invalid attempt to set memory in ext_http_response_wait"))?;
+				.map_err(|_| "Invalid attempt to set memory in ext_http_response_wait")?;
 		}
 
 		Ok(())
@@ -1013,15 +1008,15 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 
 		let headers = this.ext.offchain()
 			.map(|api| api.http_response_headers(offchain::HttpRequestId(request_id as u16)))
-			.ok_or_else(|| UserError("Calling unavailable API ext_http_response_headers: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_http_response_headers: wasm")?;
 
 		let encoded = headers.encode();
 		let len = encoded.len() as u32;
 		let offset = this.heap.allocate(len)? as u32;
 		this.memory.set(offset, &encoded)
-			.map_err(|_| UserError("Invalid attempt to set memory in ext_http_response_headers"))?;
+			.map_err(|_| "Invalid attempt to set memory in ext_http_response_headers")?;
 		this.memory.write_primitive(written_out, len)
-			.map_err(|_| UserError("Invalid attempt to write written_out in ext_http_response_headers"))?;
+			.map_err(|_| "Invalid attempt to write written_out in ext_http_response_headers")?;
 
 		Ok(offset)
 	},
@@ -1040,12 +1035,12 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 				&mut internal_buffer,
 				deadline_to_timestamp(deadline),
 			))
-			.ok_or_else(|| UserError("Calling unavailable API ext_http_response_read_body: wasm"))?;
+			.ok_or_else(|| "Calling unavailable API ext_http_response_read_body: wasm")?;
 
 		Ok(match res {
 			Ok(read) => {
 				this.memory.set(buffer, &internal_buffer[..read])
-					.map_err(|_| UserError("Invalid attempt to set memory in ext_http_response_read_body"))?;
+					.map_err(|_| "Invalid attempt to set memory in ext_http_response_read_body")?;
 
 				read as u32
 			},
@@ -1063,17 +1058,17 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 		state: usize
 	) -> u32 => {
 		let wasm = this.memory.get(wasm_ptr, wasm_len as usize)
-			.map_err(|_| UserError("OOB while ext_sandbox_instantiate: wasm"))?;
+			.map_err(|_| "OOB while ext_sandbox_instantiate: wasm")?;
 		let raw_env_def = this.memory.get(imports_ptr, imports_len as usize)
-			.map_err(|_| UserError("OOB while ext_sandbox_instantiate: imports"))?;
+			.map_err(|_| "OOB while ext_sandbox_instantiate: imports")?;
 
 		// Extract a dispatch thunk from instance's table by the specified index.
 		let dispatch_thunk = {
 			let table = this.table.as_ref()
-				.ok_or_else(|| UserError("Runtime doesn't have a table; sandbox is unavailable"))?;
+				.ok_or_else(|| "Runtime doesn't have a table; sandbox is unavailable")?;
 			table.get(dispatch_thunk_idx)
-				.map_err(|_| UserError("dispatch_thunk_idx is out of the table bounds"))?
-				.ok_or_else(|| UserError("dispatch_thunk_idx points on an empty table entry"))?
+				.map_err(|_| "dispatch_thunk_idx is out of the table bounds")?
+				.ok_or_else(|| "dispatch_thunk_idx points on an empty table entry")?
 				.clone()
 		};
 
@@ -1104,17 +1099,17 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 
 		trace!(target: "sr-sandbox", "invoke, instance_idx={}", instance_idx);
 		let export = this.memory.get(export_ptr, export_len as usize)
-			.map_err(|_| UserError("OOB while ext_sandbox_invoke: export"))
+			.map_err(|_| "OOB while ext_sandbox_invoke: export")
 			.and_then(|b|
 				String::from_utf8(b)
-					.map_err(|_| UserError("export name should be a valid utf-8 sequence"))
+					.map_err(|_| "Export name should be a valid utf-8 sequence")
 			)?;
 
 		// Deserialize arguments and convert them into wasmi types.
 		let serialized_args = this.memory.get(args_ptr, args_len as usize)
-			.map_err(|_| UserError("OOB while ext_sandbox_invoke: args"))?;
+			.map_err(|_| "OOB while ext_sandbox_invoke: args")?;
 		let args = Vec::::decode(&mut &serialized_args[..])
-			.ok_or_else(|| UserError("Can't decode serialized arguments for the invocation"))?
+			.ok_or_else(|| "Can't decode serialized arguments for the invocation")?
 			.into_iter()
 			.map(Into::into)
 			.collect::>();
@@ -1128,11 +1123,11 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
 				// Serialize return value and write it back into the memory.
 				sandbox_primitives::ReturnValue::Value(val.into()).using_encoded(|val| {
 					if val.len() > return_val_len as usize {
-						Err(UserError("Return value buffer is too small"))?;
+						Err("Return value buffer is too small")?;
 					}
 					this.memory
 						.set(return_val_ptr, val)
-						.map_err(|_| UserError("Return value buffer is OOB"))?;
+						.map_err(|_| "Return value buffer is OOB")?;
 					Ok(sandbox_primitives::ERR_OK)
 				})
 			}
@@ -1228,7 +1223,13 @@ impl WasmExecutor {
 	) -> Result {
 		let module = wasmi::Module::from_buffer(code)?;
 		let module = self.prepare_module(ext, heap_pages, &module)?;
-		self.call_in_wasm_module_with_custom_signature(ext, &module, method, create_parameters, filter_result)
+		self.call_in_wasm_module_with_custom_signature(
+			ext,
+			&module,
+			method,
+			create_parameters,
+			filter_result,
+		)
 	}
 
 	fn get_mem_instance(module: &ModuleRef) -> Result {
@@ -1293,7 +1294,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(|_| Error::Runtime)?;
+			let offset = fec.heap.allocate(data.len() as u32)?;
 			memory.set(offset, &data)?;
 			Ok(offset)
 		})?;
diff --git a/core/executor/src/wasm_utils.rs b/core/executor/src/wasm_utils.rs
index 7384f91944..47867f7b48 100644
--- a/core/executor/src/wasm_utils.rs
+++ b/core/executor/src/wasm_utils.rs
@@ -16,31 +16,73 @@
 
 //! Rust implementation of Substrate contracts.
 
-use wasmi::{ValueType, RuntimeValue, HostError};
+use wasmi::{ValueType, RuntimeValue};
 use wasmi::nan_preserving_float::{F32, F64};
-use std::fmt;
-
-#[derive(Debug, PartialEq)]
-pub struct UserError(pub &'static str);
-impl fmt::Display for UserError {
-	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-		write!(f, "UserError: {}", self.0)
-	}
-}
-impl HostError for UserError {
-}
-
-pub trait ConvertibleToWasm { const VALUE_TYPE: ValueType; type NativeType; fn to_runtime_value(self) -> RuntimeValue; }
-impl ConvertibleToWasm for i32 { type NativeType = i32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self) } }
-impl ConvertibleToWasm for u32 { type NativeType = u32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as i32) } }
-impl ConvertibleToWasm for i64 { type NativeType = i64; const VALUE_TYPE: ValueType = ValueType::I64; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I64(self) } }
-impl ConvertibleToWasm for u64 { type NativeType = u64; const VALUE_TYPE: ValueType = ValueType::I64; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I64(self as i64) } }
-impl ConvertibleToWasm for F32 { type NativeType = F32; const VALUE_TYPE: ValueType = ValueType::F32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::F32(self) } }
-impl ConvertibleToWasm for F64 { type NativeType = F64; const VALUE_TYPE: ValueType = ValueType::F64; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::F64(self) } }
-impl ConvertibleToWasm for isize { type NativeType = i32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as i32) } }
-impl ConvertibleToWasm for usize { type NativeType = u32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as u32 as i32) } }
-impl ConvertibleToWasm for *const T { type NativeType = u32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as isize as i32) } }
-impl ConvertibleToWasm for *mut T { type NativeType = u32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as isize as i32) } }
+
+pub trait ConvertibleToWasm {
+	const VALUE_TYPE: ValueType;
+	type NativeType; fn to_runtime_value(self) -> RuntimeValue;
+}
+
+impl ConvertibleToWasm for i32 {
+	type NativeType = i32;
+	const VALUE_TYPE: ValueType = ValueType::I32;
+	fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self) }
+}
+
+impl ConvertibleToWasm for u32 {
+	type NativeType = u32;
+	const VALUE_TYPE: ValueType = ValueType::I32;
+	fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as i32) }
+}
+
+impl ConvertibleToWasm for i64 {
+	type NativeType = i64;
+	const VALUE_TYPE: ValueType = ValueType::I64;
+	fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I64(self) }
+}
+
+impl ConvertibleToWasm for u64 {
+	type NativeType = u64;
+	const VALUE_TYPE: ValueType = ValueType::I64;
+	fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I64(self as i64) }
+}
+
+impl ConvertibleToWasm for F32 {
+	type NativeType = F32;
+	const VALUE_TYPE: ValueType = ValueType::F32;
+	fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::F32(self) }
+}
+
+impl ConvertibleToWasm for F64 {
+	type NativeType = F64;
+	const VALUE_TYPE: ValueType = ValueType::F64;
+	fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::F64(self) }
+}
+
+impl ConvertibleToWasm for isize {
+	type NativeType = i32;
+	const VALUE_TYPE: ValueType = ValueType::I32;
+	fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as i32) }
+}
+
+impl ConvertibleToWasm for usize {
+	type NativeType = u32;
+	const VALUE_TYPE: ValueType = ValueType::I32;
+	fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as u32 as i32) }
+}
+
+impl ConvertibleToWasm for *const T {
+	type NativeType = u32;
+	const VALUE_TYPE: ValueType = ValueType::I32;
+	fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as isize as i32) }
+}
+
+impl ConvertibleToWasm for *mut T {
+	type NativeType = u32;
+	const VALUE_TYPE: ValueType = ValueType::I32;
+	fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as isize as i32) }
+}
 
 /// Converts arguments into respective WASM types.
 #[macro_export]
@@ -118,7 +160,7 @@ macro_rules! unmarshall_args {
 #[inline(always)]
 pub fn constrain_closure(f: F) -> F
 where
-	F: FnOnce() -> Result
+	F: FnOnce() -> Result
 {
 	f
 }
@@ -132,14 +174,14 @@ macro_rules! marshall {
 		>(|| {
 			unmarshall_args!($body, $objectname, $args_iter, $( $names : $params ),*)
 		});
-		let r = body()?;
+		let r = body().map_err(wasmi::Trap::from)?;
 		return Ok(Some({ use $crate::wasm_utils::ConvertibleToWasm; r.to_runtime_value() }))
 	});
 	( $args_iter:ident, $objectname:ident, ( $( $names:ident : $params:ty ),* ) => $body:tt ) => ({
 		let body = $crate::wasm_utils::constrain_closure::<(), _>(|| {
 			unmarshall_args!($body, $objectname, $args_iter, $( $names : $params ),*)
 		});
-		body()?;
+		body().map_err(wasmi::Trap::from)?;
 		return Ok(None)
 	})
 }
@@ -154,7 +196,13 @@ macro_rules! dispatch_fn {
 		panic!("fn with index {} is undefined", $index);
 	};
 
-	( @iter $index:expr, $index_ident:ident, $objectname:ident, $args_iter:ident, $name:ident ( $( $names:ident : $params:ty ),* ) $( -> $returns:ty )* => $body:tt $($tail:tt)*) => (
+	(@iter
+		$index:expr,
+		$index_ident:ident,
+		$objectname:ident,
+		$args_iter:ident,
+		$name:ident ( $( $names:ident : $params:ty ),* ) $( -> $returns:ty )* => $body:tt $($tail:tt)*
+	) => (
 		if $index_ident == $index {
 			{ marshall!($args_iter, $objectname, ( $( $names : $params ),* ) $( -> $returns )* => $body) }
 		}
@@ -177,7 +225,11 @@ macro_rules! impl_function_executor {
 			fn resolver() -> &'static dyn $crate::wasmi::ModuleImportResolver {
 				struct Resolver;
 				impl $crate::wasmi::ModuleImportResolver for Resolver {
-					fn resolve_func(&self, name: &str, signature: &$crate::wasmi::Signature) -> ::std::result::Result<$crate::wasmi::FuncRef, $crate::wasmi::Error> {
+					fn resolve_func(
+						&self,
+						name: &str,
+						signature: &$crate::wasmi::Signature
+					) -> std::result::Result<$crate::wasmi::FuncRef, $crate::wasmi::Error> {
 						resolve_fn!(signature, name, $( $name( $( $params ),* ) $( -> $returns )* => )*);
 
 						Err($crate::wasmi::Error::Instantiation(
@@ -194,7 +246,7 @@ macro_rules! impl_function_executor {
 				&mut self,
 				index: usize,
 				args: $crate::wasmi::RuntimeArgs,
-			) -> ::std::result::Result, $crate::wasmi::Trap> {
+			) -> std::result::Result, $crate::wasmi::Trap> {
 				let $objectname = self;
 				let mut args = args.as_ref().iter();
 				dispatch_fn!(index, $objectname, args, $( $name( $( $names : $params ),* ) $( -> $returns )* => $body ),*);
-- 
GitLab


From 0ead54732eb44083660aee1778a01adc5173dfb3 Mon Sep 17 00:00:00 2001
From: Sergei Pepyakin 
Date: Wed, 19 Jun 2019 15:26:33 +0200
Subject: [PATCH 137/140] =?UTF-8?q?Rename:=20srml-contract=20=E2=86=92=20s?=
 =?UTF-8?q?rml-contracts=20(#2905)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* srml-contract → srml-contracts

* Trim.

* Bump version
---
 Cargo.lock                                    |  6 +-
 Cargo.toml                                    |  2 +-
 README.adoc                                   |  2 +-
 node/cli/src/chain_spec.rs                    | 10 +--
 node/executor/Cargo.toml                      |  2 +-
 node/executor/src/lib.rs                      | 75 ++++++++++++++-----
 node/runtime/Cargo.toml                       |  6 +-
 node/runtime/src/lib.rs                       | 16 ++--
 node/runtime/wasm/Cargo.lock                  |  4 +-
 srml/{contract => contracts}/COMPLEXITY.md    |  0
 srml/{contract => contracts}/Cargo.toml       |  2 +-
 .../{contract => contracts}/src/account_db.rs | 14 +++-
 srml/{contract => contracts}/src/exec.rs      |  0
 srml/{contract => contracts}/src/gas.rs       |  0
 srml/{contract => contracts}/src/lib.rs       |  0
 srml/{contract => contracts}/src/rent.rs      |  0
 srml/{contract => contracts}/src/tests.rs     |  0
 .../src/wasm/code_cache.rs                    |  3 +-
 .../src/wasm/env_def/macros.rs                |  0
 .../src/wasm/env_def/mod.rs                   |  0
 srml/{contract => contracts}/src/wasm/mod.rs  | 10 ++-
 .../src/wasm/prepare.rs                       |  0
 .../src/wasm/runtime.rs                       |  0
 23 files changed, 102 insertions(+), 50 deletions(-)
 rename srml/{contract => contracts}/COMPLEXITY.md (100%)
 rename srml/{contract => contracts}/Cargo.toml (98%)
 rename srml/{contract => contracts}/src/account_db.rs (97%)
 rename srml/{contract => contracts}/src/exec.rs (100%)
 rename srml/{contract => contracts}/src/gas.rs (100%)
 rename srml/{contract => contracts}/src/lib.rs (100%)
 rename srml/{contract => contracts}/src/rent.rs (100%)
 rename srml/{contract => contracts}/src/tests.rs (100%)
 rename srml/{contract => contracts}/src/wasm/code_cache.rs (98%)
 rename srml/{contract => contracts}/src/wasm/env_def/macros.rs (100%)
 rename srml/{contract => contracts}/src/wasm/env_def/mod.rs (100%)
 rename srml/{contract => contracts}/src/wasm/mod.rs (99%)
 rename srml/{contract => contracts}/src/wasm/prepare.rs (100%)
 rename srml/{contract => contracts}/src/wasm/runtime.rs (100%)

diff --git a/Cargo.lock b/Cargo.lock
index 4f9a55e87d..b89743546f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2178,7 +2178,7 @@ dependencies = [
  "sr-io 2.0.0",
  "sr-primitives 2.0.0",
  "srml-balances 2.0.0",
- "srml-contract 2.0.0",
+ "srml-contracts 2.0.0",
  "srml-grandpa 2.0.0",
  "srml-indices 2.0.0",
  "srml-session 2.0.0",
@@ -2238,7 +2238,7 @@ dependencies = [
  "sr-version 2.0.0",
  "srml-aura 2.0.0",
  "srml-balances 2.0.0",
- "srml-contract 2.0.0",
+ "srml-contracts 2.0.0",
  "srml-council 2.0.0",
  "srml-democracy 2.0.0",
  "srml-executive 2.0.0",
@@ -3499,7 +3499,7 @@ dependencies = [
 ]
 
 [[package]]
-name = "srml-contract"
+name = "srml-contracts"
 version = "2.0.0"
 dependencies = [
  "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/Cargo.toml b/Cargo.toml
index 2f4139c7af..f45353204f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -64,7 +64,7 @@ members = [
 	"srml/assets",
 	"srml/aura",
 	"srml/balances",
-	"srml/contract",
+	"srml/contracts",
 	"srml/council",
 	"srml/democracy",
 	"srml/example",
diff --git a/README.adoc b/README.adoc
index 2a76525914..826370ee6f 100644
--- a/README.adoc
+++ b/README.adoc
@@ -388,7 +388,7 @@ substrate-trie
 sr-api, sr-io, sr-primitives, sr-sandbox, sr-std, sr-version
 * Substrate Runtime Module Library (SRML)
 [source, shell]
-srml-assets, srml-balances, srml-consensus, srml-contract, srml-council, srml-democracy, srml-example,
+srml-assets, srml-balances, srml-consensus, srml-contracts, srml-council, srml-democracy, srml-example,
 srml-executive, srml-metadata, srml-session, srml-staking, srml-support, srml-system, srml-timestamp,
 srml-treasury
 * Node
diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs
index 7f3c250d7c..672c75b1a9 100644
--- a/node/cli/src/chain_spec.rs
+++ b/node/cli/src/chain_spec.rs
@@ -20,7 +20,7 @@ use primitives::{ed25519, sr25519, Pair, crypto::UncheckedInto};
 use node_primitives::{AccountId, AuraId};
 use node_runtime::{CouncilSeatsConfig, AuraConfig, DemocracyConfig, SystemConfig,
 	SessionConfig, StakingConfig, StakerStatus, TimestampConfig, BalancesConfig, TreasuryConfig,
-	SudoConfig, ContractConfig, GrandpaConfig, IndicesConfig, Permill, Perbill, SessionKeys};
+	SudoConfig, ContractsConfig, GrandpaConfig, IndicesConfig, Permill, Perbill, SessionKeys};
 pub use node_runtime::GenesisConfig;
 use substrate_service;
 use hex_literal::hex;
@@ -162,7 +162,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig {
 			spend_period: 1 * DAYS,
 			burn: Permill::from_percent(50),
 		}),
-		contract: Some(ContractConfig {
+		contracts: Some(ContractsConfig {
 			signed_claim_handicap: 2,
 			rent_byte_price: 4,
 			rent_deposit_offset: 1000,
@@ -268,7 +268,7 @@ pub fn testnet_genesis(
 	const ENDOWMENT: u128 = 1 << 20;
 
 	let council_desired_seats = (endowed_accounts.len() / 2 - initial_authorities.len()) as u32;
-	let mut contract_config = ContractConfig {
+	let mut contracts_config = ContractsConfig {
 		signed_claim_handicap: 2,
 		rent_byte_price: 4,
 		rent_deposit_offset: 1000,
@@ -288,7 +288,7 @@ pub fn testnet_genesis(
 		current_schedule: Default::default(),
 	};
 	// this should only be enabled on development chains
-	contract_config.current_schedule.enable_println = enable_println;
+	contracts_config.current_schedule.enable_println = enable_println;
 
 	GenesisConfig {
 		system: Some(SystemConfig {
@@ -349,7 +349,7 @@ pub fn testnet_genesis(
 			spend_period: 12 * 60 * 24,
 			burn: Permill::from_percent(50),
 		}),
-		contract: Some(contract_config),
+		contracts: Some(contracts_config),
 		sudo: Some(SudoConfig {
 			key: root_key,
 		}),
diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml
index 4d5c69b281..a5e5958f6a 100644
--- a/node/executor/Cargo.toml
+++ b/node/executor/Cargo.toml
@@ -27,7 +27,7 @@ staking = { package = "srml-staking", path = "../../srml/staking" }
 system = { package = "srml-system", path = "../../srml/system" }
 timestamp = { package = "srml-timestamp", path = "../../srml/timestamp" }
 treasury = { package = "srml-treasury", path = "../../srml/treasury" }
-contract = { package = "srml-contract", path = "../../srml/contract" }
+contracts = { package = "srml-contracts", path = "../../srml/contracts" }
 grandpa = { package = "srml-grandpa", path = "../../srml/grandpa" }
 indices = { package = "srml-indices", path = "../../srml/indices" }
 wabt = "~0.7.4"
diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs
index 4f0c38d884..1622e92c6d 100644
--- a/node/executor/src/lib.rs
+++ b/node/executor/src/lib.rs
@@ -23,7 +23,17 @@
 
 pub use substrate_executor::NativeExecutor;
 use substrate_executor::native_executor_instance;
-native_executor_instance!(pub Executor, node_runtime::api::dispatch, node_runtime::native_version, include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm"));
+
+// Declare an instance of the native executor named `Executor`. Include the wasm binary as the
+// equivalent wasm code.
+native_executor_instance!(
+	pub Executor,
+	node_runtime::api::dispatch,
+	node_runtime::native_version,
+	include_bytes!(
+		"../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm"
+	)
+);
 
 #[cfg(test)]
 mod tests {
@@ -39,8 +49,8 @@ mod tests {
 	use node_primitives::{Hash, BlockNumber, AccountId};
 	use runtime_primitives::traits::{Header as HeaderT, Hash as HashT};
 	use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill};
-	use {balances, indices, system, staking, timestamp, treasury, contract};
-	use contract::ContractAddressFor;
+	use {balances, indices, system, staking, timestamp, treasury, contracts};
+	use contracts::ContractAddressFor;
 	use system::{EventRecord, Phase};
 	use node_runtime::{Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances,
 		BuildStorage, GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, System,
@@ -48,8 +58,23 @@ mod tests {
 	use wabt;
 	use primitives::map;
 
-	const BLOATY_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.wasm");
-	const COMPACT_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm");
+	/// The wasm runtime code.
+	///
+	/// `compact` since it is after post-processing with wasm-gc which performs tree-shaking thus
+	/// making the binary slimmer. There is a convention to use compact version of the runtime
+	/// as canonical. This is why `native_executor_instance` also uses the compact version of the
+	/// runtime.
+	const COMPACT_CODE: &[u8] =
+		include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm");
+
+	/// The wasm runtime binary which hasn't undergone the compacting process.
+	///
+	/// The idea here is to pass it as the current runtime code to the executor so the executor will
+	/// have to execute provided wasm code instead of the native equivalent. This trick is used to
+	/// test code paths that differ between native and wasm versions.
+	const BLOATY_CODE: &[u8] =
+		include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.wasm");
+
 	const GENESIS_HASH: [u8; 32] = [69u8; 32];
 
 	type TestExternalities = CoreTestExternalities;
@@ -363,7 +388,7 @@ mod tests {
 			council_seats: Some(Default::default()),
 			timestamp: Some(Default::default()),
 			treasury: Some(Default::default()),
-			contract: Some(Default::default()),
+			contracts: Some(Default::default()),
 			sudo: Some(Default::default()),
 			grandpa: Some(GrandpaConfig {
 				_genesis_phantom_data: Default::default(),
@@ -751,10 +776,17 @@ mod tests {
 	)
 	;; Destination AccountId to transfer the funds.
 	;; Represented by H256 (32 bytes long) in little endian.
-	(data (i32.const 4) "\09\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\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\00")
+	(data (i32.const 4)
+		"\09\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\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\00"
+	)
 	;; Amount of value to transfer.
 	;; Represented by u128 (16 bytes long) in little endian.
-	(data (i32.const 36) "\06\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")
+	(data (i32.const 36)
+		"\06\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"
+	)
 )
 "#;
 
@@ -764,7 +796,7 @@ mod tests {
 		let transfer_code = wabt::wat2wasm(CODE_TRANSFER).unwrap();
 		let transfer_ch = ::Hashing::hash(&transfer_code);
 
-		let addr = ::DetermineContractAddress::contract_address_for(
+		let addr = ::DetermineContractAddress::contract_address_for(
 			&transfer_ch,
 			&[],
 			&charlie(),
@@ -781,20 +813,25 @@ mod tests {
 				},
 				CheckedExtrinsic {
 					signed: Some((charlie(), 0)),
-					function: Call::Contract(
-						contract::Call::put_code::(10_000, transfer_code)
+					function: Call::Contracts(
+						contracts::Call::put_code::(10_000, transfer_code)
 					),
 				},
 				CheckedExtrinsic {
 					signed: Some((charlie(), 1)),
-					function: Call::Contract(
-						contract::Call::create::(10, 10_000, transfer_ch, Vec::new())
+					function: Call::Contracts(
+						contracts::Call::create::(10, 10_000, transfer_ch, Vec::new())
 					),
 				},
 				CheckedExtrinsic {
 					signed: Some((charlie(), 2)),
-					function: Call::Contract(
-						contract::Call::call::(indices::address::Address::Id(addr.clone()), 10, 10_000, vec![0x00, 0x01, 0x02, 0x03])
+					function: Call::Contracts(
+						contracts::Call::call::(
+							indices::address::Address::Id(addr.clone()),
+							10,
+							10_000,
+							vec![0x00, 0x01, 0x02, 0x03]
+						)
 					),
 				},
 			]
@@ -807,7 +844,7 @@ 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::ContractInfoOf::::get(addr)
+				&contracts::ContractInfoOf::::get(addr)
 					.and_then(|c| c.get_alive())
 					.unwrap()
 					.code_hash,
@@ -861,8 +898,7 @@ mod tests {
 
 	#[test]
 	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![
+		let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![
 			blake2_256(&>::key_for(alice())).to_vec() => {
 				vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 			},
@@ -889,8 +925,7 @@ mod tests {
 
 	#[test]
 	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![
+		let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![
 			blake2_256(&>::key_for(alice())).to_vec() => {
 				vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 			},
diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml
index a87ce511cd..f1981a5852 100644
--- a/node/runtime/Cargo.toml
+++ b/node/runtime/Cargo.toml
@@ -17,7 +17,7 @@ version = { package = "sr-version", path = "../../core/sr-version", default-feat
 support = { package = "srml-support", path = "../../srml/support", default-features = false }
 aura = { package = "srml-aura", path = "../../srml/aura", default-features = false }
 balances = { package = "srml-balances", path = "../../srml/balances", default-features = false }
-contract = { package = "srml-contract", path = "../../srml/contract", default-features = false }
+contracts = { package = "srml-contracts", path = "../../srml/contracts", default-features = false }
 council = { package = "srml-council", path = "../../srml/council", default-features = false }
 democracy = { package = "srml-democracy", path = "../../srml/democracy", default-features = false }
 executive = { package = "srml-executive", path = "../../srml/executive", default-features = false }
@@ -39,7 +39,7 @@ substrate-keyring = { path = "../../core/keyring", optional = true }
 [features]
 default = ["std"]
 core = [
-	"contract/core",
+	"contracts/core",
 ]
 std = [
 	"parity-codec/std",
@@ -49,7 +49,7 @@ std = [
 	"support/std",
 	"aura/std",
 	"balances/std",
-	"contract/std",
+	"contracts/std",
 	"council/std",
 	"democracy/std",
 	"executive/std",
diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs
index 67a5b450a9..ec529696a8 100644
--- a/node/runtime/src/lib.rs
+++ b/node/runtime/src/lib.rs
@@ -58,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: 95,
-	impl_version: 95,
+	spec_version: 96,
+	impl_version: 96,
 	apis: RUNTIME_API_VERSIONS,
 };
 
@@ -112,7 +112,7 @@ impl indices::Trait for Runtime {
 
 impl balances::Trait for Runtime {
 	type Balance = Balance;
-	type OnFreeBalanceZero = ((Staking, Contract), Session);
+	type OnFreeBalanceZero = ((Staking, Contracts), Session);
 	type OnNewAccount = Indices;
 	type Event = Event;
 	type TransactionPayment = ();
@@ -217,14 +217,14 @@ impl treasury::Trait for Runtime {
 	type ProposalRejection = ();
 }
 
-impl contract::Trait for Runtime {
+impl contracts::Trait for Runtime {
 	type Currency = Balances;
 	type Call = Call;
 	type Event = Event;
 	type Gas = u64;
-	type DetermineContractAddress = contract::SimpleAddressDeterminator;
-	type ComputeDispatchFee = contract::DefaultDispatchFeeComputor;
-	type TrieIdGenerator = contract::TrieIdFromParentCounter;
+	type DetermineContractAddress = contracts::SimpleAddressDeterminator;
+	type ComputeDispatchFee = contracts::DefaultDispatchFeeComputor;
+	type TrieIdGenerator = contracts::TrieIdFromParentCounter;
 	type GasPayment = ();
 }
 
@@ -261,7 +261,7 @@ construct_runtime!(
 		FinalityTracker: finality_tracker::{Module, Call, Inherent},
 		Grandpa: grandpa::{Module, Call, Storage, Config, Event},
 		Treasury: treasury,
-		Contract: contract,
+		Contracts: contracts,
 		Sudo: sudo,
 	}
 );
diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock
index dcb7e8f26b..89c1bf9303 100644
--- a/node/runtime/wasm/Cargo.lock
+++ b/node/runtime/wasm/Cargo.lock
@@ -1484,7 +1484,7 @@ dependencies = [
  "sr-version 2.0.0",
  "srml-aura 2.0.0",
  "srml-balances 2.0.0",
- "srml-contract 2.0.0",
+ "srml-contracts 2.0.0",
  "srml-council 2.0.0",
  "srml-democracy 2.0.0",
  "srml-executive 2.0.0",
@@ -2443,7 +2443,7 @@ dependencies = [
 ]
 
 [[package]]
-name = "srml-contract"
+name = "srml-contracts"
 version = "2.0.0"
 dependencies = [
  "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/srml/contract/COMPLEXITY.md b/srml/contracts/COMPLEXITY.md
similarity index 100%
rename from srml/contract/COMPLEXITY.md
rename to srml/contracts/COMPLEXITY.md
diff --git a/srml/contract/Cargo.toml b/srml/contracts/Cargo.toml
similarity index 98%
rename from srml/contract/Cargo.toml
rename to srml/contracts/Cargo.toml
index 8d3507db35..08c44bf63a 100644
--- a/srml/contract/Cargo.toml
+++ b/srml/contracts/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "srml-contract"
+name = "srml-contracts"
 version = "2.0.0"
 authors = ["Parity Technologies "]
 edition = "2018"
diff --git a/srml/contract/src/account_db.rs b/srml/contracts/src/account_db.rs
similarity index 97%
rename from srml/contract/src/account_db.rs
rename to srml/contracts/src/account_db.rs
index 2421eab00a..80d5fbe3bb 100644
--- a/srml/contract/src/account_db.rs
+++ b/srml/contracts/src/account_db.rs
@@ -75,7 +75,12 @@ pub trait AccountDb {
 
 pub struct DirectAccountDb;
 impl AccountDb for DirectAccountDb {
-	fn get_storage(&self, _account: &T::AccountId, trie_id: Option<&TrieId>, location: &StorageKey) -> Option> {
+	fn get_storage(
+		&self,
+		_account: &T::AccountId,
+		trie_id: Option<&TrieId>,
+		location: &StorageKey
+	) -> Option> {
 		trie_id.and_then(|id| child::get_raw(id, &blake2_256(location)))
 	}
 	fn get_code_hash(&self, account: &T::AccountId) -> Option> {
@@ -240,7 +245,12 @@ impl<'a, T: Trait> OverlayAccountDb<'a, T> {
 }
 
 impl<'a, T: Trait> AccountDb for OverlayAccountDb<'a, T> {
-	fn get_storage(&self, account: &T::AccountId, trie_id: Option<&TrieId>, location: &StorageKey) -> Option> {
+	fn get_storage(
+		&self,
+		account: &T::AccountId,
+		trie_id: Option<&TrieId>,
+		location: &StorageKey
+	) -> Option> {
 		self.local
 			.borrow()
 			.get(account)
diff --git a/srml/contract/src/exec.rs b/srml/contracts/src/exec.rs
similarity index 100%
rename from srml/contract/src/exec.rs
rename to srml/contracts/src/exec.rs
diff --git a/srml/contract/src/gas.rs b/srml/contracts/src/gas.rs
similarity index 100%
rename from srml/contract/src/gas.rs
rename to srml/contracts/src/gas.rs
diff --git a/srml/contract/src/lib.rs b/srml/contracts/src/lib.rs
similarity index 100%
rename from srml/contract/src/lib.rs
rename to srml/contracts/src/lib.rs
diff --git a/srml/contract/src/rent.rs b/srml/contracts/src/rent.rs
similarity index 100%
rename from srml/contract/src/rent.rs
rename to srml/contracts/src/rent.rs
diff --git a/srml/contract/src/tests.rs b/srml/contracts/src/tests.rs
similarity index 100%
rename from srml/contract/src/tests.rs
rename to srml/contracts/src/tests.rs
diff --git a/srml/contract/src/wasm/code_cache.rs b/srml/contracts/src/wasm/code_cache.rs
similarity index 98%
rename from srml/contract/src/wasm/code_cache.rs
rename to srml/contracts/src/wasm/code_cache.rs
index da92272c38..30c02ef942 100644
--- a/srml/contract/src/wasm/code_cache.rs
+++ b/srml/contracts/src/wasm/code_cache.rs
@@ -19,7 +19,8 @@
 //! - In order to run contract code we need to instrument it with gas metering.
 //! To do that we need to provide the schedule which will supply exact gas costs values.
 //! We cache this code in the storage saving the schedule version.
-//! - Before running contract code we check if the cached code has the schedule version that is equal to the current saved schedule.
+//! - Before running contract code we check if the cached code has the schedule version that
+//! is equal to the current saved schedule.
 //! If it is equal then run the code, if it isn't reinstrument with the current schedule.
 //! - When we update the schedule we want it to have strictly greater version than the current saved one:
 //! this guarantees that every instrumented contract code in cache cannot have the version equal to the current one.
diff --git a/srml/contract/src/wasm/env_def/macros.rs b/srml/contracts/src/wasm/env_def/macros.rs
similarity index 100%
rename from srml/contract/src/wasm/env_def/macros.rs
rename to srml/contracts/src/wasm/env_def/macros.rs
diff --git a/srml/contract/src/wasm/env_def/mod.rs b/srml/contracts/src/wasm/env_def/mod.rs
similarity index 100%
rename from srml/contract/src/wasm/env_def/mod.rs
rename to srml/contracts/src/wasm/env_def/mod.rs
diff --git a/srml/contract/src/wasm/mod.rs b/srml/contracts/src/wasm/mod.rs
similarity index 99%
rename from srml/contract/src/wasm/mod.rs
rename to srml/contracts/src/wasm/mod.rs
index d86678d383..7dcd16d5da 100644
--- a/srml/contract/src/wasm/mod.rs
+++ b/srml/contracts/src/wasm/mod.rs
@@ -419,7 +419,10 @@ mod tests {
 	;; Input data to pass to the contract being created.
 	(data (i32.const 12) "\01\02\03\04")
 	;; Hash of code.
-	(data (i32.const 16) "\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11")
+	(data (i32.const 16)
+		"\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11"
+		"\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11"
+	)
 )
 "#;
 
@@ -569,7 +572,10 @@ mod tests {
 
 	(func (export "deploy"))
 
-	(data (i32.const 4) "\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11")
+	(data (i32.const 4)
+		"\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11"
+		"\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11"
+	)
 )
 "#;
 
diff --git a/srml/contract/src/wasm/prepare.rs b/srml/contracts/src/wasm/prepare.rs
similarity index 100%
rename from srml/contract/src/wasm/prepare.rs
rename to srml/contracts/src/wasm/prepare.rs
diff --git a/srml/contract/src/wasm/runtime.rs b/srml/contracts/src/wasm/runtime.rs
similarity index 100%
rename from srml/contract/src/wasm/runtime.rs
rename to srml/contracts/src/wasm/runtime.rs
-- 
GitLab


From 36c594d1af50f2db308fc2c4e02e329738984133 Mon Sep 17 00:00:00 2001
From: Svyatoslav Nikolsky 
Date: Wed, 19 Jun 2019 16:31:14 +0300
Subject: [PATCH 138/140] Do not return empty entries from state_queryStorage
 (#2906)

* do not return empty entries from state_queryStorage

* revert back None -> null change

* Revert "revert back None -> null change"

This reverts commit 318eb043e03b7aabbc3f176e02c15fd4595d16db.
---
 core/client/src/client.rs                     |  2 +
 core/rpc/src/state/mod.rs                     | 31 +++++++++----
 core/rpc/src/state/tests.rs                   | 46 ++++++++++---------
 .../client/src/block_builder_ext.rs           |  6 +++
 core/test-runtime/src/lib.rs                  |  2 +
 core/test-runtime/src/system.rs               |  9 ++++
 6 files changed, 65 insertions(+), 31 deletions(-)

diff --git a/core/client/src/client.rs b/core/client/src/client.rs
index b8969ed49e..3f3f1563b8 100644
--- a/core/client/src/client.rs
+++ b/core/client/src/client.rs
@@ -525,6 +525,8 @@ impl Client where
 
 	/// Get pairs of (block, extrinsic) where key has been changed at given blocks range.
 	/// Works only for runtimes that are supporting changes tries.
+	///
+	/// Changes are returned in descending order (i.e. last block comes first).
 	pub fn key_changes(
 		&self,
 		first: NumberFor,
diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs
index a229dad138..0b3b93885e 100644
--- a/core/rpc/src/state/mod.rs
+++ b/core/rpc/src/state/mod.rs
@@ -258,9 +258,9 @@ impl State where
 		&self,
 		range: &QueryStorageRange,
 		keys: &[StorageKey],
+		last_values: &mut HashMap>,
 		changes: &mut Vec>,
 	) -> Result<()> {
-		let mut last_state: HashMap<_, Option<_>> = Default::default();
 		for block in range.unfiltered_range.start..range.unfiltered_range.end {
 			let block_hash = range.hashes[block].clone();
 			let mut block_changes = StorageChangeSet { block: block_hash.clone(), changes: Vec::new() };
@@ -268,15 +268,19 @@ impl State where
 			for key in keys {
 				let (has_changed, data) = {
 					let curr_data = self.client.storage(&id, key)?;
-					let prev_data = last_state.get(key).and_then(|x| x.as_ref());
-					(curr_data.as_ref() != prev_data, curr_data)
+					match last_values.get(key) {
+						Some(prev_data) => (curr_data != *prev_data, curr_data),
+						None => (true, curr_data),
+					}
 				};
 				if has_changed {
 					block_changes.changes.push((key.clone(), data.clone()));
 				}
-				last_state.insert(key.clone(), data);
+				last_values.insert(key.clone(), data);
+			}
+			if !block_changes.changes.is_empty() {
+				changes.push(block_changes);
 			}
-			changes.push(block_changes);
 		}
 		Ok(())
 	}
@@ -286,6 +290,7 @@ impl State where
 		&self,
 		range: &QueryStorageRange,
 		keys: &[StorageKey],
+		last_values: &HashMap>,
 		changes: &mut Vec>,
 	) -> Result<()> {
 		let (begin, end) = match range.filtered_range {
@@ -298,17 +303,24 @@ impl State where
 		let mut changes_map: BTreeMap, StorageChangeSet> = BTreeMap::new();
 		for key in keys {
 			let mut last_block = None;
-			for (block, _) in self.client.key_changes(begin, end, key)? {
+			let mut last_value = last_values.get(key).cloned().unwrap_or_default();
+			for (block, _) in self.client.key_changes(begin, end, key)?.into_iter().rev() {
 				if last_block == Some(block) {
 					continue;
 				}
+
 				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)?;
+				if last_value == value_at_block {
+					continue;
+				}
+
 				changes_map.entry(block)
 					.or_insert_with(|| StorageChangeSet { block: block_hash, changes: Vec::new() })
-					.changes.push((key.clone(), value_at_block));
+					.changes.push((key.clone(), value_at_block.clone()));
 				last_block = Some(block);
+				last_value = value_at_block;
 			}
 		}
 		if let Some(additional_capacity) = changes_map.len().checked_sub(changes.len()) {
@@ -432,8 +444,9 @@ impl StateApi for State where
 	) -> Result>> {
 		let range = self.split_query_storage_range(from, to)?;
 		let mut changes = Vec::new();
-		self.query_storage_unfiltered(&range, &keys, &mut changes)?;
-		self.query_storage_filtered(&range, &keys, &mut changes)?;
+		let mut last_values = HashMap::new();
+		self.query_storage_unfiltered(&range, &keys, &mut last_values, &mut changes)?;
+		self.query_storage_filtered(&range, &keys, &last_values, &mut changes)?;
 		Ok(changes)
 	}
 
diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs
index 1c8f1ef9d8..f8cb194513 100644
--- a/core/rpc/src/state/tests.rs
+++ b/core/rpc/src/state/tests.rs
@@ -167,12 +167,16 @@ fn should_query_storage() {
 
 		let add_block = |nonce| {
 			let mut builder = client.new_block(Default::default()).unwrap();
-			builder.push_transfer(runtime::Transfer {
-				from: AccountKeyring::Alice.into(),
-				to: AccountKeyring::Ferdie.into(),
-				amount: 42,
-				nonce,
-			}).unwrap();
+			// fake change: None -> None -> None
+			builder.push_storage_change(vec![1], None).unwrap();
+			// fake change: None -> Some(value) -> Some(value)
+			builder.push_storage_change(vec![2], Some(vec![2])).unwrap();
+			// actual change: None -> Some(value) -> None
+			builder.push_storage_change(vec![3], if nonce == 0 { Some(vec![3]) } else { None }).unwrap();
+			// actual change: None -> Some(value)
+			builder.push_storage_change(vec![4], if nonce == 0 { None } else { Some(vec![4]) }).unwrap();
+			// actual change: Some(value1) -> Some(value2)
+			builder.push_storage_change(vec![5], Some(vec![nonce as u8])).unwrap();
 			let block = builder.bake().unwrap();
 			let hash = block.header.hash();
 			client.import(BlockOrigin::Own, block).unwrap();
@@ -182,32 +186,31 @@ fn should_query_storage() {
 		let block2_hash = add_block(1);
 		let genesis_hash = client.genesis_hash();
 
-		let alice_balance_key = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Alice.into()));
-
 		let mut expected = vec![
 			StorageChangeSet {
 				block: genesis_hash,
 				changes: vec![
-					(
-						StorageKey(alice_balance_key.to_vec()),
-						Some(StorageData(vec![232, 3, 0, 0, 0, 0, 0, 0]))
-					),
+					(StorageKey(vec![1]), None),
+					(StorageKey(vec![2]), None),
+					(StorageKey(vec![3]), None),
+					(StorageKey(vec![4]), None),
+					(StorageKey(vec![5]), None),
 				],
 			},
 			StorageChangeSet {
 				block: block1_hash,
 				changes: vec![
-					(
-						StorageKey(alice_balance_key.to_vec()),
-						Some(StorageData(vec![190, 3, 0, 0, 0, 0, 0, 0]))
-					),
+					(StorageKey(vec![2]), Some(StorageData(vec![2]))),
+					(StorageKey(vec![3]), Some(StorageData(vec![3]))),
+					(StorageKey(vec![5]), Some(StorageData(vec![0]))),
 				],
 			},
 		];
 
 		// Query changes only up to block1
+		let keys = (1..6).map(|k| StorageKey(vec![k])).collect::>();
 		let result = api.query_storage(
-			vec![StorageKey(alice_balance_key.to_vec())],
+			keys.clone(),
 			genesis_hash,
 			Some(block1_hash).into(),
 		);
@@ -216,7 +219,7 @@ fn should_query_storage() {
 
 		// Query all changes
 		let result = api.query_storage(
-			vec![StorageKey(alice_balance_key.to_vec())],
+			keys.clone(),
 			genesis_hash,
 			None.into(),
 		);
@@ -224,10 +227,9 @@ fn should_query_storage() {
 		expected.push(StorageChangeSet {
 			block: block2_hash,
 			changes: vec![
-				(
-					StorageKey(alice_balance_key.to_vec()),
-					Some(StorageData(vec![148, 3, 0, 0, 0, 0, 0, 0]))
-				),
+				(StorageKey(vec![3]), None),
+				(StorageKey(vec![4]), Some(StorageData(vec![4]))),
+				(StorageKey(vec![5]), Some(StorageData(vec![1]))),
 			],
 		});
 		assert_eq!(result.unwrap(), expected);
diff --git a/core/test-runtime/client/src/block_builder_ext.rs b/core/test-runtime/client/src/block_builder_ext.rs
index ae95ecd7ab..9b7d343f02 100644
--- a/core/test-runtime/client/src/block_builder_ext.rs
+++ b/core/test-runtime/client/src/block_builder_ext.rs
@@ -25,6 +25,8 @@ use generic_test_client::client::block_builder::api::BlockBuilder;
 pub trait BlockBuilderExt {
 	/// Add transfer extrinsic to the block.
 	fn push_transfer(&mut self, transfer: runtime::Transfer) -> Result<(), client::error::Error>;
+	/// Add storage change extrinsic to the block.
+	fn push_storage_change(&mut self, key: Vec, value: Option>) -> Result<(), client::error::Error>;
 }
 
 impl<'a, A> BlockBuilderExt for client::block_builder::BlockBuilder<'a, runtime::Block, A> where
@@ -34,4 +36,8 @@ impl<'a, A> BlockBuilderExt for client::block_builder::BlockBuilder<'a, runtime:
 	fn push_transfer(&mut self, transfer: runtime::Transfer) -> Result<(), client::error::Error> {
 		self.push(transfer.into_signed_tx())
 	}
+
+	fn push_storage_change(&mut self, key: Vec, value: Option>) -> Result<(), client::error::Error> {
+		self.push(runtime::Extrinsic::StorageChange(key, value))
+	}
 }
diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs
index ce9758da4e..7a68439a07 100644
--- a/core/test-runtime/src/lib.rs
+++ b/core/test-runtime/src/lib.rs
@@ -106,6 +106,7 @@ pub enum Extrinsic {
 	AuthoritiesChange(Vec),
 	Transfer(Transfer, AccountSignature),
 	IncludeData(Vec),
+	StorageChange(Vec, Option>),
 }
 
 #[cfg(feature = "std")]
@@ -129,6 +130,7 @@ impl BlindCheckable for Extrinsic {
 				}
 			},
 			Extrinsic::IncludeData(_) => Err(runtime_primitives::BAD_SIGNATURE),
+			Extrinsic::StorageChange(key, value) => Ok(Extrinsic::StorageChange(key, value)),
 		}
 	}
 }
diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs
index d150a573e8..267d322e87 100644
--- a/core/test-runtime/src/system.rs
+++ b/core/test-runtime/src/system.rs
@@ -238,6 +238,7 @@ fn execute_transaction_backend(utx: &Extrinsic) -> ApplyResult {
 		Extrinsic::Transfer(ref transfer, _) => execute_transfer_backend(transfer),
 		Extrinsic::AuthoritiesChange(ref new_auth) => execute_new_authorities_backend(new_auth),
 		Extrinsic::IncludeData(_) => Ok(ApplyOutcome::Success),
+		Extrinsic::StorageChange(key, value) => execute_storage_change(key, value.as_ref().map(|v| &**v)),
 	}
 }
 
@@ -273,6 +274,14 @@ fn execute_new_authorities_backend(new_authorities: &[AuthorityId]) -> ApplyResu
 	Ok(ApplyOutcome::Success)
 }
 
+fn execute_storage_change(key: &[u8], value: Option<&[u8]>) -> ApplyResult {
+	match value {
+		Some(value) => storage::unhashed::put_raw(key, value),
+		None => storage::unhashed::kill(key),
+	}
+	Ok(ApplyOutcome::Success)
+}
+
 #[cfg(feature = "std")]
 fn info_expect_equal_hash(given: &Hash, expected: &Hash) {
 	use primitives::hexdisplay::HexDisplay;
-- 
GitLab


From da75187a1ea3fc628e26e5a60b277013b252984c Mon Sep 17 00:00:00 2001
From: Pierre Krieger 
Date: Wed, 19 Jun 2019 15:36:58 +0200
Subject: [PATCH 139/140] Add support for noise (#2613)

---
 core/network/src/transport.rs | 64 +++++++++++++++++++++++++++++------
 1 file changed, 54 insertions(+), 10 deletions(-)

diff --git a/core/network/src/transport.rs b/core/network/src/transport.rs
index f6790c98f4..ac6cc633a8 100644
--- a/core/network/src/transport.rs
+++ b/core/network/src/transport.rs
@@ -20,7 +20,9 @@ use libp2p::{
 	mplex, identity, secio, yamux, bandwidth, wasm_ext
 };
 #[cfg(not(target_os = "unknown"))]
-use libp2p::{tcp, dns, websocket};
+use libp2p::{tcp, dns, websocket, noise};
+#[cfg(not(target_os = "unknown"))]
+use libp2p::core::{upgrade, either::EitherError, either::EitherOutput};
 use libp2p::core::{self, transport::boxed::Boxed, transport::OptionalTransport, muxing::StreamMuxerBox};
 use std::{io, sync::Arc, time::Duration, usize};
 
@@ -34,16 +36,32 @@ pub fn build_transport(
 	keypair: identity::Keypair,
 	wasm_external_transport: Option
 ) -> (Boxed<(PeerId, StreamMuxerBox), io::Error>, Arc) {
+	// Build configuration objects for encryption mechanisms.
+	#[cfg(not(target_os = "unknown"))]
+	let noise_config = {
+		let noise_keypair = noise::Keypair::new().into_authentic(&keypair)
+			// For more information about this panic, see in "On the Importance of Checking
+			// Cryptographic Protocols for Faults" by Dan Boneh, Richard A. DeMillo,
+			// and Richard J. Lipton.
+			.expect("can only fail in case of a hardware bug; since this signing is performed only \
+				once and at initialization, we're taking the bet that the inconvenience of a very \
+				rare panic here is basically zero");
+		noise::NoiseConfig::ix(noise_keypair)
+	};
+	let secio_config = secio::SecioConfig::new(keypair);
+
+	// Build configuration objects for multiplexing mechanisms.
 	let mut mplex_config = mplex::MplexConfig::new();
 	mplex_config.max_buffer_len_behaviour(mplex::MaxBufferBehaviour::Block);
 	mplex_config.max_buffer_len(usize::MAX);
+	let yamux_config = yamux::Config::default();
 
+	// Build the base layer of the transport.
 	let transport = if let Some(t) = wasm_external_transport {
 		OptionalTransport::some(t)
 	} else {
 		OptionalTransport::none()
 	};
-
 	#[cfg(not(target_os = "unknown"))]
 	let transport = {
 		let desktop_trans = tcp::TcpConfig::new();
@@ -51,22 +69,48 @@ pub fn build_transport(
 			.or_transport(desktop_trans);
 		transport.or_transport(dns::DnsConfig::new(desktop_trans))
 	};
-
 	let (transport, sinks) = bandwidth::BandwidthLogging::new(transport, Duration::from_secs(5));
 
-	// TODO: rework the transport creation (https://github.com/libp2p/rust-libp2p/issues/783)
-	let transport = transport
-		.with_upgrade(secio::SecioConfig::new(keypair))
-		.and_then(move |out, endpoint| {
-			let peer_id = out.remote_key.into_peer_id();
+	// Encryption
+
+	// For non-WASM, we support both secio and noise.
+	#[cfg(not(target_os = "unknown"))]
+	let transport = transport.and_then(move |stream, endpoint| {
+		let upgrade = core::upgrade::SelectUpgrade::new(noise_config, secio_config);
+		core::upgrade::apply(stream, upgrade, endpoint)
+			.and_then(|out| match out {
+				// We negotiated noise
+				EitherOutput::First((remote_id, out)) => {
+					let remote_key = match remote_id {
+						noise::RemoteIdentity::IdentityKey(key) => key,
+						_ => return Err(upgrade::UpgradeError::Apply(EitherError::A(noise::NoiseError::InvalidKey)))
+					};
+					Ok((EitherOutput::First(out), remote_key.into_peer_id()))
+				}
+				// We negotiated secio
+				EitherOutput::Second(out) =>
+					Ok((EitherOutput::Second(out.stream), out.remote_key.into_peer_id()))
+			})
+	});
+
+	// For WASM, we only support secio for now.
+	#[cfg(target_os = "unknown")]
+	let transport = transport.and_then(move |stream, endpoint| {
+		core::upgrade::apply(stream, secio_config, endpoint)
+			.and_then(|out| Ok((out.stream, out.remote_key.into_peer_id())))
+	});
+
+	// Multiplexing
+	let transport = transport.and_then(move |(stream, peer_id), endpoint| {
 			let peer_id2 = peer_id.clone();
-			let upgrade = core::upgrade::SelectUpgrade::new(yamux::Config::default(), mplex_config)
+			let upgrade = core::upgrade::SelectUpgrade::new(yamux_config, mplex_config)
 				.map_inbound(move |muxer| (peer_id, muxer))
 				.map_outbound(move |muxer| (peer_id2, muxer));
 
-			core::upgrade::apply(out.stream, upgrade, endpoint)
+			core::upgrade::apply(stream, upgrade, endpoint)
 				.map(|(id, muxer)| (id, core::muxing::StreamMuxerBox::new(muxer)))
 		})
+
 		.with_timeout(Duration::from_secs(20))
 		.map_err(|err| io::Error::new(io::ErrorKind::Other, err))
 		.boxed();
-- 
GitLab


From a6f8d3dd8815de76e1d9a9a12f48087414061bcb Mon Sep 17 00:00:00 2001
From: Pierre Krieger 
Date: Wed, 19 Jun 2019 15:41:35 +0200
Subject: [PATCH 140/140] Remove on_connect from TelemetryConfig (#2888)

---
 core/service/src/lib.rs   | 13 +++++++----
 core/telemetry/src/lib.rs | 48 +++++++++++++++++++--------------------
 2 files changed, 33 insertions(+), 28 deletions(-)

diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs
index 644341f91a..6de8070830 100644
--- a/core/service/src/lib.rs
+++ b/core/service/src/lib.rs
@@ -416,7 +416,12 @@ impl Service {
 			let telemetry = tel::init_telemetry(tel::TelemetryConfig {
 				endpoints,
 				wasm_external_transport: None,
-				on_connect: Box::new(move || {
+			});
+			let future = telemetry.clone()
+				.for_each(move |event| {
+					// Safe-guard in case we add more events in the future.
+					let tel::TelemetryEvent::Connected = event;
+
 					telemetry!(SUBSTRATE_INFO; "system.connected";
 						"name" => name.clone(),
 						"implementation" => impl_name.clone(),
@@ -431,9 +436,9 @@ impl Service {
 					telemetry_connection_sinks_.lock().retain(|sink| {
 						sink.unbounded_send(()).is_ok()
 					});
-				}),
-			});
-			task_executor.spawn(telemetry.clone()
+					Ok(())
+				});
+			task_executor.spawn(future
 				.select(exit.clone())
 				.then(|_| Ok(())));
 			telemetry
diff --git a/core/telemetry/src/lib.rs b/core/telemetry/src/lib.rs
index d17dd43169..b9d9954851 100644
--- a/core/telemetry/src/lib.rs
+++ b/core/telemetry/src/lib.rs
@@ -25,26 +25,30 @@
 //! the moment. Substate may eventually be reworked to get proper `slog` support, including sending
 //! information to the telemetry.
 //!
-//! The `Telemetry` struct implements `Future` and must be polled regularly (or sent to a
+//! The [`Telemetry`] struct implements `Stream` and must be polled regularly (or sent to a
 //! background thread/task) in order for the telemetry to properly function. Dropping the object
 //! will also deregister the global logger and replace it with a logger that discards messages.
+//! The `Stream` generates [`TelemetryEvent`]s.
+//!
+//! > **Note**: Cloning the [`Telemetry`] and polling from multiple clones has an unspecified behaviour.
 //!
 //! # Example
 //!
 //! ```no_run
+//! use futures::prelude::*;
+//!
 //! let telemetry = substrate_telemetry::init_telemetry(substrate_telemetry::TelemetryConfig {
 //! 	endpoints: substrate_telemetry::TelemetryEndpoints::new(vec![
 //! 		// The `0` is the maximum verbosity level of messages to send to this endpoint.
 //! 		("wss://example.com".into(), 0)
 //! 	]),
-//! 	on_connect: Box::new(|| {}),
 //! 	// Can be used to pass an external implementation of WebSockets.
 //! 	wasm_external_transport: None,
 //! });
 //!
-//! // The `telemetry` object implements `Future` and must be processed.
+//! // The `telemetry` object implements `Stream` and must be processed.
 //! std::thread::spawn(move || {
-//! 	tokio::run(telemetry);
+//! 	tokio::run(telemetry.for_each(|_| Ok(())));
 //! });
 //!
 //! // Sends a message on the telemetry.
@@ -56,7 +60,7 @@
 
 use futures::{prelude::*, task::AtomicTask};
 use libp2p::{Multiaddr, wasm_ext};
-use log::{trace, warn};
+use log::warn;
 use parking_lot::Mutex;
 use serde::{Serialize, Deserialize};
 use std::sync::{Arc, Weak};
@@ -72,12 +76,6 @@ pub struct TelemetryConfig {
 	/// Collection of telemetry WebSocket servers with a corresponding verbosity level.
 	pub endpoints: TelemetryEndpoints,
 
-	/// What to do when we connect to a server.
-	///
-	/// This closure is executed each time we connect to a telemetry endpoint, either for the first
-	/// time or after being disconnected.
-	pub on_connect: Box,
-
 	/// Optional external implementation of a libp2p transport. Used in WASM contexts where we need
 	/// some binding between the networking provided by the operating system or environment and
 	/// libp2p.
@@ -133,8 +131,6 @@ pub struct Telemetry {
 struct TelemetryInner {
 	/// Worker for the telemetry.
 	worker: Mutex,
-	/// Same field as in the configuration. Called when we connected to an endpoint.
-	on_connect: Box,
 	/// Task to wake up when we add a log entry to the worker.
 	polling_task: AtomicTask,
 }
@@ -160,7 +156,6 @@ pub fn init_telemetry(config: TelemetryConfig) -> Telemetry {
 
 	let inner = Arc::new(TelemetryInner {
 		worker: Mutex::new(worker::TelemetryWorker::new(endpoints, config.wasm_external_transport)),
-		on_connect: config.on_connect,
 		polling_task: AtomicTask::new(),
 	});
 
@@ -176,11 +171,19 @@ pub fn init_telemetry(config: TelemetryConfig) -> Telemetry {
 	}
 }
 
-impl Future for Telemetry {
-	type Item = ();
+/// Event generated when polling the worker.
+#[derive(Debug)]
+pub enum TelemetryEvent {
+	/// We have established a connection to one of the telemetry endpoint, either for the first
+	/// time or after having been disconnected earlier.
+	Connected,
+}
+
+impl Stream for Telemetry {
+	type Item = TelemetryEvent;
 	type Error = ();
 
-	fn poll(&mut self) -> Poll<(), ()> {
+	fn poll(&mut self) -> Poll, Self::Error> {
 		let before = Instant::now();
 
 		let mut has_connected = false;
@@ -195,15 +198,12 @@ impl Future for Telemetry {
 			warn!(target: "telemetry", "Polling the telemetry took more than 200ms");
 		}
 
-		// We use an intermediary variable `has_connected` so that the lock is released when we
-		// call `on_connect`.
 		if has_connected {
-			trace!(target: "telemetry", "Running on_connect handlers");
-			(self.inner.on_connect)();
+			Ok(Async::Ready(Some(TelemetryEvent::Connected)))
+		} else {
+			self.inner.polling_task.register();
+			Ok(Async::NotReady)
 		}
-
-		self.inner.polling_task.register();
-		Ok(Async::NotReady)
 	}
 }
 
-- 
GitLab